1. 程式人生 > >Hadoop-0.20.2原始碼學習(2)——原始碼學習環境搭建

Hadoop-0.20.2原始碼學習(2)——原始碼學習環境搭建

參考: JeffreyZhou的部落格園
《Hadoop權威指南》第四版

0 本文前提

在上一篇文章中,通過啟動指令碼xxx.sh檔案的探索,對hadoop的原始碼有了一個初步的認識,發現最終都是執行java程式,所以在繼續深入瞭解之前,先來搭建一個用來檢視hadoop中,java原始碼的環境,所以這本文主要在於在eclipse中搭建一個合適的專案。

2.1 建立Eclipse專案

廢話不多說,就正常建立就行了
new Project–>java Project–>命名為HadoopSrcStudy


在這裡插入圖片描述

2.2 新增原始碼

接下來,新增原始碼,將上篇文章中,即hadoop下面的src資料夾中的檔案,就先看最核心的三個資料夾吧corehdfsmapred。直接複製這三個資料夾,在HadoopSrcStudy專案下貼上就行了。

在這裡插入圖片描述

但光有這三個資料夾還不夠,不能當成原始碼來編譯,所以在Project上,右鍵,開啟屬性(Properties),左邊欄選擇Java Build Path,再右邊欄選擇Source,點選新增Add Folder,將對應的三個目錄,新增進行。ok,得到和原始碼一樣的目錄:

在這裡插入圖片描述

2.3 新增Jar包

在上圖中可以看到,自動編譯產生了好多個錯誤,這是因為少了Jar包(個人覺得這是缺失依賴),那麼新增Jar包吧。

所以我們先在原始碼目錄下建一個jar的資料夾。然後將以下目錄下的jar檔案都複製進來。

hadoop-0.20.2/build/ivy/lib/Hadoop/common/*.jar
hadoop-0.20.2/lib/jsp-2.1/*.jar
hadoop-0.20.2/lib/kfs-0.2.2.jar
hadoop-0.20.2/lib/hsqldb-1.8.0.10.jar

得到如圖:
在這裡插入圖片描述

然後再次開啟Project的Properties,選擇BuildPath頁,選擇Libraries,點選Add Jars。選擇剛才建立的Jar資料夾中的所有Jar檔案,ok。
在這裡插入圖片描述
然後,就可以看到Bug立即減少了,但是還有一個頑強的bug提示,就是這個RccTask檔案:

在這裡插入圖片描述

根據參考來源以及後續的實踐,直接將這個排除掉,對著該檔案右健選單Build Path->Exclude即可。

好了,此時一個bug也沒有了。

2.4 新增配置檔案

還記得在前面學習MapReduce框架時,在使用eclipse執行MR程式時,需要將幾個檔案新增到專案中的src目錄下,也解釋了為啥要這樣。那麼在這裡也是一樣。

Hadoop-Eclipse-Plugin的Advanced parameters作為Hadoop執行引數,如果未修改,則預設是單機模式引數,程式執行時讀取的是本地目錄,而非HDFS目錄,而log4j用於記錄程式的輸出日記,需要log4j.properties這個配置檔案,若無,雖然不影響程式執行,但執行時無法看到任何提示訊息。預設是單機模式的。

所以,將hadoop-0.20.2目錄下conf資料夾下的core-site.xml、hdfs-site.xml、mapred-site.xml、log4j.properties這幾個檔案,放在src目錄下。

將hadoop-0.20.2目錄下src資料夾下的,webapps複製到src目錄下。

在eclipse中,src目錄下建一個package,名為:org.apache.hadoop,然後將hadoop-0.20.2\build\src\org\apahe\hadoop\package-info.java檔案,複製到該package下。

最終目錄如下:

在這裡插入圖片描述
這樣原始碼除錯環境就OK了。

2.5 執行測試

原始碼已經加入,並且已經編譯通過了,接下來得在eclipse中跑一下,試下是否能正常跑起來。

在這裡要注意一個問題,不然會執行出錯,朋友們要先看下這個小插曲再繼續(見本文後記)


這裡我們嘗試,用命令列中執行namenode,然後用eclipse執行datanode,然後再開一個命令列,用fs命令,是否能查到之前的內容。

  1. 開啟命令列,進入hadoop-0.20.2目錄,執行bin/hadoop namenode

  2. 在eclipse中,進入hdfs目錄,再進入org.apache.hadoop.hdfs.server.datanode目錄,開啟DataNode.java檔案,然後點上面的執行,然後就可以看到在eclipse中,正常的輸出資訊,且沒有錯誤。該資訊,可以在log資料夾下,找到datanode的日誌,其內容是一樣的。 同時在前面的命令列窗體中,可以看到namenode程式中收到一個datanode的接入請求,如圖:

在這裡插入圖片描述

  1. 再開啟一個命令列視窗(ctr+shift+T),進入hadoop-0.20.2目錄bin/hadoop fs –ls,就可以看到輸出了檔案列表。

在這裡插入圖片描述

如果上面兩個命令都執行成功,說明namenode和在eclipse中執行的datanode都起作用了,說明它工作了。另外,也可以用jps來檢視是否後後臺程序NameNode和DataNode。

:根據在後記裡說的,本例沒有對0.20.2版本的hadoop進行(偽)分散式配置,所以預設為單機模式,DN和NN都在本機中。

同樣,我們還可以反過來,在eclipse中執行namenode,在命令列中執行datanode。同樣的效果。

為了可以看到更多的除錯日誌輸出,我們還可以開啟src下的log4j.properties檔案,在第二行中的INFO改成DEBUG,這樣輸出的內容會更詳細。

再注:參考部落格中,只提到了如何用命令列開啟程序,但這樣的話,有可能在一瞬間腦子短路(比如我)不知道咋stop了,因為在命令列中啟動後,一直處於執行狀態中,此時,最簡單粗暴的就是直接kill掉程序。

如上圖中,通過jps可以看到NameNode和DataNode的pid號,那麼就直接kill掉吧。

在這裡插入圖片描述

done !

2.6 後記

我原是在4個虛擬機器上,一主節點,三子節點,搭建分散式hadoop,其版本為2.7.6,然後在此基礎上學習了一下hdfs和mapreduce,然後才開始學習原始碼。

But,我是單獨去下載hadoop0.20.2壓縮包,直接解壓到hadoop-src中,作為原始碼學習的,所以,從剛開始到現在,本機中有兩個hadoop版本!!

同樣,無論是環境變數,還是eclipse中已有的DFS Location,都是原先的hadoop2.7.6,所以,在本例中,此處不能直接在命令列中執行命令。咋辦呢?

要知道,環境變數的前提是,優先執行當前目錄,再去環境目錄下尋找,所以,我們進入hadoop0.20.2的bin目錄下,再來執行命令,這樣執行的就是0.20.2版本的hadoop了,而不是2.7.6/。

當然,在執行前,先用jps命令看看,是否已經啟動了2.7.6版本的hadoop,是的話要先stop。
在這裡插入圖片描述