win7原始碼編譯hadoop-eclipse-plugin-2.7.0.jar
當你厭煩了本地編碼,打包,部署到遠端伺服器,然後通過hadoop jar xxx.jar wordcount /input /output的方式執行mapreduce程式,那麼可以考慮本地編譯一個合適的hadoop-eclipse-plugin外掛,進行本地執行遠端mapreduce程式。減少了打包部署的步驟,還可以在eclipse中直接檢視執行結果。
本地編譯hadoop-eclipse-plugin所需的環境:
- jdk
- ant,這裡就是通過ant來構建hadoop-eclipse-plugin-2.7.0.jar包。
- hadoop,本地需要編譯或者下載一個hadoop二進位制包,設定環境變數HADOOP_HOME,並將%HADOOP_HOME%\bin加入Path環境變數中。
編譯開始之前,還是需要說明一下,這個在github上下載的原始碼,其實是有問題的。不是跟編譯不同hadoop版本依賴的jar包版本的問題,而是這個構建程式碼,構建過程中即便success,放在eclipse plugins目錄中,開啟eclipse也能顯示Mapreduce圖示和外掛,但是當我們配置好遠端hadoop地址和埠,點選連線的時候,問題就出來了,各種缺少包。我這裡編譯hadoop-2.7.0版本,就缺少commons-io,servlet-api的包。在build.xml檔案中就沒有加入。
首先不會拷貝,而且拷貝的內容裡面重複了commons-cli的jar:
其次不會加入Bundle-ClassPath:
因此,當我們修改了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外掛了。我們需要做兩個設定:
- Windows->Preferences->Hadoop Map/Reduce->設定Hadoop Installation directory:配置我們編譯好的hadoop安裝目錄。
- Window->Show View->Other->Map/Reduce Locations檢視,點選空白位置->New Hadoop location,填寫遠端hadoop伺服器的host,port。接著沒有任何問題,我們就可以在Project Explorer檢視中點選DFS Locations,可以看到hadoop伺服器的hdfs檔案系統了。
這只是檢視檔案系統的功能,我們可以編寫一個WordCount的mapreduce程式,在本地以Run As->Java Application的方式執行,然後可以直接在這裡檢視執行結果產生的檔案。
最後補充一點,如果編譯的hadoop-eclipse-plugin-2.7.0.jar包放入到eclipse/plugins之後,啟動eclipse,連線hadoop,出現各種錯誤,可以直接看eclipse的日誌,eclipse啟動日誌在workspace/.metadata/.log中,可以在這裡看更詳細的報錯資訊。