Mac編譯Hadoop源碼

單純看書(shū)翻源碼非常枯燥狈谊,為了單步debug追Hadoop源碼,最好先在部署環(huán)境編譯一份源碼竞惋,以避免各種環(huán)境問(wèn)題试溯。

本文記錄了猴子在自己的Mac上編譯Hadoop源碼的過(guò)程蔑滓,結(jié)合之前的一次編譯經(jīng)驗(yàn)郊酒,基本覆蓋了編譯Hadoop源碼時(shí)可能遇到的主要問(wèn)題遇绞。

隨著debug的進(jìn)一步深入,后期可能涉及到對(duì)源碼的修改燎窘,需要多次重新編譯摹闽。因此,這一關(guān)是繞不過(guò)的褐健。

版本聲明

  • 源碼:Apache Hadoop 2.6.0
  • 系統(tǒng):macOS 10.12.4
  • 依賴(lài):
    • oracle jdk 1.7.0_79
    • Apache Maven 3.5.0
    • libprotoc 2.5.0

編譯

核心命令

mvn install -DskipTests -Pdist,native -Dtar

時(shí)間長(zhǎng)

Hadoop源碼量巨大付鹿、依賴(lài)眾多,編譯時(shí)間比較長(zhǎng)蚜迅。

下載jar包和編譯protoc是兩個(gè)大頭舵匾。編譯protoc用了1小時(shí)左右,下載jar包+編譯Hadoop用了2個(gè)多小時(shí)谁不。除去這些時(shí)間坐梯,也需要1小時(shí)左右才能編譯成功。

還好上半年為了看Yarn的狀態(tài)機(jī)編譯過(guò)一回刹帕,雖然是不完全編譯吵血,但也下載了大部分依賴(lài)的jar包,并編譯安裝了protoc(強(qiáng)烈建議編譯安裝偷溺,忘記當(dāng)時(shí)有什么坑來(lái)著)蹋辅。這次只需要繼續(xù)踩上次剩下的坑了。

不過(guò)挫掏,鑒于第一次編譯時(shí)侦另,大部分人都會(huì)重復(fù)多次才能編譯成功,單次編譯的時(shí)間也沒(méi)什么意義了。喝杯茶褒傅,慢慢來(lái)吧硫麻。

JDK版本

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) on project hadoop-annotations: Compilation failure: Compilation failure:
[ERROR] /Volumes/Extended/Users/msh/IdealProjects/Git-Study/hadoop/hadoop-common-project/hadoop-annotations/src/main/java/org/apache/hadoop/classification/tools/ExcludePrivateAnnotationsJDiffDoclet.java:[20,22] 錯(cuò)誤: 程序包c(diǎn)om.sun.javadoc不存在

不明白為啥這個(gè)包會(huì)不存在,可能是JDK版本問(wèn)題樊卓。google一番拿愧,參考解決Mac OS 下編譯Hadoop Annotations 程序包c(diǎn)om.sun.javadoc找不到問(wèn)題解決。

驗(yàn)證

在所有的pom.xml里面找設(shè)置1.7 jdk的地方:

find . -name pom.xml > tmp/tmp.txt

while read file
do
    cnt=0
    grep '1.7' $file -C2 | while read line; do
        if [ -n "$line" ]; then
            if [ $cnt -eq 0 ]; then
                echo "+++file: $file"
            fi
            cnt=$((cnt+1))
            echo $line
        fi
    done
    cnt=0
done < tmp/tmp.txt

輸出:

+++file: ./hadoop-common-project/hadoop-annotations/pom.xml
</profile>
<profile>
<id>jdk1.7</id>
<activation>
--
<activation>
<jdk>1.7</jdk>
</activation>
<dependencies>
--
--
<groupId>jdk.tools</groupId>
<artifactId>jdk.tools</artifactId>
<version>1.7</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
+++file: ./hadoop-project/pom.xml
...(略)

確實(shí)./hadoop-common-project/hadoop-annotations/pom.xml中限制了jdk版本碌尔。

解決

猴子Mac上的默認(rèn)JDK是oracle jdk1.8.0_102的浇辜,翻了下jdk源碼也有這個(gè)包。說(shuō)明不是因?yàn)樵摪鼘?shí)際不存在唾戚。

可以嘗試修改pom里限制的jdk版本柳洋;不過(guò),為了防止使用了deprecated方法等麻煩叹坦,這里直接切jdk 1.7熊镣,不改pom。

openssl環(huán)境變量

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (make) on project hadoop-pipes: An Ant BuildException has occured: exec returned: 1
[ERROR] around Ant part ...<exec dir="/Volumes/Extended/Users/msh/IdealProjects/Git-Study/hadoop/hadoop-tools/hadoop-pipes/target/native" executable="cmake" failonerror="true">... @ 5:153 in /Volumes/Extended/Users/msh/IdealProjects/Git-Study/hadoop/hadoop-tools/hadoop-pipes/target/antrun/build-main.xml

猜測(cè)是ant版本問(wèn)題募书,重裝了jdk1.7適配的ant绪囱。

Ant BuildException也是夠迷惑的。而且之前猴子電腦配置的jdk1.8莹捡,切到1.7之后ant就不能用了(brew安裝的ant用1.8jdk編譯的鬼吵,1.7無(wú)法解析class文件),重裝了適配1.7的ant版本后篮赢,ant可以正常使用了齿椅,卻還是報(bào)這個(gè)錯(cuò)。启泣。涣脚。

結(jié)果還是報(bào)這個(gè)錯(cuò),打開(kāi)build-main.xml看寥茫,發(fā)現(xiàn)是一個(gè)cmake命令的配置遣蚀,copy到終端執(zhí)行:

cmake /Volumes/Extended/Users/msh/IdealProjects/Git-Study/hadoop/hadoop-tools/hadoop-pipes/src/ -DJVM_ARCH_DATA_MODEL=64

輸出:

...(略)
CommandLineTools/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at /usr/local/Cellar/cmake/3.6.2/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
  Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
  system variable OPENSSL_ROOT_DIR (missing: OPENSSL_INCLUDE_DIR)
Call Stack (most recent call first):
  /usr/local/Cellar/cmake/3.6.2/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE)
  /usr/local/Cellar/cmake/3.6.2/share/cmake/Modules/FindOpenSSL.cmake:380 (find_package_handle_standard_args)
  CMakeLists.txt:20 (find_package)

...(略)

OPENSSL_ROOT_DIROPENSSL_INCLUDE_DIR沒(méi)有設(shè)置坠敷。echo一下確實(shí)沒(méi)有設(shè)置妙同。

解決

Mac自帶OpenSSL,然而猴子并不知道哪里算是root膝迎,哪里算是include粥帚;另外,據(jù)說(shuō)mac計(jì)劃移除默認(rèn)的openssl限次。干脆自己重新安裝:

brew install openssl

然后配置環(huán)境變量:

export OPENSSL_ROOT_DIR=/usr/local/Cellar/openssl/1.0.2n
export OPENSSL_INCLUDE_DIR=$OPENSSL_ROOT_DIR/include

maven倉(cāng)庫(kù)不穩(wěn)定

[ERROR] Failed to execute goal on project hadoop-aws: Could not resolve dependencies for project org.apache.hadoop:hadoop-aws:jar:2.6.0: Could not transfer artifact com.amazonaws:aws-java-sdk:jar:1.7.4 from/to central (https://repo.maven.apache.org/maven2): GET request of: com/amazonaws/aws-java-sdk/1.7.4/aws-java-sdk-1.7.4.jar from central failed: SSL peer shut down incorrectly -> [Help 1]

出現(xiàn)類(lèi)似“Could not resolve dependencies”芒涡、“SSL peer shut down incorrectly”等語(yǔ)句柴灯,一般是maven不穩(wěn)定,換個(gè)穩(wěn)定的maven源费尽,或者重新編譯多試幾次赠群。

其他

歷史遺留坑

上次編譯有個(gè)小坑,是Hadoop源碼里的歷史遺留問(wèn)題旱幼。

編譯過(guò)程中會(huì)在$JAVA_HOME/Classes下找一個(gè)并不存在的jar包classes.jar查描,實(shí)際上需要的是$JAVA_HOME/lib/tools.jar,加個(gè)軟鏈就好(注意mac加軟鏈時(shí)與linux的區(qū)別)柏卤。

因此上次編譯猴子已經(jīng)修復(fù)了這個(gè)問(wèn)題冬三,這里就不復(fù)現(xiàn)了。具體可以看這篇mac下編譯Hadoop

沒(méi)有skipTests

沒(méi)有skipTests的話缘缚,至少會(huì)在測(cè)試過(guò)程中以下錯(cuò)誤:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.16:test (default-test) on project hadoop-auth: There are test failures.
[ERROR]
[ERROR] Please refer to /Volumes/Extended/Users/msh/IdealProjects/Git-Study/hadoop/hadoop-common-project/hadoop-auth/target/surefire-reports for the individual test results.

Results :

Tests in error:
  TestKerberosAuthenticator.testAuthenticationHttpClientPost:157 ? ClientProtocol
  TestKerberosAuthenticator.testAuthenticationHttpClientPost:157 ? ClientProtocol

Tests run: 92, Failures: 0, Errors: 2, Skipped: 0

可以暫時(shí)忽略這些相關(guān)錯(cuò)誤勾笆,skipTests跳過(guò)測(cè)試,能追蹤源碼了解主要過(guò)程即可桥滨。

啟動(dòng)偽分布式“集群”

編譯成功后窝爪,在hadoop-dist模塊的target目錄下,生成了各種發(fā)行版齐媒。選擇hadoop-2.6.0.tar.gz蒲每,找個(gè)地方解壓。

配置

參考官網(wǎng)配置etc/hadoop目錄下的core-site.xml里初、hdfs-site.xml啃勉、yarn-site.xml忽舟、mapred-site.xml等双妨。

啟動(dòng)

  • 格式化(只有第一次需要格式化):
bin/hdfs namenode -format
  • 啟動(dòng)(啟動(dòng)dfs時(shí)需要輸出幾次用戶(hù)密碼)
# 啟動(dòng) Namenode、SecondaryNamenode(偽分布式無(wú)法開(kāi)啟HA)叮阅、Datanode
sbin/start-dfs.sh
# 啟動(dòng) ResourceManager刁品、NodeManager
sbin/start-yarn.sh
# 啟動(dòng) TimelineServer(ApplicationHistoryServer)
sbin/yarn-daemon.sh start timelineserver

啟動(dòng)后,訪問(wèn)NameNode浩姥、ResourceManager的Web UI挑随,Timeline的RESTful接口,創(chuàng)建目錄勒叠、上傳文件兜挨,跑示例MapReduce,以驗(yàn)證是否成功部署眯分。


參考:


本文鏈接:Mac編譯Hadoop源碼
作者:猴子007
出處:https://monkeysayhi.github.io
本文基于 知識(shí)共享署名-相同方式共享 4.0 國(guó)際許可協(xié)議發(fā)布拌汇,歡迎轉(zhuǎn)載,演繹或用于商業(yè)目的弊决,但是必須保留本文的署名及鏈接噪舀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末魁淳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子与倡,更是在濱河造成了極大的恐慌界逛,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纺座,死亡現(xiàn)場(chǎng)離奇詭異息拜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)净响,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)该溯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人别惦,你說(shuō)我怎么就攤上這事狈茉。” “怎么了掸掸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵氯庆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我扰付,道長(zhǎng)堤撵,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任羽莺,我火速辦了婚禮实昨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盐固。我一直安慰自己荒给,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布刁卜。 她就那樣靜靜地躺著志电,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛔趴。 梳的紋絲不亂的頭發(fā)上挑辆,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音孝情,去河邊找鬼鱼蝉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛箫荡,可吹牛的內(nèi)容都是我干的魁亦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼菲茬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吉挣!你這毒婦竟也來(lái)了派撕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤睬魂,失蹤者是張志新(化名)和其女友劉穎终吼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體氯哮,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡际跪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喉钢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姆打。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肠虽,靈堂內(nèi)的尸體忽然破棺而出幔戏,到底是詐尸還是另有隱情,我是刑警寧澤税课,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布闲延,位于F島的核電站,受9級(jí)特大地震影響韩玩,放射性物質(zhì)發(fā)生泄漏垒玲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一找颓、第九天 我趴在偏房一處隱蔽的房頂上張望合愈。 院中可真熱鬧,春花似錦击狮、人聲如沸佛析。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)说莫。三九已至,卻和暖如春寞焙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背互婿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工捣郊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慈参。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓呛牲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親驮配。 傳聞我的和親對(duì)象是個(gè)殘疾皇子娘扩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,499評(píng)論 25 707
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • 你是無(wú)意穿堂風(fēng) 偏偏孤倨引山洪 1.工具準(zhǔn)備 最靠譜的是hadoop說(shuō)明文檔里要求具備的那些工具着茸。 到hadoop...
    hongXkeX閱讀 2,131評(píng)論 0 2
  • 0x00 緣由 由于我們從Hadoop的Apache網(wǎng)站上下載的hadoop包是在32位機(jī)器上編譯的。因此琐旁,如果...
    明月的味道閱讀 1,040評(píng)論 0 1
  • 看到題目有沒(méi)有一種高大上的感覺(jué)涮阔?毛線,當(dāng)前是個(gè)人灰殴、是個(gè)公司都在說(shuō)自己搞大數(shù)據(jù)敬特,每天沒(méi)有幾個(gè)PB的數(shù)據(jù)入庫(kù),每天沒(méi)有...
    丁小晶的晶小丁閱讀 4,445評(píng)論 0 50