天天看點

Ubuntu13.04 Eclipse下編譯安裝Hadoop插件及使用小例

一、在Eclipse下編譯安裝Hadoop插件

       Hadoop的Eclipse插件現在已經沒有二進制版直接提供,隻能自己編譯。不過要注意,一定要下載下傳Hadoop的src包,不然是不帶源代碼的。環境如下:

Linux的發行版是Ubuntu13.04,Hadoop版本是1.1.2。

hadoop安裝在/opt/hadoop,是以源代碼的目錄是hadoop根路徑下的src/contrib/eclipse-plugin。

Eclipse安裝路徑是/opt/eclipse。

編譯步驟:

一共需要修改三個檔案:

(1)hadoop根路徑下的src/contrib/eclipse-plugin/build.properties

(2)hadoop根路徑下的src/contrib/build-contrib.xml

(3)hadoop根路徑下的src/contrib/eclipse-plugin/build.xml

具體做如下修改:

1. 首先編輯 src/contrib/eclipse-plugin/build.properties 檔案

添加兩行,補充Eclipse路徑和Hadoop版本:藍色部分是添加的兩行

output.. = bin/
bin.includes = META-INF/,\
               plugin.xml,\
               resources/,\
               classes/,\
               classes/,\
               lib/

eclipse.home=/opt/eclipse
version=1.1.2      

注意:網上都說編輯src/contrib/build-contrib.xml,添加兩行,補充Eclipse路徑和Hadoop版本:

<property name="eclipse.home" location="/opt/eclipse"/>
<property name="version" value="1.1.2"/>      

但是我這樣做在ant的時候卻報錯:找不到eclipse.home

2. 我們需要引用hadoop的一些包,但是預設的classpath沒有這些包(我們沒有從頭編譯)。是以需要修改classpath

打開src/contrib/eclipse-plugin/build.xml檔案,定位<path id="classpath">,加入:

<fileset dir="${hadoop.root}">
    <include name="**/*.jar" />
</fileset>      

3. 代碼中使用了一些遺留功能,是以我們要修改deprecation的設定。這一步非必需

打開hadoop根路徑下面的src/contrib/build-contrib.xml,定位

<property name="javac.deprecation" value="off"/>      

然後修改成

<property name="javac.deprecation" value="on"/>      

4. 修改includeantruntime設定。 這一步非必需 

定位build.xml中的<target name="compile" ...>,修改javac的設定,加入一個選項

 includeantruntime="on"

也就是将javac修改成

<javac
     encoding="${build.encoding}"
     srcdir="${src.dir}"
     includes="**/*.java"
     destdir="${build.classes}"
     debug="${javac.debug}"
     deprecation="${javac.deprecation}"
     includeantruntime="on">
     <classpath refid="classpath"/>
</javac>      

5. jar打包的時候需要hadoop的一些jar檔案,但是我們沒有編譯生成它,是以我們需要修改一下jar這個target。

另外,有幾個jar是我們需要用到,而build.xml裡面沒有自動包含的,如果不包含它們,Eclipse連接配接Hadoop會出現failure to login錯誤,其實就是找不到類

在build.xml中找到

<copy file="${hadoop.root}/build/hadoop-core-${version}.jar" tofile="${build.dir}/lib/hadoop-core.jar" verbose="true"/>
<copy file="${hadoop.root}/build/ivy/lib/Hadoop/common/commons-cli-${commons-cli.version}.jar"  todir="${build.dir}/lib" verbose="true"/>      

我們修改成

