Linux下Hadoop Eclipse插件編譯安裝


Linux下Hadoop Eclipse插件編譯安裝

剛剛開始研究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-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的二進制編譯版)。另外編譯時會自動聯網下載需要的包,所以請保證網絡通暢。

最后,我把我的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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM