一、在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環境,步驟如下:
如果安裝外掛成功,開啟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