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-src
中BUILDING.txt
中的要求,配置好编译环境。
可以参考另一篇博文hadoop源码编译环境配置
③ 编译Hadoop2.7.2源码
进入/usr/local/hadoop-2.7.2-src
进行源码编译,编译命令如下:
$ mvn clean package -Pdist,native -DskipTests -Dtar
编译成功,信息显示如下(后面部分,不完整):
2. 配置IntelliJ IDEA2018的maven环境
① maven路径配置
(1)未打开项目,通过configure–>Settings
打开;如果已经打开了项目,可以通过File–>Settings
打开,如图:
(2)在搜索框中输入maven
,选择左侧Maven
选项,在Maven home directory:
中,选择自己刚刚配置好的maven home路径:
在User setting file:
中,选择刚刚配置好的,本机的settings.xml文件:
下面的Local repository:
,idea会自动检测,如上图所示。
② maven的JDK配置
选择左侧Importing
选项,设置JDK for importer
,改为刚刚安装的jdk home路径(也可以忽略这一步):
3. 以maven方式导入编译好的hadoop源码:
(1)选择Import Project
,导入已经存在的hadoop项目:
(2)选择编译好的hadoop源码(自己这里叫hadoop-plugin
),点击OK:
(3)在Import project from external model
中选择Maven
(一般idea已经自动选择好了),点击OK:
(4)接下来的窗口中,不需要选择任何选项,直接点击Next:
(5)接下来的窗口中,不需要选择任何选项,直接点击Next:
(6)接下来的窗口中,org.apache.hadoop:hadoop-main:2.7.2
已经被选中,直接点击Next:
(7)选择配置好的JDK版本(Name
)以及路径(JDK home path
),点击Next:
(8)首先检查文件路径是否正确,再点击Finish:
等待idea自己完成导入,就已经OK了。
4. 开启hadoop伪分布式环境:
hadoop分布式环境需要Namenode、Datanode、Resourcemanager、Nodemanager四个基本进程,通过找到Namenode.java
、Datanode.java
、Resourcemanager.java
、Nodemanager.java
中的main()
函数,开启hadoop伪分布式环境。
① 开启Namenode进程
(1)通过快捷键Ctrl+N
,搜索namenode
,找到位于包org.apache.hadoop.hdfs.server.namenode
中的NameNode类,点击打开:
(2)在代码框中,右键选择Debug 'NameNode.main()'
,通过debug的方式开启Namenode进程:
build完成后报错如下:
解决方法: 这是因为不同模块之间的依赖未添加,找不到的类,属于hadoop-common模块。
- 点击菜单
File-->Project structure
,在左侧栏选择Module
,在中间的列表中选择hadoop-hdfs
,在中上位置的tab中,选择Dependencies
。在中间的依赖列表中,找到hadoop-common
,将其scope更改为Provided
: - 勾选
hadoop-common
,点击Apply,发现弹出错误: - 重新在中间栏找到
hadoop-streaming
,选择Source
,点击最右边的/../conf
后面的x,在弹出的窗口中点击Yes: - 再重新回到
hadoop-hdfs
,重新勾选hadoop-common
点击Apply,再点击OK即可。 - 再点击菜单栏
Run-->Edit configuration
,在出现的窗口中,勾选Include dependencies with 'Provided' scope
,点击OK,重新以debug方式运行NameNode.main()
: - (3)重新运行以后,发现NameNode进程启动成功,但是自动退出。这是因为首次运行NameNode,需要进行格式化(format):
- 解决方法: 点击菜单栏
Run-->Edit configuration
,在出现的窗口中,在Program arguments
处添加-format
,点击OK,再重新debug运行: - debug运行的结果如下,因为我这里已经格式化过,所以需要我自己决定是否重新格式化:
- (4)点击菜单栏
Run-->Edit configuration
,在出现的窗口中,在Program arguments
处去除刚刚添加的-format
,点击OK,再重新debug运行。发现NameNode进程还是启动成功,但是又自动退出:
解决方法: 找到hadoop-hdfs-->src-->main
,右键单击,选择Mark Directory as-->Source root
,设置好后,main目录文件夹图标变成下图所示:
(5)重新debug运行,发现NameNode进程启动成功,并未退出!
② 开启Datanode进程
(1)通过快捷键Ctrl+N
,搜索datanode
,找到位于包org.apache.hadoop.hdfs.server.datanode
中的DataNode类,点击打开:
(2)在代码框中,右键选择Debug 'DataNode.main()'
,通过debug的方式开启DataNode进程:
build报错如下:
解决方法: 点击菜单栏Run-->Edit configuration
,在出现的窗口中,勾选Include dependencies with 'Provided' scope
,点击OK,重新以debug方式运行DataNode.main()
:
(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类,点击打开:
(2)在代码框中,右键选择Debug 'ResourceManager.main()'
,通过debug的方式开启ResourceManager进程:
build报错如下:
解决方法: 点击菜单栏Run-->Edit configuration
,在出现的窗口中,勾选Include dependencies with 'Provided' scope
,点击OK,重新以debug方式运行ResourceManager.main()
:
④ 开启NodeManager进程
(1)通过快捷键Ctrl+N
,搜索nodemanager
,找到位于包org.apache.hadoop.yarn.server.nodemanager
中的NodeManager类,点击打开:
(2)在代码框中,右键选择Debug 'NodeManager.main()'
,通过debug的方式开启NodeManager进程:
build报错如下:
解决方法: 点击菜单栏Run-->Edit configuration
,在出现的窗口中,勾选Include dependencies with 'Provided' scope
,点击OK,重新以debug方式运行NodeManager.main()
: