Hadoop-0.20.2源码学习(2)——源码学习环境搭建

参考: JeffreyZhou的博客园
《Hadoop权威指南》第四版

0 本文前提

在上一篇文章中,通过启动脚本xxx.sh文件的探索,对hadoop的源码有了一个初步的认识,发现最终都是运行java程序,所以在继续深入了解之前,先来搭建一个用来查看hadoop中,java源代码的环境,所以这本文主要在于在eclipse中搭建一个合适的项目。

2.1 创建Eclipse项目

废话不多说,就正常创建就行了
new Project–>java Project–>命名为HadoopSrcStudy
在这里插入图片描述

2.2 添加源码

接下来,添加源码,将上篇文章中,即hadoop下面的src文件夹中的文件,就先看最核心的三个文件夹吧corehdfsmapred。直接复制这三个文件夹,在HadoopSrcStudy项目下粘贴就行了。

在这里插入图片描述

但光有这三个文件夹还不够,不能当成源码来编译,所以在Project上,右键,打开属性(Properties),左边栏选择Java Build Path,再右边栏选择Source,点击添加Add Folder,将对应的三个目录,添加进行。ok,得到和源码一样的目录:

在这里插入图片描述

2.3 添加Jar包

在上图中可以看到,自动编译产生了好多个错误,这是因为少了Jar包(个人觉得这是缺失依赖),那么添加Jar包吧。

所以我们先在源码目录下建一个jar的文件夹。然后将以下目录下的jar文件都复制进来。

hadoop-0.20.2/build/ivy/lib/Hadoop/common/*.jar
hadoop-0.20.2/lib/jsp-2.1/*.jar
hadoop-0.20.2/lib/kfs-0.2.2.jar
hadoop-0.20.2/lib/hsqldb-1.8.0.10.jar

得到如图:
在这里插入图片描述

然后再次打开Project的Properties,选择BuildPath页,选择Libraries,点击Add Jars。选择刚才建立的Jar文件夹中的所有Jar文件,ok。
在这里插入图片描述
然后,就可以看到Bug立即减少了,但是还有一个顽强的bug提示,就是这个RccTask文件:

在这里插入图片描述

根据参考来源以及后续的实践,直接将这个排除掉,对着该文件右健菜单Build Path->Exclude即可。

好了,此时一个bug也没有了。

2.4 添加配置文件

还记得在前面学习MapReduce框架时,在使用eclipse运行MR程序时,需要将几个文件添加到项目中的src目录下,也解释了为啥要这样。那么在这里也是一样。

Hadoop-Eclipse-Plugin的Advanced parameters作为Hadoop运行参数,如果未修改,则默认是单机模式参数,程序运行时读取的是本地目录,而非HDFS目录,而log4j用于记录程序的输出日记,需要log4j.properties这个配置文件,若无,虽然不影响程序运行,但运行时无法看到任何提示消息。默认是单机模式的。

所以,将hadoop-0.20.2目录下conf文件夹下的core-site.xml、hdfs-site.xml、mapred-site.xml、log4j.properties这几个文件,放在src目录下。

将hadoop-0.20.2目录下src文件夹下的,webapps复制到src目录下。

在eclipse中,src目录下建一个package,名为:org.apache.hadoop,然后将hadoop-0.20.2\build\src\org\apahe\hadoop\package-info.java文件,复制到该package下。

最终目录如下:

在这里插入图片描述
这样源码调试环境就OK了。

2.5 运行测试

源码已经加入,并且已经编译通过了,接下来得在eclipse中跑一下,试下是否能正常跑起来。

在这里要注意一个问题,不然会运行出错,朋友们要先看下这个小插曲再继续(见本文后记)


这里我们尝试,用命令行中执行namenode,然后用eclipse运行datanode,然后再开一个命令行,用fs命令,是否能查到之前的内容。

  1. 打开命令行,进入hadoop-0.20.2目录,执行bin/hadoop namenode

  2. 在eclipse中,进入hdfs目录,再进入org.apache.hadoop.hdfs.server.datanode目录,打开DataNode.java文件,然后点上面的运行,然后就可以看到在eclipse中,正常的输出信息,且没有错误。该信息,可以在log文件夹下,找到datanode的日志,其内容是一样的。 同时在前面的命令行窗体中,可以看到namenode程序中收到一个datanode的接入请求,如图:

在这里插入图片描述

  1. 再打开一个命令行窗口(ctr+shift+T),进入hadoop-0.20.2目录bin/hadoop fs –ls,就可以看到输出了文件列表。

在这里插入图片描述

如果上面两个命令都执行成功,说明namenode和在eclipse中运行的datanode都起作用了,说明它工作了。另外,也可以用jps来查看是否后后台进程NameNode和DataNode。

:根据在后记里说的,本例没有对0.20.2版本的hadoop进行(伪)分布式配置,所以默认为单机模式,DN和NN都在本机中。

同样,我们还可以反过来,在eclipse中运行namenode,在命令行中运行datanode。同样的效果。

为了可以看到更多的调试日志输出,我们还可以打开src下的log4j.properties文件,在第二行中的INFO改成DEBUG,这样输出的内容会更详细。

再注:参考博客中,只提到了如何用命令行开启进程,但这样的话,有可能在一瞬间脑子短路(比如我)不知道咋stop了,因为在命令行中启动后,一直处于运行状态中,此时,最简单粗暴的就是直接kill掉进程。

如上图中,通过jps可以看到NameNode和DataNode的pid号,那么就直接kill掉吧。

在这里插入图片描述

done !

2.6 后记

我原是在4个虚拟机上,一主节点,三子节点,搭建分布式hadoop,其版本为2.7.6,然后在此基础上学习了一下hdfs和mapreduce,然后才开始学习源码。

But,我是单独去下载hadoop0.20.2压缩包,直接解压到hadoop-src中,作为源码学习的,所以,从刚开始到现在,本机中有两个hadoop版本!!

同样,无论是环境变量,还是eclipse中已有的DFS Location,都是原先的hadoop2.7.6,所以,在本例中,此处不能直接在命令行中运行命令。咋办呢?

要知道,环境变量的前提是,优先执行当前目录,再去环境目录下寻找,所以,我们进入hadoop0.20.2的bin目录下,再来运行命令,这样执行的就是0.20.2版本的hadoop了,而不是2.7.6/。

当然,在执行前,先用jps命令看看,是否已经启动了2.7.6版本的hadoop,是的话要先stop。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41059320/article/details/84197856