1. 下载hadoop源码并编译

① 下载Hadoop2.7.2源码。
下载地址: https://archive.apache.org/dist/hadoop/core/hadoop-2.7.2/ ,选择hadoop-2.7.2-src.tar.gz, 点击下载。
对下载好的压缩包,使用如下命令进行解压缩:

$ sudo tar -zxvf hadoop-2.7.2-src.tar.gz

将解压缩的源码包,复制到/usr/local目录下:

$ sudo cp -rf hadoop-2.7.2-src /usr/lcoal

② 根据hadoop-2.7.2-srcBUILDING.txt中的要求,配置好编译环境。

      可以参考另一篇博文hadoop源码编译环境配置

③ 编译Hadoop2.7.2源码
进入/usr/local/hadoop-2.7.2-src进行源码编译,编译命令如下:

$ mvn clean package -Pdist,native -DskipTests -Dtar

编译成功,信息显示如下(后面部分,不完整):

IDEA libraries导入hadoop_apache

2. 配置IntelliJ IDEA2018的maven环境

① maven路径配置

(1)未打开项目,通过configure–>Settings打开;如果已经打开了项目,可以通过File–>Settings打开,如图:

IDEA libraries导入hadoop_apache_02


(2)在搜索框中输入maven,选择左侧Maven选项,在Maven home directory:中,选择自己刚刚配置好的maven home路径:

IDEA libraries导入hadoop_ide_03


User setting file:中,选择刚刚配置好的,本机的settings.xml文件:

IDEA libraries导入hadoop_hadoop_04


下面的Local repository:,idea会自动检测,如上图所示。

② maven的JDK配置

选择左侧Importing选项,设置JDK for importer,改为刚刚安装的jdk home路径(也可以忽略这一步):

IDEA libraries导入hadoop_apache_05

3. 以maven方式导入编译好的hadoop源码:

(1)选择Import Project,导入已经存在的hadoop项目:

IDEA libraries导入hadoop_apache_06


(2)选择编译好的hadoop源码(自己这里叫hadoop-plugin),点击OK:

IDEA libraries导入hadoop_apache_07


(3)在Import project from external model中选择Maven(一般idea已经自动选择好了),点击OK:

IDEA libraries导入hadoop_ide_08


(4)接下来的窗口中,不需要选择任何选项,直接点击Next:

IDEA libraries导入hadoop_hadoop_09


(5)接下来的窗口中,不需要选择任何选项,直接点击Next:

IDEA libraries导入hadoop_ide_10


(6)接下来的窗口中,org.apache.hadoop:hadoop-main:2.7.2已经被选中,直接点击Next:

IDEA libraries导入hadoop_intellij  idea_11


(7)选择配置好的JDK版本(Name)以及路径(JDK home path),点击Next:

IDEA libraries导入hadoop_hadoop_12


(8)首先检查文件路径是否正确,再点击Finish:

IDEA libraries导入hadoop_hadoop_13


等待idea自己完成导入,就已经OK了。

4. 开启hadoop伪分布式环境:

hadoop分布式环境需要Namenode、Datanode、Resourcemanager、Nodemanager四个基本进程,通过找到Namenode.javaDatanode.javaResourcemanager.javaNodemanager.java中的main()函数,开启hadoop伪分布式环境。

① 开启Namenode进程

(1)通过快捷键Ctrl+N,搜索namenode,找到位于包org.apache.hadoop.hdfs.server.namenode中的NameNode类,点击打开:

IDEA libraries导入hadoop_hadoop_14


(2)在代码框中,右键选择Debug 'NameNode.main()',通过debug的方式开启Namenode进程:

build完成后报错如下:

IDEA libraries导入hadoop_intellij  idea_15


解决方法: 这是因为不同模块之间的依赖未添加,找不到的类,属于hadoop-common模块。

  • 点击菜单File-->Project structure,在左侧栏选择Module,在中间的列表中选择hadoop-hdfs,在中上位置的tab中,选择Dependencies。在中间的依赖列表中,找到hadoop-common,将其scope更改为Provided
  • IDEA libraries导入hadoop_apache_16

  • 勾选hadoop-common,点击Apply,发现弹出错误:
  • IDEA libraries导入hadoop_intellij  idea_17

  • 重新在中间栏找到hadoop-streaming,选择Source,点击最右边的/../conf后面的x,在弹出的窗口中点击Yes:
  • IDEA libraries导入hadoop_ide_18

  • 再重新回到hadoop-hdfs,重新勾选hadoop-common点击Apply,再点击OK即可。
  • 再点击菜单栏Run-->Edit configuration,在出现的窗口中,勾选Include dependencies with 'Provided' scope,点击OK,重新以debug方式运行NameNode.main()
  • IDEA libraries导入hadoop_apache_19

  • (3)重新运行以后,发现NameNode进程启动成功,但是自动退出。这是因为首次运行NameNode,需要进行格式化(format):
  • IDEA libraries导入hadoop_intellij  idea_20

  • 解决方法: 点击菜单栏Run-->Edit configuration,在出现的窗口中,在Program arguments处添加-format,点击OK,再重新debug运行:
  • IDEA libraries导入hadoop_intellij  idea_21

  • debug运行的结果如下,因为我这里已经格式化过,所以需要我自己决定是否重新格式化:
  • IDEA libraries导入hadoop_ide_22

  • (4)点击菜单栏Run-->Edit configuration,在出现的窗口中,在Program arguments处去除刚刚添加的-format,点击OK,再重新debug运行。发现NameNode进程还是启动成功,但是又自动退出:

解决方法: 找到hadoop-hdfs-->src-->main,右键单击,选择Mark Directory as-->Source root,设置好后,main目录文件夹图标变成下图所示:

IDEA libraries导入hadoop_intellij  idea_23


(5)重新debug运行,发现NameNode进程启动成功,并未退出!

IDEA libraries导入hadoop_apache_24


② 开启Datanode进程

(1)通过快捷键Ctrl+N,搜索datanode,找到位于包org.apache.hadoop.hdfs.server.datanode中的DataNode类,点击打开:

IDEA libraries导入hadoop_apache_25

(2)在代码框中,右键选择Debug 'DataNode.main()',通过debug的方式开启DataNode进程:

build报错如下:

IDEA libraries导入hadoop_hadoop_26


解决方法: 点击菜单栏Run-->Edit configuration,在出现的窗口中,勾选Include dependencies with 'Provided' scope,点击OK,重新以debug方式运行DataNode.main()

IDEA libraries导入hadoop_apache_27


(3)由于自己已经格式化过namenode,再次格式化namenode之前,之前应该删除/tmp目录下的所有文件,我的是/tmp/hadoop-lucy

原因: 当我们执行文件系统格式化时,会在namenode数据文件夹(即配置文件中dfs.name.dir在本地系统的路径)中保存一个current/VERSION文件,记录namespaceID,标志了所有格式化的namenode版本。如果我们频繁的格式化namenode,那么datanode中保存(即dfs.data.dir在本地系统的路径)的current/VERSION文件只是你地第一次格式化时保存的namenode的ID,因此就会造成namenode和datanode之间的ID不一致。③ 开启ResourceManager进程

(1)通过快捷键Ctrl+N,搜索resourcemanager,找到位于包org.apache.hadoop.yarn.server.resourcemanager中的ResourceManager类,点击打开:

IDEA libraries导入hadoop_hadoop_28

(2)在代码框中,右键选择Debug 'ResourceManager.main()',通过debug的方式开启ResourceManager进程:

build报错如下:

IDEA libraries导入hadoop_hadoop_29


解决方法: 点击菜单栏Run-->Edit configuration,在出现的窗口中,勾选Include dependencies with 'Provided' scope,点击OK,重新以debug方式运行ResourceManager.main()

IDEA libraries导入hadoop_hadoop_30

④ 开启NodeManager进程

(1)通过快捷键Ctrl+N,搜索nodemanager,找到位于包org.apache.hadoop.yarn.server.nodemanager中的NodeManager类,点击打开:

IDEA libraries导入hadoop_ide_31


(2)在代码框中,右键选择Debug 'NodeManager.main()',通过debug的方式开启NodeManager进程:

build报错如下:

IDEA libraries导入hadoop_apache_32


解决方法: 点击菜单栏Run-->Edit configuration,在出现的窗口中,勾选Include dependencies with 'Provided' scope,点击OK,重新以debug方式运行NodeManager.main()

IDEA libraries导入hadoop_ide_33