編譯、測試Hadoop Eclipse plugin
平臺:
OS CentOSrelease 6.4 (Final) X64
Hadoop 1.1.3
描述:
使用ant 工具編譯 Hadoop Eclipse 插件
一、操作所需步驟:
1、安裝配置 ant
2、配置Hadoop 文件分別是:
$HADOOP_HOME/build.xml
$HADOOP_HOME/src/contrib/build-contrib.xml
$HADOOP_HOME/src/contrib/eclipse-plugin/build.xml
$HADOOP_HOME/src/contrib/eclipse-plugin/build.properties
$HADOOP_HOME/src/contrib/eclipse-plugin/META-INF/MANIFEST.MF
3、編譯執行ant compile 命令
4、在eclipse中加載插件
5、測試
一、安裝ant
下載ant
http://ant.apache.org/bindownload.cgi
apache-ant-1.9.2-bin.tar.gz
解壓指定目錄
tar -zxvfapache-ant-1.9.2-bin.tar.gz -C /usr/ant/
編輯環境變量
export ANT_HOME=/usr/ant/apache-ant-1.9.2
追加 $ANT_HOME/bin 到PATH中
exportPATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ANT_HOME/bin
測試:
[root@master~]# ant -version
Apache Ant(TM)version 1.9.2 compiled on July 8 2013
[root@master~]#
二、配置 Hadoop 編譯所需文件
1、編輯$HADOOP_HOME/build.xml
l修改31行,去掉紅色字體部分
31 <property name="version" value="1.1.3-SNAPSHOT"/>
l註銷這部分內容:
2421 <!--
2422 <targetname="ivy-download" description="To download ivy"unless="offline">
2423 <getsrc="${ivy_repo_url}" dest="${ivy.jar}"usetimestamp="true"/>
2424 </target>
2425 -->
如果不註銷會在沒編輯一步都會要下載ivy
l去掉對ivy-download的依賴關係,去掉紅色字體部分
2427 <!--
2428 To avoid Ivy leaking things across bigprojects, always load Ivy in the same classloader.
2429 Also note how we skip loading Ivy if it isalready there, just to make sure all is well.
2430 -->
2431 <target name="ivy-init-antlib"depends="ivy-download,ivy-init-dirs,ivy-probe-antlib"unless="ivy.found">
2432 <typedefuri="antlib:org.apache.ivy.ant" onerror="fail"
2433 loaderRef="ivyLoader">
2434 <classpath>
2、build-contrib.xml
文件所在目錄:
$HADOOP_HOME/src/contrib/build-contrib.xml
添加:eclipse 主目錄和hadoop版本,這裏hadoop的版本和$HADOOP_HOME/build.xml中的版本一致
<property name="eclipse.home"location="/usr/eclipse"/>
<property name="version"value="1.1.3 "/>
放在紅色字體位置,並修改修改location爲hadoop主目錄
<!--Imported by contrib/*/build.xml files to share generic targets. -->
<projectname="hadoopbuildcontrib"xmlns:ivy="antlib:org.apache.ivy.ant">
<propertyname="eclipse.home" location="/usr/eclipse"/>
<property name="version"value="1.1.3"/>
注意:
這裏的"version"value版本必須與$HADOOP_HOME/build.xml中的"version" value版本一致
如果不一致在編譯時會報如下錯:
[hadoop@masterhadoop]$ ant compile
Buildfile:/usr/hadoop/build.xml
BUILD FAILED
Target"ivy-probe-antlib" does not exist in the project "Hadoop".It is used from target "ivy-init-antlib".
3、編輯文件build.xml
文件位置:
$HADOOP_HOME/src/contrib/eclipse-plugin/
插入紅色字體部分內容
<!--Override jar target to specify manifest -->
<targetname="jar" depends="compile"unless="skip.contrib">
<mkdirdir="${build.dir}/lib"/>
<copyfile="${hadoop.root}/build/hadoop-core-${version}.jar"tofile="${build.dir}/lib/hadoop-core.jar"verbose="true"/>
<copyfile="${hadoop.root}/build/ivy/lib/Hadoop/common/commons-cli-${commons-cli.version}.jar" todir="${build.dir}/lib"verbose="true"/>
<copy file="${hadoop.root}/lib/commons-configuration-1.6.jar"tofile="${build.dir}/lib/commons-configuration-1.6.jar"verbose="true"/>
<copyfile="${hadoop.root}/lib/commons-httpclient-3.0.1.jar"tofile="${build.dir}/lib/commons-httpclient-3.0.1.jar"verbose="true"/>
<copy file="${hadoop.root}/lib/commons-lang-2.4.jar"tofile="${build.dir}/lib/commons-lang-2.4.jar"verbose="true"/>
<copy file="${hadoop.root}/lib/jackson-core-asl-1.8.8.jar"tofile="${build.dir}/lib/jackson-core-asl-1.8.8.jar"verbose="true"/>
<copyfile="${hadoop.root}/lib/jackson-mapper-asl-1.8.8.jar"tofile="${build.dir}/lib/jackson-mapper-asl-1.8.8.jar"verbose="true"/>
<jar
jarfile="${build.dir}/hadoop-${name}-${version}.jar"
manifest="${root}/META-INF/MANIFEST.MF">
<fileset dir="${build.dir}"includes="classes/ lib/"/>
<filesetdir="${root}" includes="resources/ plugin.xml"/>
</jar>
</
這裏需要注意的是 copyfile 之間是有空格的,如果沒有空間編譯時候會失敗。
4、編輯build.properties
文件所在位置:
$HADOOP_HOME/src/contrib/eclipse-plugin/
插入紅色字體部分
[hadoop@master eclipse-plugin]$ catbuild.properties|less
output.. = bin/
bin.includes = META-INF/,\
plugin.xml,\
resources/,\
classes/,\
classes/,\
lib/
eclipse.home=/usr/eclipse
這裏是eclipse.home爲eclipse的安裝目錄爲$eclipse_home
5、編輯MANIFEST.MF
文件位置:
$HADOOP_HOME/src/contrib/eclipse-plugin/META-INF.MF
[hadoop@master META-INF]$ vi MANIFEST.MF
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: MapReduce Tools for Eclipse
Bundle-SymbolicName:org.apache.hadoop.eclipse;singleton:=true
Bundle-Version: 0.18
Bundle-Activator: org.apache.hadoop.eclipse.Activator
Bundle-Localization: plugin
Require-Bundle: org.eclipse.ui,
org.eclipse.core.runtime,
org.eclipse.jdt.launching,
org.eclipse.debug.core,
org.eclipse.jdt,
org.eclipse.jdt.core,
org.eclipse.core.resources,
org.eclipse.ui.ide,
org.eclipse.jdt.ui,
org.eclipse.debug.ui,
org.eclipse.jdt.debug.ui,
org.eclipse.core.expressions,
org.eclipse.ui.cheatsheets,
org.eclipse.ui.console,
org.eclipse.ui.navigator,
org.eclipse.core.filesystem,
org.apache.commons.logging
Eclipse-LazyStart: true
Bundle-ClassPath: classes/,lib/hadoop-core.jar,lib/commons-configuration-1.6.jar,lib/commons-httpclient-3.0.1.jar,lib/commons-lang-2.4.jar,lib/jackson-core-asl-1.8.8.jar,lib/jackson-mapper-asl-1.8.8.jar,lib/commons-cli-1.2.jar
Bundle-Vendor: Apache Hadoop
[hadoop@master META-INF]$
這裏需要注意的是格式和英文字符“,”號;這裏格式lib文件之間沒有空格和回車符,如果格式不對雖然編譯可以通過,但在eclipse中加載插件後創建NewHadoop Location 時沒有反應。這個問題導致我花費了兩天時間。
三、編譯目錄,生成插件
1、進入hadoop根目錄中編譯
[hadoop@master ~]$ cd $HADOOP_HOME
[hadoop@master hadoop]$
運行ant 編譯hadoop
[hadoop@master hadoop]$ ant
Buildfile: /usr/hadoop/build.xml
clover.setup:
clover.info:
[echo]
[echo] Clover not found. Codecoverage reports disabled.
[echo]
clover:
ivy-init-dirs:
ivy-probe-antlib:
ivy-init-antlib:
ivy-init:
[ivy:configure] :: Ivy 2.1.0 - 20090925235825:: http://ant.apache.org/ivy/ ::
[ivy:configure] :: loading settings :: file =/usr/hadoop/ivy/ivysettings.xml
ivy-resolve-common:
[ivy:resolve] :: resolving dependencies ::org.apache.hadoop#Hadoop;working@master
[ivy:resolve] confs: [common]
[ivy:resolve] found commons-logging#commons-logging;1.0.4in maven2
[ivy:resolve] found log4j#log4j;1.2.15 in maven2
[ivy:resolve] foundcommons-httpclient#commons-httpclient;3.0.1 in maven2
[ivy:resolve] found commons-codec#commons-codec;1.4 inmaven2
[ivy:resolve] found commons-cli#commons-cli;1.2 in maven2
[ivy:resolve] found commons-io#commons-io;2.1 in maven2
………………
compile:
BUILD SUCCESSFUL
Total time: 1 minute 38 seconds
[hadoop@master hadoop]$
在編譯過程中會有警告,這不影響。編譯完成會在$HADOOP_HOME目錄中多處一個build文件夾
2、進入$HADOOP_HOME/src/contrib/eclipse-plugin/目錄
運行antjar 命令
說明:這一步是生成eclipse所需hadoop插件包
[hadoop@master eclipse-plugin]$ ant jar
Buildfile:/usr/hadoop/src/contrib/eclipse-plugin/build.xml
check-contrib:
init:
[echo] contrib: eclipse-plugin
init-contrib:
………………
[copy] Copying /usr/hadoop/lib/jackson-mapper-asl-1.8.8.jar to/usr/hadoop/build/contrib/eclipse-plugin/lib/jackson-mapper-asl-1.8.8.jar
[jar] Building jar: /usr/hadoop/build/contrib/eclipse-plugin/hadoop-eclipse-plugin-1.1.3.jar
BUILD SUCCESSFUL
Total time: 10 seconds
編譯成功後會在紅色字體部分顯示插件所在目錄位置。
在這一步可以查看到如下信息:
[hadoop@master eclipse-plugin]$ hadoopversion
Hadoop 1.1.3
Subversion -r
Compiled by hadoop on Thu Oct 31 13:36:59 CST2013
From source with checksumc720ddcf4b926991de7467d253a79b8b
[hadoop@master eclipse-plugin]$
Hadoop的版本和編譯日期。
四、配置eclipse
1、把編譯成功後的插件拷貝到eclipse插件目錄中。
cp$HADOOP_HOME/build/contrib/eclipse-plugin/hadoop-eclipse-plugin-1.1.3.jar/usr/eclipse/plugins/
2、打開eclipse或者重新打開eclipse配置hadoop installation directory
打開Window-->Preferens,你會發現HadoopMap/Reduce選項,在這個選項裏你需要配置Hadoopinstallation directory。這裏的目錄爲hadoop的主目錄:$HADOOP_HOME;配置完成後退出。
3、打開Map/Reduce視圖,配置Map/ReduceLocations
Window->Open Perspective->Other ,彈出對話框列表中,會出現圖標爲藍色大象,文字爲Map/Reduce點擊0K。
Eclipse 下方會出現Map/ReduceLocation ,在空白區域點擊鼠標右鍵出現新建“NewHadoop location”
彈出編輯框,輸入Map/ReduceMaster和DFSMaster 參數,即爲配置hadoop$HADOOP_HOME/conf 目錄中core-site.xml,mapred-site.xml文件參數。
[hadoop@master conf]$ cat core-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
<!-- Put site-specific property overridesin this file. -->
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<!-- file system properties -->
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.10.243:9000</value>
</property>
</configuration>
[hadoop@master conf]$ cat mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
<!-- Put site-specific property overridesin this file. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>http://192.168.10.243:9001</value>
</property>
</configuration>
[hadoop@master conf]$
配置完成後會出現如下信息:
五、測試配置插件是否在eclipse中成功
使用wordcount.java來測試
1、測試準備
建文件夾input,並穿件兩個文件test1.txt和test2.txt
test1.txt 中存入數據內容:
hello word
test2.txt 中存入數據內容:
hello hadoop
將文件夾input複製到hdfs中in目錄
Hadoop dfs -put /home/hadoop/input in
查看in目錄:
[hadoop@master ~]$ hadoop dfs -ls ./in/*
-rw-r--r-- 3 hadoop supergroup 112013-10-31 14:39 /user/hadoop/in/test1.txt
-rw-r--r-- 3 hadoop supergroup 132013-10-31 14:39 /user/hadoop/in/test2.txt
2、創建項目
File-->New-->Other-->Map/ReduceProject,項目名稱爲test(可以隨便自行命名),
複製WordCount.java到新建項test中的src目錄中。
cp $HADOOP_HOME/src/examples/org/apache/hadoop/examples/WordCount.java
/home/hadoop/workspace/test/src
3、編譯運行WordCount
點擊WordCount.java右鍵—>Run as -->配置Java Application àWordCount(1)-àArguments à輸入:
hdfs://192.168.10.243:9000/user/hadoop/in hdfs://192.168.10.243:9000/user/hadoop/out
--àapply àrun
注意:hdfs://192.168.10.243:9000/user/hadoop/out out是WordCount輸出結果存放的目錄。
查看結果:
方法一:
運行成功後可以查看DFSLocations 的hadoop目錄中會多處一個out目錄,並有兩個文件part-開頭的是存放WordCount的結果。點擊可以到結果:
方法二:
使用hadoop命令:hadoopdfs –cat ./out/*
輸入結果:
[hadoop@master~]$ hadoop dfs -cat ./out/*
hadoop 1
hello 2
word 1
[hadoop@master~]$
到這裏hadoop中eclipse開會工具已經安裝成功。
在此過程中遇到了各類問題:
比如:
1、hadoopbuild-contrib.xml 467或者其他編碼這個都是配置文件的問題,注意修改時的空格,其他字符等
2、點擊右鍵沒有出現NewHadoop Location 是因爲MANIFEST.MF中 jar文件的格式等問題。
3、以及編譯失敗時都會顯示BUILDFAILED 下面緊接着會說明失敗原因,根據不同原因解決問題等;
4、hadoop 編譯後版本不同一,如:我eclipse安裝在master節點上,這樣會出現重啓之後datanode節點都沒有啓動起來,這裏需要把編譯後的版本複製到各個節點上,然後在重新hadoop dfsadmin -format,但這樣會丟掉數據。在這裏我都是測試所以數據不中要。或者在各個節點上運行 hadoop datanode -upgrade 。