<copy file="${hadoop.root}/hadoop-core-${version}.jar" tofile="${build.dir}/lib/hadoop-core.jar" verbose="true"/>
<copy file="${hadoop.root}/lib/commons-cli-${commons-cli.version}.jar"  tofile="${build.dir}/lib/commons-cli.jar" verbose="true"/>
<copy file="${hadoop.root}/lib/commons-configuration-1.6.jar"  tofile="${build.dir}/lib/commons-configuration.jar" verbose="true"/>
<copy file="${hadoop.root}/lib/commons-httpclient-3.0.1.jar"  tofile="${build.dir}/lib/commons-httpclient.jar" verbose="true"/>
<copy file="${hadoop.root}/lib/commons-lang-2.4.jar"  tofile="${build.dir}/lib/commons-lang.jar" verbose="true"/>
<copy file="${hadoop.root}/lib/jackson-core-asl-1.8.8.jar"  tofile="${build.dir}/lib/jackson-core-asl.jar" verbose="true"/>
<copy file="${hadoop.root}/lib/jackson-mapper-asl-1.8.8.jar"  tofile="${build.dir}/lib/jackson-mapper-asl.jar" verbose="true"/>      

6. 但是這樣,我們的jar檔案還是不會自動部署到eclipse中,你可以手動複制,即将編譯好的/opt/hadoop/build/contrib/eclipse-plugin/hadoop-eclipse-plugin-1.1.2.jar插件複制到eclipse安裝目錄下的plugins下即可

但是我們希望ant幫我們自動部署進去。我們在build.xml中建立一個target,用來部署:

<target name="deploy" depends="jar" unless="skip.contrib">
<copy file="${build.dir}/hadoop-${name}-${version}.jar"  todir="${eclipse.home}/plugins" verbose="true"/>
</target>      

然後修改project的預設target,也就是将project修改成:

<project default="deploy" name="eclipse-plugin">      

7. 接下來一步我們要修改Hadoop根目錄下的src/contrib/META-INFO/MANIFEST.MF,修改這個jar的classpath。

找到這個檔案的Bundle-ClassPath這一行,然後,修改成(不能換行,我這裡友善顯示換行了)

Bundle-ClassPath: classes/,lib/commons-cli.jar,lib/commons-httpclient.jar,lib/hadoop-core.jar,lib/jackson-mapper-asl.jar,
lib/commons-configuration.jar,lib/commons-lang.jar,lib/jackson-core-asl.jar      

8. 執行ant,代碼就會被編譯,插件會被自動安裝到eclipse的plugins目錄中,打開eclipse就可以使用了(如果沒有安裝ant,請去apache下載下傳ant的二進制編譯版,具體見後面附錄)。另外編譯時會自動聯網下載下傳需要的包,是以請保證網絡通暢。

啟動Eclipse 後 Window->Open Perspective->Other ,彈出對話框清單中,會出現圖示為藍色大象,文字為Map/Reduce 

內建成功!

附:Ubuntu下ant的安裝和配置

一. 自動安裝

    sudo apt-get install ant

      但是這種裝法不好。首先安裝的ant不是最新的版本,其次還要裝一堆其他的附帶的東西。比如一個ant隻有幾兆,當用apt-get install方式安裝時需要下載下傳60多兆的東西進行安裝,十分緩慢且占空間,是以我才用自己手動ant安裝。

二. 手動安裝

    1. 到Apache官網下載下傳最新版本的ant:http://ant.apache.org/bindownload.cgi

    2. 解壓下載下傳下來的

.tar.gz檔案到/opt目錄下:

     tar -xzvf apache-ant-1.9.2-bin.tar.gz -C /opt

    3. 配置環境變量:sudo vi /etc/profile,在原來基礎上添加以下藍體字:

export ANT_HOME=/opt/apache-ant-1.9.2
export JAVA_HOME=/opt/java/jdk1.7.0_25/
export JRE_HOME=/opt/java/jdk1.7.0_25/jre
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$ANT_HOME/bin      

    4. 驗證是否安裝成功:

    ant -version

    Apache Ant(TM) version 1.9.2 compiled on July 8 2013

    如此字樣,則表示安裝成功!

二、Eclipse中配置Hadoop插件

在編寫MapReduce程式之前需要配置Eclipse環境,步驟如下:

1. 首先配置hadoop installation directory。

如果安裝插件成功,打開Window-->Preferences,你會發現Hadoop Map/Reduce選項,在這個選項裡你需要配置Hadoop installation directory。配置完成後退出。 

2. 打開Map/Reduce視圖,配置Map/Reduce Locations。 

單擊eclipse右上角的Open Perspective圖示,選擇Map/Reduce視圖打開。

在Map/Reduce Locations(Eclipse界面的正下方)中建立一個Hadoop

Location。在這個View中,點選滑鼠右鍵-->New Hadoop Location。在彈出的對話框中你需要配置Location

name,可任意填,如Hadoop,以及Map/Reduce Master和DFS

Master。這裡面的Host、Port分别為你在mapred-site.xml、core-site.xml中配置的位址及端口。我的這兩個檔案中配置中部分内容如下: 

mapred-site.xml

<property>
    <name>mapred.job.tracker</name>
    <value>http://192.168.1.151:9001</value>
</property>      

core-site.xml:

<!-- file system properties -->
  <property>
    <name>fs.default.name</name>
    <value>hdfs://192.168.1.151:9000</value>
  </property>      

最後的配置截圖如下:

設定完成後,點選Finish就應用了該設定。然後,在最左邊的Project Explorer中就能看到DFS的目錄,如下圖所示:

三、在Eclipse中建立項目測試Hadoop插件是否成功配置

當然最經典的以WordCount為例,就跟Hello World一樣,步驟如下:

1. 建立項目。 

File-->New-->Other-->Map/Reduce Project 

項目名可以随便取,如HadoopTest。 

複制 hadoop安裝目錄/src/examples/org/apache/hadoop/examples/WordCount.java到剛才建立的項目下面,修改裡面的package。

2. 上傳模拟資料檔案夾

為了運作程式,需要一個輸入檔案夾和輸出的件夾。輸出檔案夾,在程式運作完成後會自動生成。我們需要給程式一個輸入檔案夾。

(1)在目前目錄(如hadoop安裝目錄)下建立檔案夾input,并在檔案夾下建立兩個檔案file01、file02,這兩個檔案内容分别如下: 

// file01
Hello Alexia Welcome Hadoop      
// file02
Welcome Alexia Bye Hadoop      

(2)将檔案夾input上傳到HDFS中

在已經啟動Hadoop守護程序終端中cd 到hadoop安裝目錄,運作下面指令: 

bin/hadoop fs -put input input        

這個指令将input檔案夾上傳到了hadoop檔案系統了,在該系統下就多了一個input檔案夾,你可以使用下面指令檢視: 

bin/hadoop fs -ls        

3. 運作項目

(1) 在建立的項目HadoopTest,點選WordCount.java,右鍵-->Run As-->Run Configurations

(2) 在彈出的Run Configurations對話框中,點Java Application,右鍵-->New,這時會建立一個application名為WordCount 

(3) 配置運作參數,點Arguments,在Program arguments中輸入“你要傳給程式的輸入檔案夾和你要求程式将計算結果儲存的檔案夾”,如: 

hdfs://192.168.1.151:9000/user/hadoop/input hdfs://192.168.1.151:9000/user/hadoop/output      

這裡面的input就是你剛傳上去的檔案夾。檔案夾位址你可以根據自己具體情況填寫。如下圖:

(4) 點選Run,運作程式。

等運作結束後,可以在終端中用指令如下,

檢視是否生成了輸出檔案夾output
bin/hadoop fs -ls  

用下面指令檢視生成的檔案内容
bin/hadoop fs -cat output01/*      

如果顯示如下,說明已經成功在eclipse下運作第一個MapReduce程式了

Alexia 2
Bye 1     
Hadoop  2    
Hello   1
Welcome   2       
Ubuntu13.04 Eclipse下編譯安裝Hadoop插件及使用小例

作者:Alexia(minmin)

如果您認為閱讀這篇部落格讓您有些收獲,不妨點選一下右下角的【推薦】

如果您希望與我交流互動,歡迎微網誌互粉

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

繼續閱讀