1. 程式人生 > >(window7中)maven 編譯hadoop2.5.0原始碼

(window7中)maven 編譯hadoop2.5.0原始碼

如果僅僅是原始碼閱讀,可以在eclipse上新建好專案,將下載解壓好的src包匯入已經存在的專案裡即可。
以下僅僅為在window下的編譯過程,後來發現在linux下是更方便的。

準備工作

基本操作流程

windos下解壓hadoop-2.5.0-src.tar.gz檔案後路徑如下
這裡寫圖片描述
步驟1、cmd 切換到hadoop專案的根目錄 e:/hadoop-2.5.0-src
mvn package -Pdist -DskipTests -Dtar 這個命令是將hadoop程式碼打包成jar,執行該命令會根據該目錄的所有pom.xml下載相關的資源
這裡寫圖片描述

步驟2

、切換到 e:/hadoop-2.5.0-src/hadoop-maven-plugins
執行 mvn install ,該命令有兩個作用,第一個跟mvn package相似打包成jar,第二個是將打包的jar載入到maven的本地倉庫中去
這裡寫圖片描述
使用mvn install 應該是會下載資源一致的

步驟3、切換回e:/hadoop-2.5.0-src 建立myeclipse專案
mvn eclipse:eclipse -DskipTests

步驟4、匯入Myeclipse
file →import 選擇General下的Existing Projects into Workplace點選next,選擇一個根目錄,匯入所有的專案
這裡寫圖片描述

正常情況下,hadoop原始碼的匯入eclipse已經完成。

下面是一些可能遇到的錯誤以及解決方法

關於maven錯誤

錯誤1
在處理過程中 Apache Hadoop Annotations 專案 failure,後續的所有專案都跳過了,部分錯誤資訊如下(忘記截圖)

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-javadoc-plugin:2.8.1:jar (module-javadocs) on project hadoop-maven-plugins
....
[INFO] An error has occurred in
JavaDocs report generation:Exit code: 1 - java.lang.IllegalArgumentException    at sun.net.www.ParseUtil.decode(ParseUtil.java:189)    at sun.misc.URLClassPath$FileLoader.(URLClassPath.java:953)    at sun.misc.URLClassPath$3.run(URLClassPath.java:326)

注意:這裡報的是 java.lang.IllegalArgumentException錯誤,該問題是由環境變了classpath引起的
解決方法:將環境變數classpath中的%JAVA_HOME%改為實際的java_home路徑即可
注:還有一種是使用了JDK1.8導致的某個字串解析錯誤,根據網路上的說明是jdk1.8無法向下相容,換成jdk1.7即可

錯誤2

[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2:exec (com
pile-ms-winutils) on project hadoop-common: Command execution failed. Cannot run
 program "msbuild" (in directory "E:\hadoop-2.5.0-src\hadoop-common-project\hado
op-common"): CreateProcess error=2, ????????? -> [Help 1]

這裡寫圖片描述
檢視錯誤資訊,原來是執行 mvn install的路徑錯了,需要再hadoop-maven-plugins下,切換到該目錄,果然成功

關於匯入myeclipse的錯誤

    參考文件 http://www.2cto.com/database/201410/347773.html

問題一 hadoop-commom專案下,ipc.protobuf為空,導致引用該包的對應類錯誤,原因是 org.apache.hadoop.ipc.protobuf無法解析
這裡寫圖片描述
解決方法:
對應的類存放位置為 e:/hadoop-2.5.0-src/hadoop-common-project/hadoop-common/src/test/proto
這裡使用protoc進行編譯,進入protoc的目錄
執行命令 protoc –java_out= e:/hadoop-2.5.0-src/hadoop-common-project/hadoop-common/src/test/proto/java *.proto
由於切換到 proto目錄發現protoc無法執行,可能是環境變數未配置好
這裡寫圖片描述
將protco安裝目錄下的src目錄找到檔案 protoc.exe 複製到 e:/hadoop-2.5.0-src/hadoop-common-project/hadoop-common/src/test/proto
執行如下命令,可以看到protoc –version執行成功
這裡寫圖片描述
確認protoc可以執行後,在當前目錄下執行 protoc –java_out =../java *.proto 如上圖
由於不知道如何在MyEclipse中直接更新這種複製過來的maven專案,所以只能重新更新一遍然後匯入
切換回 E:/hadoop-2.5.0-src 先執行命令 mvn eclipse:clean
再重新執行 mvn eclipse:eclipse生成eclipse專案
刪除Myeclipse中的hadoop-commom專案後重新匯入,結果如下,可以看到ipc.protobuf包已經為非空
這裡寫圖片描述

問題二 AvroRecord 類缺失
這裡寫圖片描述
出現這種情況是因為存在 avro-tools-*.jar 等相關依賴沒有,這個時候解決該問題有兩種方法,可以選擇自己編譯對應的jar,也可以修改pom.xml檔案,這裡選擇的是第二種
解決方案
修改 E:\hadoop-2.5.0-src\hadoop-common-project\hadoop-common 下的pom.xml 檔案
1、增加依賴
<dependencies></dependencies>內增加

<dependency>
   <groupId>org.apache.avro</groupId>
   <artifactId>avro</artifactId>
   <version>1.7.4</version>
</dependency>

這裡寫圖片描述
2 增加引用外掛的源,在<plugins></plugins>內增加如下內容(注意,可能已經存在,如果存在覆蓋即可)
增加內容如下

 <plugin>
  <groupId>org.apache.avro</groupId>
  <artifactId>avro-maven-plugin</artifactId>
  <version>1.7.4</version>
  <executions>
    <execution>
      <phase>generate-sources</phase>
      <goals>
        <goal>schema</goal>
      </goals>
      <configuration>
        <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>
        <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.6</source>
    <target>1.6</target>
  </configuration>
</plugin>

這裡寫圖片描述

3、對eclipse專案進行更新,在e:/hadoop-2.5.0-src目錄下 先執行 mvn eclipse:clean 再執行 mvn eclipse:eclipse
之後重新匯入eclpise

問題三、 hadoop-streaming 錯誤 ,在該專案的propertie中移除錯誤,如下圖
這裡寫圖片描述

問題四、hadoop-common下有一個包叫 protobuf,在我的專案裡該包報錯,刪除該包即可,具體這個包怎麼來的不太清楚,可能是在用maven做了各種更新導致的