Linux下Hadoop Eclipse插件編譯安裝

轉載自:http://www.cnblogs.com/kinuxroot/archive/2013/05/06/linux_hadoop_eclipse_plugin.html

在RedHat,hadoop1.1.2下測試通過。有些地方註明詳細了。


剛剛開始研究Hadoop,在寫Map Reduce程序的時候覺得用vim不夠用,於是想在Eclipse下面配置一下相關的環境。
按照Hadoop in Action的說法,本來想用Hadoop Studio,但是發現現在只有30天的試用版,於是找了一下,發現Hadoop本身有帶Eclipse的插件,於是覺得可以用一下。 不過又發現Hadoop的Eclipse插件現在沒有二進制版直接提供,只能自己編譯。不過要注意,一定要下載Hadoop的src包,不然是不帶源代碼的。
編譯部署中間碰到了一點問題,記錄下來。


首先,講一下系統環境,Linux的發行版是Linux Mint 14,Hadoop版本是1.1.2。
我的hadoop安裝在/home/kinuxroot/apps/hadoop-1.1.2下面(hadoop的根路徑),所以源代碼的目錄是hadoop根路徑下的src/contrib/eclipse-plugin。
Eclipse安裝路徑是/home/kinuxroot/apps/eclipse。

接下來我們來講一下具體如何編譯。
我們進入hadoop根路徑下的src/contrib/eclipse-plugin,然後修改一下build.xml。
具體做如下修改:


1.先要加入eclipse的設定和hadoop的版本設定,我的eclipse安裝在/home/kinuxroot/apps/eclipse下,所以我們要修改爲:

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

這一步,location中的路徑請大家根據各自的實際路徑進行修改。


2.我們需要引用hadoop的一些包,但是默認的classpath沒有這些包(我們沒有從頭編譯)。所以需要修改classpath
定位<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設置。定位compile的target,修改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錯誤,其實就是找不到類
找到

<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中,你可以手動複製,但是我們希望ant幫我們自動部署進去。
我們新建一個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/eclipse-plugin/META-INF,修改這個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的二進制編譯版)。另外編譯時會自動聯網下載需要的包,所以請保證網絡通暢。

注:在src/contrib/eclipse-plugin/目錄下執行:

/usr/local/apache-ant-1.9.3/bin/ant

一定是要root根用戶權限下執行上面的ant命令!


最後,我把我的build.xml貼在下面,大家可以參考:

複製代碼
<?xml version="1.0" encoding="UTF-8" standalone="no"?><!--   Licensed to the Apache Software Foundation (ASF) under one or more   contributor license agreements.  See the NOTICE file distributed with   this work for additional information regarding copyright ownership.   The ASF licenses this file to You under the Apache License, Version 2.0   (the "License"); you may not use this file except in compliance with   the License.  You may obtain a copy of the License at       http://www.apache.org/licenses/LICENSE-2.0   Unless required by applicable law or agreed to in writing, software   distributed under the License is distributed on an "AS IS" BASIS,   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   See the License for the specific language governing permissions and   limitations under the License.--><project default="deploy" name="eclipse-plugin"><import file="../build-contrib.xml"/><property name="eclipse.home" location="/home/kinuxroot/apps/eclipse"/><property name="version" value="1.1.2"/><path id="eclipse-sdk-jars"><fileset dir="${eclipse.home}/plugins/"><include name="org.eclipse.ui*.jar"/><include name="org.eclipse.jdt*.jar"/><include name="org.eclipse.core*.jar"/><include name="org.eclipse.equinox*.jar"/><include name="org.eclipse.debug*.jar"/><include name="org.eclipse.osgi*.jar"/><include name="org.eclipse.swt*.jar"/><include name="org.eclipse.jface*.jar"/><include name="org.eclipse.team.cvs.ssh2*.jar"/><include name="com.jcraft.jsch*.jar"/></fileset></path><!-- Override classpath to include Eclipse SDK jars --><path id="classpath"><pathelement location="${build.classes}"/><pathelement location="${hadoop.root}/build/classes"/><fileset dir="${hadoop.root}"><include name="**/*.jar"/></fileset><path refid="eclipse-sdk-jars"/></path><!-- Skip building if eclipse.home is unset. --><target name="check-contrib" unless="eclipse.home"><property name="skip.contrib" value="yes"/><echo message="eclipse.home unset: skipping eclipse plugin"/></target><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}"     deprecation="${javac.deprecation}"     includeantruntime="on"><classpath refid="classpath"/></javac></target><!-- Override jar target to specify manifest --><target name="jar" depends="compile" unless="skip.contrib"><mkdir dir="${build.dir}/lib"/><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"/><echo message="${build.dir}"/><echo message="${root}"/><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><target name="deploy" depends="jar" unless="skip.contrib"><copy file="${build.dir}/hadoop-${name}-${version}.jar"  todir="${eclipse.home}/plugins" verbose="true"/></target></project>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章