Hadoop3.2.1的eclipse外掛編譯嘗試
Hadoop3.2.1的eclipse外掛編譯嘗試(失敗)
內容
環境及軟體:
-
VMware workstation pro 15
-
CentOS 8
-
jdk1.8_202
-
Eclipse-Oxygen
-
Hadoop-3.2.1
-
ant元件
-
hadoop-eclipse-plugin原始檔
流程:
- 編譯準備
- hadoop-eclipse-plugin原始檔分析
- 編譯檔案修改
- 根據java錯誤日誌進行修改
- 最後的失敗
編譯準備
-
先準備Hadoop環境,安裝VMware、CentOS虛擬機器、jdk、Hadoop、ant元件、eclipse,可以百度或看我之前的筆記。
-
在Github下載hadoop-eclipse-plugin原始檔:
原2x版本:https://github.com/winghc/hadoop2x-eclipse-plugin
有人提交的3x版本:https://github.com/Woooosz/eclipse-hadoop3x
兩個版本其實都一樣(最後問題都卡在同一個地方),但是,所謂的3x版本需要的編譯檔案比2x版本還少,估計不靠譜。
hadoop-eclipse-plugin原始檔分析
為了儘可能成功地編譯外掛,最好對原始檔結構有所瞭解,在參考學習許多博文和對原始檔測試、分析、大膽猜測後,大致得出以下結構(由於不會ivy和ant,可能有些地方不對):
-
首先,原始檔的根目錄有以下檔案和資料夾:
-
release資料夾
裡面存放的是已經編譯好的jar包,距今已有至少6年的歷史,適用於2.6及以下版本。
-
ivy.xml檔案和ivy資料夾
用於專案依賴管理,有關ivy知識可以百度瞭解(因為我也不會),稍後我們需要修改ivy資料夾中的libraries.properties檔案(用於儲存要用的軟體、依賴包的版本資訊)以適應新版本Hadoop,xxx.properties都屬於配置檔案,用於儲存配置資訊。
-
src資料夾
外掛的主要資料夾,功能實現和介面、構建檔案等都在裡面
-
-
進入src資料夾
- 首先我們能看到一個ivy.xml和ivy資料夾,我也不知道有啥用,刪掉也對外掛編譯沒有影響,和根目錄下的ivy結構內容完全一樣,可能是特殊設定?
- 另外是一個contrib資料夾
-
再進入src下的contrib資料夾
-
build.xml
根據裡面的資訊,推測是正常構建失敗後,用於測試修復的檔案。
-
build-contrib.xml
為build.xml構建流程儲存的路徑、檔案等配置資訊。
-
eclipse-plugin資料夾
顧名思義,是真正的外掛資料夾
-
-
contrib資料夾
-
ivy.xml和ivy資料夾
使用的是根目錄下ivy資料夾,根目錄大概是一種全域性設定,在這裡可以設定版本資訊,猜測是可以覆蓋原來的版本資訊(註釋這樣寫的,沒試過)。
-
build.xml和build.properties
主要的構建檔案,會引用ivy和其他檔案所儲存的配置資訊包括依賴包版本號、各種檔案路徑等,之後我們需要在這裡編輯檔案資訊。
-
src資料夾
類似於我們在java專案中的src包,儲存外掛實現的各種java包、類,實現對eclipse和hadoop的介面、操作等功能,大致功能根據包類的命名可以搞清楚,不多細說。
-
resources資料夾
儲存在外掛在eclipse中要用到的圖片、提示資訊等,通過src中相應功能的類呼叫
-
makePlus.sh
儲存了一個示例命令,麼啥用。
-
plugin.xml
裡面是構建編譯src內外掛操作、ui、介面構建需要的資訊,感覺不需要更改。
-
編譯檔案修改
對於3x版本的Hadoop,依賴jar包的版本和數量發生了不少變化,而所使用的eclipse的版本也發生了變化,這是我認為外掛無法使用的主要原因,為此,需要對外掛原始檔進行修改,在對很多博文學習參考大概有以下幾點需要修改:
簡略地講,我們需要通過修改build.xml檔案來達到成功構建的目的,為此我們不妨先通過執行編譯命令來看看哪裡會出錯:
在contrib資料夾下:
ant jar -Dversion=Hadoop版本號 -Dhadoop.version=Hadoop版本號 -Declipse.home=eclipse根目錄路徑 -Dhadoop.home=Hadoop根目錄路徑
然後我們會發現:跑到一半停住不動了??會在這裡停住:
ivy-resolve-common:
這是因為在build過程中會有對ivy的依賴項查詢,由於我也不知道的原因,這裡查不到,而且根據我對某個檔案的分析,會停留很長時間。
但事實上,在plugin中並沒有用到有關內容,所以我們可以直接刪除了事:
開啟build.xml檔案,刪除相關內容:
<target name="compile" depends="init, ivy-retrieve-common" unless="skip.contrib">
修改為:
<target name="compile" unless="skip.contrib">
這樣,我們就可以繼續build。
繼續執行命令,將碰到第二個問題:xxx檔案無法拷貝,因為找不到。
這是由於版本造成的問題,開啟build.xml,在檔案末尾我們可以看到copy了大量jar檔案,細看path內容,我們會發現檔名稱是引用變數,這些變數儲存在根目錄下ivy資料夾的libraries.properties檔案中。
從上面可以知道,這個檔案是用來儲存版本配置資訊的,我們需要更改裡面的版本為我們的hadoop的版本,通過對build.xml檔案的分析,我們需要根據 hadoop根目錄/share/hadoop/common/lib下jar包的不同版本修改改/ivy/libraries.properties中的對應版本號
這裡我推薦原2x版本Github下一個大佬提交的版本資訊->Update libraries.properties,同時還有他提交的build.xml檔案->Update build.xml,這是他為2.8版本做的,十分詳盡,我們可以參考他進行修改,當然,新版本也會有其他的改動,適當刪減,然後在build.xml內對於沒有的jar包刪除copy項,對於新增的jar包增加copy項,最終達到build完成的目的。
在修改完版本號後我們便可以再次編譯,編譯成功後,會在hadoop2x-eclipse-plugin-master/build/contrib路徑下生成了jar包:hadoop-eclipse-plugin-x.x.x.jar,其他的檔案不用理,只是把jar包裡的檔案列出來而已。
然後我們可以百度Hadoop-eclipse外掛啟動過程來啟動外掛
根據java錯誤日誌進行修改
當然,還有內容,說明仍然無法使用,使用之前生成的jar包,會發現右鍵Add New Location無反應,到目前為止,我們無從得知到底是哪發生錯誤。
這裡我們可以根據一個知乎大佬的方法進行排查:
連結:https://zhuanlan.zhihu.com/p/38630695
大致來說,就是根據java的錯誤日誌分析引發錯誤的原因,併成功找到兩個缺失的jar包:
woodstox-core-x.x.x.jar
stax2-api-x.x.x.jar
依舊是利用前面的方法進行新增。
最後的失敗
然而的然而,最後還是不能用。
前面提到,外掛能否使用,取決於以下3點:
- Hadoop版本
- Eclipse版本
- Hadoop配置資訊
可能是因為Hadoop配置的原因,導致最後無法遠端連線Hadoop,錯誤提示是無法例項化hadoop的使用者組資訊類,沒找到相關依賴包或更有效資訊。
無奈使用了2x版本。
比較有價值的參考:
https://blog.csdn.net/forking2009/article/details/77250533
基於idea的hadoop外掛-HadoopIntellijPlugin
ERROR org.apache.hadoop.security.UserGroupInformation
Could not initialize class org.apache.hadoop.conf.Configuration