wiki:waue/2009/0818

Version 9 (modified by waue, 15 years ago) (diff)

--

編譯 hadoop

0. environment

編譯hadoop 需要額外安裝 ant, forrest ,而forrest 需要安裝 java-1.5 來編譯

hadoop 安裝於 /opt hadoop_home = /opt/hadoop
forrest 目錄/opt/forrest-0.8 下載
java 5 目錄/usr/lib/jvm/java-1.5.0-sun
java 6 目錄/usr/lib/jvm/java-6-sun

1. svn checkout

$ cd /opt
$ sudo svn co http://svn.apache.org/repos/asf/hadoop/common/trunk
$ sudo mv trunk hadoop
$ sudo chown `$USER:$USER` hadoop

2. forrest

  • 下載並解壓縮 apache forrest 於 /opt/forrest-0.8後
$ sudo update-alternatives --set java /usr/lib/jvm/java-1.5.0-sun/jre/bin/java
$ sudo update-alternatives --set javac /usr/lib/jvm/java-1.5.0-sun/bin/javac
$ JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
$ cd /opt/forrest-0.8/main
$ build.sh

3. ant

3.1 說明

  • 程式碼在 /opt/hadoop/src 內
  • 改完程式碼之後,執行ant 來產生相對應檔案
  • ant 的編譯規則在 build.xml 可以讀此檔以瞭解到動作與其相依的訊息
    • 設定屬性值
       <property name="Name" value="Hadoop-core"/>
      
    • ant 的動作,如執行 ant docs 會參考此動作敘述
        <target name="docs" depends="forrest.check" description="檢查說明" if="forrest.home">
          <exec dir="${docs.src}" executable="${forrest.home}/bin/forrest" failonerror="true">
            <env key="JAVA_HOME" value="${java5.home}"/>
          </exec>
          <copy todir="${build.docs}">
            <fileset dir="${docs.src}/build/site/" />
          </copy>
        </target>
      

執行

  • 產生 Hadoop-Core-${version}.tar.gz
    $ sudo update-alternatives --set java /usr/lib/jvm/java-6-sun/jre/bin/java
    $ sudo update-alternatives --set javac /usr/lib/jvm/java-6-sun/bin/javac
    $ JAVA_HOME=/usr/lib/jvm/java-6-sun
    $ ant -Djava5.home=/usr/lib/jvm/java-1.5.0-sun -Dforrest.home=/opt/forrest-0.8 tar
    
  • 產生的檔案會放在 /opt/hadoop/build 內

問題

  • 執行 ant tar 時,depends 了七個動作: compile, jar, javadoc, docs, api-report, jar-test 。然而docs這個動作一直編譯不過。
$ ant -Djava5.home=/usr/lib/jvm/java-1.5.0-sun -Dforrest.home=/opt/forrest-0.8 tar

出現錯誤訊息

[exec] Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file
javac: invalid target release: 1.6

原因:因為rcc 需要用java 1.6 才能跑