最近在使用CDH5,想找个eclipse插件用用。无奈万般百度而不得,最后发现只能自己编译。可是作为萌新从来没有编译过啊。网上找到的帖子又各不相同,只能自己摸索啦。最后为了避免遗忘,还是写个blog大致记录一下。
环境:windows,Hadoop2.3.0-CDH5.1.3,eclipse版本:kapler
1,安装Ant
版本apache-ant-1.9.6,常规的复制进去,配PATH,很简单不再赘述。
2,安装Maven
版本apache-maven-3.3.9,常规的复制进去,配PATH,很简单不再赘述。
3,安装Ivy
版本apache-ivy-2.4.0,常规的复制进去,配PATH,然后找到ivy-2.4.0.jar,把ivy-2.4.0.jar复制到%ANT_HOME%\lib 下。然后进入IVY_HOME/src/example/hello-ivy目录,运行ant可见:
4.下载CDH版本Hadoop源码
地址:http://archive.cloudera.com/cdh5/cdh/5/
下载对应版本的tar.gz文件解压到本地。我这里是D:\hadoop-2.3.0-cdh5.1.3\hadoop-2.3.0-cdh5.1.3,并把这个目录添加到HADOOP_HOME环境变量中(不添加最后运行插件过程中会报错),PATH也加入对应的${HADOOP_HOME}\bin
5.复制jar包
需要将${HADOOP_HOME}/share/hadoop/mapreduce1下面的所有jar包拷贝到
${HADOOP_HOME}/src/hadoop-mapreduce1-project 目录下面
将${HADOOP_HOME}/share/hadoop/mapreduce1/lib下面的所有内容拷贝到
${HADOOP_HOME}/src/hadoop-mapreduce1-project /lib目录下面
6.配置build.xml文件
build.xml文件在${HADOOP_HOME}/src/hadoop-mapreduce1-project/src/contrib/eclipse-plugin 目录下
<!-- Override classpath to include Eclipse SDK jars --> <path id="classpath"> <pathelement location="${build.classes}"/> <pathelement location="${hadoop.root}/build/classes"/> <span style="color:#FF0000;"> <fileset dir="${hadoop.root}"> <include name="**/*.jar" /> </fileset></span> <path refid="eclipse-sdk-jars"/> </path>
<target name="compile" depends="init, ivy-retrieve-common" unless="skip.contrib"> <echo message="contrib: ${name}"/> <javac encoding="${build.encoding}" srcdir="${src.dir}" includes="**/*.java" destdir="${build.classes}" debug="${javac.debug}" optimize="${javac.optimize}" <span style="color:#FF0000;"> <!--修改为自己用的版本--> </span> target="1.7" source="1.7" deprecation="${javac.deprecation}" <span style="color:#FF0000;">includeantruntime="on"</span>> <classpath refid="classpath"/> </javac> </target>
<!-- Override jar target to specify manifest --> <target name="jar" depends="compile" unless="skip.contrib"> <mkdir dir="${build.dir}/lib"/><!--原来的2个删掉改为copy以下5.1.3所需的18个jar包,其余版本可能略有区别--> <copy file="${hadoop.root}/hadoop-core-${version}.jar" tofile="${build.dir}/lib/hadoop-core.jar" verbose="true"/> <copy file="${hadoop.root}/lib/commons-cli-1.2.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/commons-configuration-1.6.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/commons-httpclient-3.1.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/jackson-core-asl-1.8.8.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/commons-lang-2.6.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/jackson-mapper-asl-1.8.8.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/hadoop-common-2.3.0-cdh5.1.3.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/hadoop-auth-2.3.0-cdh5.1.3.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/hadoop-hdfs-2.3.0-cdh5.1.3.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/slf4j-log4j12-1.7.5.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/slf4j-api-1.7.5.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/log4j-1.2.17.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/protobuf-java-2.5.0.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/hadoop-annotations-2.3.0-cdh5.1.3.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/hadoop-tools-2.3.0-mr1-cdh5.1.3.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/guava-11.0.2.jar" todir="${build.dir}/lib" verbose="true"/> <copy file="${hadoop.root}/lib/commons-collections-3.2.1.jar" todir="${build.dir}/lib" verbose="true"/> <jar jarfile="${build.dir}/hadoop-${name}-${version}.jar" manifest="${root}/META-INF/MANIFEST.MF"> <fileset dir="${build.dir}" includes="classes/ lib/"/> <fileset dir="${root}" includes="resources/ plugin.xml"/> </jar> </target>
修改build.properties
增加如下:
eclipse.home=D:/eclipse/ <!--自己的--> reactor.repo=https://repository.cloudera.com/content/repositories/snapshots version=2.3.0-mr1-cdh5.1.3<span style="color:#3d3d3d;"><span style="color:#3d3d3d;"></span></span><pre name="code" class="html"> <!--自己的eclipse目录-->
修改META-INF下的MANIFEST.MF文件
Bundle-ClassPath: classes/,lib/hadoop-core.jar,lib/commons-cli-1.2.jar,lib/commons-configuration-1.6.jar,lib/commons-httpclient-3.1.jar,lib/jackson-core-asl-1.8.8.jar,lib/commons-lang-2.6.jar,lib/jackson-mapper-asl-1.8.8.jar,lib/hadoop-common-2.3.0-cdh5.1.3.jar,lib/hadoop-auth-2.3.0-cdh5.1.3.jar,lib/hadoop-hdfs-2.3.0-cdh5.1.3.jar,lib/slf4j-log4j12-1.7.5.jar,lib/slf4j-api-1.7.5.jar,lib/log4j-1.2.17.jar,lib/protobuf-java-2.5.0.jar,lib/hadoop-annotations-2.3.0-cdh5.1.3.jar,hadoop-tools-2.3.0-mr1-cdh5.1.3.jar,lib/guava-11.0.2.jar,lib/commons-collections-3.2.1.jar
7.修改build-contrib.xml文件
位于在上一层目录中
<property name="javac.deprecation" value="<span style="color:#FF0000;">on</span>"/>
8.编译插件
最后进入${HADOOP_HOME}\src\hadoop-mapreduce1-project\src\contrib\eclipse-plugin执行ant即可。
执行成功后在提示的目录中可以找到jar包了,右键使用rar打开,找到plugin.xml文件在172行左右加入如下代码。添加后替代原来的plugin.xml
<extension point="org.eclipse.ui.commands"> <command id="dfs.browser.action.delete" name="Delete"> </command> <command id="dfs.browser.action.disconnect" name="Disconnect"> </command> <command id="dfs.browser.action.refresh" name="Refresh"> </command> <command id="dfs.browser.action.download" name="Download from DFS"> </command> <command id="dfs.browser.action.upload_files" name="Upload files to DFS"> </command> <command id="dfs.browser.action.upload_dir" name="Upload directory to DFS"> </command> <command id="dfs.browser.action.open" name="view"> </command> <command id="dfs.browser.action.reconnect" name="Reconnect"> </command> <command id="dfs.browser.action.mkdir" name="Create new directory"> </command> </extension>
9.下载winutils.exe
很多地方都有,无需考虑版本问题,貌似都是一样的。放到${HADOOP_HOME}\bin 下。
如果找不到可以去http://www.aboutyun.com/thread-8311-1-1.html下载
10.插件的配置
Window→preference→hadoop 目录选择${HADOOP_HOME} \share\hadoop\mapreduce1而不是${HADOOP_HOME}。
最后说几个常见的问题:
1,ant过程中连接失败:请挂VPN
2,插件放进去点了没反应,或者等等:请查看workplace里面的log应该有报错,通常为NoClassDefFoundError,那么就把对应的jar包加到插件的jar总,并且MF文件中作对应修改。
3 .运行项目提示 java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.:忘记配置 ${HADOOP_HOME}环境。
4 .一切都弄好了为何还是连不上?提示20000 millis timeout while waiting for channel to be ready for connect. ch :?
请修改windows 的hosts文件 加入对应的全部主机,有的说是要开启windows的telnet,并且关闭防火墙。不管他们开没开,不过telnet我是没开的,防火墙倒是关了,一样成功。关键在于客户机作为hadoop集群的外部一个节点使用eclipse插件访问的时候使用的是自己hosts文件还不是hadoop集群的。所以必须在自己的客户机上配置hosts文件才行(原谅我忘记这句话参考自哪篇文章了,实在是看了太多帖子了)
最后附上成功截图一张,左边为插件的HDFS的文件浏览,右边是跑的测试操作HBase的例子。
参考:http://my.oschina.net/muou/blog/408543
http://blog.csdn.net/dwld_3090271/article/details/41546323
http://blog.csdn.net/luckymelina/article/details/19923095
http://blog.csdn.net/yunlong34574/article/details/21331927