win7源码编译hadoop-eclipse-plugin-2.7.0.jar

当你厌烦了本地编码,打包,部署到远程服务器,然后通过hadoop jar xxx.jar wordcount /input /output的方式运行mapreduce程序,那么可以考虑本地编译一个合适的hadoop-eclipse-plugin插件,进行本地运行远程mapreduce程序。减少了打包部署的步骤,还可以在eclipse中直接查看运行结果。

本地编译hadoop-eclipse-plugin所需的环境:

  1. jdk
  2. ant,这里就是通过ant来构建hadoop-eclipse-plugin-2.7.0.jar包。
  3. hadoop,本地需要编译或者下载一个hadoop二进制包,设置环境变量HADOOP_HOME,并将%HADOOP_HOME%\bin加入Path环境变量中。
  4. hadoop2x-eclipse-plugin源码

        编译开始之前,还是需要说明一下,这个在github上下载的源代码,其实是有问题的。不是跟编译不同hadoop版本依赖的jar包版本的问题,而是这个构建代码,构建过程中即便success,放在eclipse plugins目录中,打开eclipse也能显示Mapreduce图标和插件,但是当我们配置好远程hadoop地址和端口,点击连接的时候,问题就出来了,各种缺少包。我这里编译hadoop-2.7.0版本,就缺少commons-io,servlet-api的包。在build.xml文件中就没有加入。

首先不会拷贝,而且拷贝的内容里面重复了commons-cli的jar:

win7源码编译hadoop-eclipse-plugin-2.7.0.jar

其次不会加入Bundle-ClassPath:

win7源码编译hadoop-eclipse-plugin-2.7.0.jar

        因此,当我们修改了ivy/library.properties中关于hadoop-2.7.0/share/hadoop-common/lib/目录下对应需要拷贝到eclipse-plugin目录中的jar包版本信息,编译成功了,但是运行的时候还是会出错。

Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.Charsets cannot be found by org.apache.hadoop.eclipse_0.18.0

      原因就是没有将commons-io,servlet-api两个jar包打入到hadoop-eclipse-plugin-2.7.0.jar包中。为此,我们需要修改ivy/library.properties和src/contrib/eclipse-plugin/build.xml更改的内容分别是:

#ivy/library.properties
htrace.version=3.1.0-incubating
commons-io.version=2.4
servlet-api.version=2.5
slf4j-api.version=1.7.10
slf4j-log4j12.version=1.7.10 

        build.xml配置文件中找到jar任务所在部分,添加两个拷贝文件commons-io,servlet-api,并且在<attrubute name="Bundle-ClassPath"/>部分加上commons-io,servlet-api两个jar,最后修改 <target name = "jar" depends="compile">,去掉ivy-retrieve-common,因为生成jar不需要ivy-retrive-common这个任务。

<target name="jar" depends="compile" unless="skip.contrib">
     ...
     <copy file="${hadoop.home}/share/hadoop/common/lib/commons-io-${commons-
io.version}.jar"  todir="${build.dir}/lib" verbose="true"/> 

     <copy file="${hadoop.home}/share/hadoop/common/lib/servlet-api-${servlet-
api.version}.jar"  todir="${build.dir}/lib" verbose="true"/>

     <attribute name="Bundle-ClassPath" 
      value="classes/, 
	  ...
      lib/commons-io-${commons-io.version}.jar, 
      lib/servlet-api-${servlet-api.version}.jar"/>
</target>

        做了这些修改,再加上前面的环境都准备好了,就可以编译了。进入src/contrib/eclipse-plugin目录下,就是修改build.xml配置文件的目录下,在这里我们通过命令行执行:ant jar -Dversion=2.7.0 -Dhadoop.version=2.7.0 -Dhadoop.home=E:\software\hadoop-2.7.0 -Declipse.home=D:\application\eclipse-2018

       编译成功之后,生成的jar包就在build/contrib/eclipse-plugin目录下。将其拷贝到eclipse/plugins目录中,再启动eclipse,就可以发现有了Mapreduce插件了。我们需要做两个设置:

  1. Windows->Preferences->Hadoop Map/Reduce->设置Hadoop Installation directory:配置我们编译好的hadoop安装目录。
  2. Window->Show View->Other->Map/Reduce Locations视图,点击空白位置->New Hadoop location,填写远程hadoop服务器的host,port。接着没有任何问题,我们就可以在Project Explorer视图中点击DFS Locations,可以看到hadoop服务器的hdfs文件系统了。

win7源码编译hadoop-eclipse-plugin-2.7.0.jar

这只是查看文件系统的功能,我们可以编写一个WordCount的mapreduce程序,在本地以Run As->Java Application的方式运行,然后可以直接在这里查看运行结果产生的文件。

   最后补充一点,如果编译的hadoop-eclipse-plugin-2.7.0.jar包放入到eclipse/plugins之后,启动eclipse,连接hadoop,出现各种错误,可以直接看eclipse的日志,eclipse启动日志在workspace/.metadata/.log中,可以在这里看更详细的报错信息。