IntelliJ IDEA2018配置Hadoop2.7.2閱讀環境並執行偽分散式
1. 下載hadoop原始碼並編譯
$ sudo tar -zxvf hadoop-2.7.2-src.tar.gz
將解壓縮的原始碼包,複製到/usr/local
目錄下:
$ sudo cp -rf hadoop-2.7.2-src /usr/lcoal
② 根據hadoop-2.7.2-src
中BUILDING.txt
中的要求,配置好編譯環境。
可以參考另一篇博文hadoop原始碼編譯環境配置
③ 編譯Hadoop2.7.2原始碼
進入/usr/local/hadoop-2.7.2-src
進行原始碼編譯,編譯命令如下:
$ mvn clean package -Pdist,native -DskipTests -Dtar
編譯成功,資訊顯示如下(後面部分,不完整):
2. 配置IntelliJ IDEA2018的maven環境
① maven路徑配置
(1)未開啟專案,通過configure–>Settings
開啟;如果已經打開了專案,可以通過File–>Settings
開啟,如圖:
(2)在搜尋框中輸入maven
,選擇左側Maven
選項,在Maven home directory:
中,選擇自己剛剛配置好的maven home路徑:
在User setting file:
中,選擇剛剛配置好的,本機的settings.xml檔案:
下面的Local repository:
,idea會自動檢測,如上圖所示。
② maven的JDK配置
Importing
選項,設定JDK for importer
,改為剛剛安裝的jdk home路徑(也可以忽略這一步):
3. 以maven方式匯入編譯好的hadoop原始碼:
(1)選擇Import Project
,匯入已經存在的hadoop專案:
(2)選擇編譯好的hadoop原始碼(自己這裡叫hadoop-plugin
),點選OK:
(3)在Import project from external model
中選擇Maven
(一般idea已經自動選擇好了),點選OK:
(4)接下來的視窗中,不需要選擇任何選項,直接點選Next:
(5)接下來的視窗中,不需要選擇任何選項,直接點選Next:
org.apache.hadoop:hadoop-main:2.7.2
已經被選中,直接點選Next:
(7)選擇配置好的JDK版本(Name
)以及路徑(JDK home path
),點選Next:
(8)首先檢查檔案路徑是否正確,再點選Finish:
等待idea自己完成匯入,就已經OK了。
4. 開啟hadoop偽分散式環境:
hadoop分散式環境需要Namenode、Datanode、Resourcemanager、Nodemanager四個基本程序,通過找到Namenode.java
、Datanode.java
、Resourcemanager.java
、Nodemanager.java
中的main()
函式,開啟hadoop偽分散式環境。
① 開啟Namenode程序
(1)通過快捷鍵Ctrl+N
,搜尋namenode
,找到位於包org.apache.hadoop.hdfs.server.namenode
中的NameNode類,點選開啟:
(2)在程式碼框中,右鍵選擇Debug 'NameNode.main()'
,通過debug的方式開啟Namenode程序:
build完成後報錯如下:
解決方法: 這是因為不同模組之間的依賴未新增,找不到的類,屬於hadoop-common模組。
-
點選選單
File-->Project structure
,在左側欄選擇Module
,在中間的列表中選擇hadoop-hdfs
,在中上位置的tab中,選擇Dependencies
。在中間的依賴列表中,找到hadoop-common
,將其scope更改為Provided
: -
勾選
hadoop-common
,點選Apply,發現彈出錯誤: -
重新在中間欄找到
hadoop-streaming
,選擇Source
,點選最右邊的/../conf
後面的x,在彈出的視窗中點選Yes: -
再重新回到
hadoop-hdfs
,重新勾選hadoop-common
點選Apply,再點選OK即可。 -
再點選選單欄
Run-->Edit configuration
,在出現的視窗中,勾選Include dependencies with 'Provided' scope
,點選OK,重新以debug方式執行NameNode.main()
: (3)重新執行以後,發現NameNode程序啟動成功,但是自動退出。這是因為首次執行NameNode,需要進行格式化(format): 解決方法: 點選選單欄Run-->Edit configuration
,在出現的視窗中,在Program arguments
處新增-format
,點選OK,再重新debug執行: debug執行的結果如下,因為我這裡已經格式化過,所以需要我自己決定是否重新格式化: (4)點選選單欄Run-->Edit configuration
,在出現的視窗中,在Program arguments
處去除剛剛新增的-format
,點選OK,再重新debug執行。發現NameNode程序還是啟動成功,但是又自動退出:
解決方法: 找到hadoop-hdfs-->src-->main
,右鍵單擊,選擇Mark Directory as-->Source root
,設定好後,main目錄資料夾圖示變成下圖所示:
(5)重新debug執行,發現NameNode程序啟動成功,並未退出!
② 開啟Datanode程序
(1)通過快捷鍵Ctrl+N
,搜尋datanode
,找到位於包org.apache.hadoop.hdfs.server.datanode
中的DataNode類,點選開啟:
(2)在程式碼框中,右鍵選擇Debug 'DataNode.main()'
,通過debug的方式開啟DataNode程序:
build報錯如下:
解決方法: 點選選單欄Run-->Edit configuration
,在出現的視窗中,勾選Include dependencies with 'Provided' scope
,點選OK,重新以debug方式執行DataNode.main()
:
(3)由於自己已經格式化過namenode,再次格式化namenode之前,之前應該刪除/tmp
目錄下的所有檔案,我的是/tmp/hadoop-lucy
。
原因: 當我們執行檔案系統格式化時,會在namenode資料資料夾(即配置檔案中dfs.name.dir在本地系統的路徑)中儲存一個current/VERSION檔案,記錄namespaceID,標誌了所有格式化的namenode版本。如果我們頻繁的格式化namenode,那麼datanode中儲存(即dfs.data.dir在本地系統的路徑)的current/VERSION檔案只是你地第一次格式化時儲存的namenode的ID,因此就會造成namenode和datanode之間的ID不一致。
③ 開啟ResourceManager程序
(1)通過快捷鍵Ctrl+N
,搜尋resourcemanager
,找到位於包org.apache.hadoop.yarn.server.resourcemanager
中的ResourceManager類,點選開啟:
(2)在程式碼框中,右鍵選擇Debug 'ResourceManager.main()'
,通過debug的方式開啟ResourceManager程序:
build報錯如下:
解決方法: 點選選單欄Run-->Edit configuration
,在出現的視窗中,勾選Include dependencies with 'Provided' scope
,點選OK,重新以debug方式執行ResourceManager.main()
:
④ 開啟NodeManager程序
(1)通過快捷鍵Ctrl+N
,搜尋nodemanager
,找到位於包org.apache.hadoop.yarn.server.nodemanager
中的NodeManager類,點選開啟:
(2)在程式碼框中,右鍵選擇Debug 'NodeManager.main()'
,通過debug的方式開啟NodeManager程序:
build報錯如下:
解決方法: 點選選單欄Run-->Edit configuration
,在出現的視窗中,勾選Include dependencies with 'Provided' scope
,點選OK,重新以debug方式執行NodeManager.main()
: