##Hadoop 2.0+YARN啟動腳本分析與實戰(zhàn)經(jīng)驗

Hadoop 2.0+YARN啟動腳本分析與實戰(zhàn)經(jīng)驗 - 鄭文亮 - 博客園 http://www.cnblogs.com/zhwl/p/3670997.html

總的來說這個啟動過程分為多個層次谁不,分別是:整個集群級別的配置,單臺機(jī)器OS級別的配置,單個JVM級別的配置蜕青。
對那句話“系統(tǒng)總是不可靠的万搔,我們要通過軟件冗余來使得系統(tǒng)更加可靠”有了更深層次的認(rèn)識怀薛。


start-all.sh腳本現(xiàn)在已經(jīng)廢棄些己,推薦使用start-dfs.sh和start-yarn.sh分別啟動HDFS和YARN锄禽。

在新一代的Hadoop里面HDFS稱為了統(tǒng)一存儲的平臺傍药,而YARN成為了統(tǒng)一計算的平臺磺平。
(1)調(diào)用start-dfs.sh啟動HDFS。之后JPS會出現(xiàn)NameNode,DataNode,SecondaryNameNode
(2)調(diào)用start-yarn.sh啟動YARN拐辽。之后JPS會出現(xiàn)ResourceManager,NodeManager
對于每個start腳本首先甚至啟動過程中用到的所有腳本拣挪,首先都是調(diào)用libexec/hadoop-config.sh配置相關(guān)環(huán)境變量

//
hadoop-config.sh

設(shè)置各種環(huán)境變量,包括:
HADOOP_PREFIX 整個Hadoop的安裝目錄
HADOOP_CONF_DIR 配置文件的目錄俱诸,一般是Hadoop安裝目錄下的etc/hadoop/
JAVA_HOME 從操作系統(tǒng)環(huán)境變量獲取菠劝,但是在SSH登陸到slave節(jié)點可能會出現(xiàn)問題,所以推薦在hadoop-env.sh中也設(shè)置一下睁搭。
JAVA_HEAP_MAX 啟動每個JVM默認(rèn)的堆大小赶诊,目前是-Xmx1000m
CLASSPATH 找Jar包的地方,一般情況下Jar包存在Hadoop安裝目錄下的share/hadoop/目錄下的common,hdfs,httpfs,mapreduce,tools幾個子目錄下
HADOOP_LOG_DIR 就是存放日志的地方园骆,默認(rèn)是Hadoop安裝目錄下的logs目錄舔痪,這個很重要,運行中出了問題都是要通過log定位的锌唾。
NameNode锄码,DataNode,SecondNameNode晌涕,ResourceManager滋捶,NodeManager的日志默認(rèn)都在這個目錄下。
不過要注意默認(rèn)的container的log是在/tmp/logs目錄下余黎,害得我找container的log找了很長時間也沒找到重窟。
HADOOP_LOGFILE
HADOOP_POLICYFILE
JAVA_LIBRARY_PATH Java運行時需要通過JNI調(diào)用native lib的環(huán)境變量。因為在Hadoop代碼中與操作系統(tǒng)緊密相關(guān)的一些操作和一些壓縮算法是有通過C編寫的native的系統(tǒng)實現(xiàn)的驯耻。就是libhadoop.so和libhdfs.so這樣的系統(tǒng)庫亲族,通常放在Hadoop安裝目錄下的lib/native/里面。
HADOOP_OPTS 這個是啟動每個JVM時傳遞過去的參數(shù)
HADOOP_COMMON_HOME
HADOOP_HDFS_HOME
YARN_HOME
HADOOP_MAPRED_HOME
這些環(huán)境變量是運行Hadoop和YARN程序的環(huán)境變量可缚,和我們把Hadoop安裝在哪個目錄下有關(guān)系。

//
start-dfs.sh

(1)執(zhí)行hdfs-config.sh設(shè)置HDFS專有的環(huán)境變量斋枢。但是目前貌似沒有HDFS專有的環(huán)境變量帘靡,在這個文件里再次執(zhí)行了下hadoop-config.sh
(2)啟動參數(shù):upgrade,rollback還是正常啟動。
(3)然后就是分別調(diào)用對應(yīng)的腳本啟動對應(yīng)的模塊
NameNode
DataNode
SecondaryNameNode
ZooKeeper Failover
每個模塊都是調(diào)用hadoop-daemos.sh啟動的瓤帚。
hadoop-daemons.sh和hadoop-daemon.sh的區(qū)別是:前者啟動多臺機(jī)器上的daemon描姚,后者負(fù)責(zé)在一臺機(jī)器上啟動daemon涩赢,前者調(diào)用后者。連接這兩著的橋梁就是sbin/slave.sh轩勘,就是通過ssh登陸到slave機(jī)器上筒扒,然后在每臺slave機(jī)器上執(zhí)行hadoop-daemon.sh。

//
首先看看hadoop-daemons.sh
這個腳本的參數(shù)類似這樣:
--config /home/orange/hadoop-2.0.0-alpha/etc/hadoop --hostnames localhost --script /home/orange/hadoop-2.0.0-alpha/sbin/hdfs start namenode
因為上面這個例子是啟動NameNode绊寻,所以帶了–hostnames參數(shù)花墩,用于指明分別到哪臺機(jī)器上去運行hadoop-daemon.sh去啟動namenode。如果是啟動DataNode則不需要這個參數(shù)澄步,因為如果不設(shè)定這個參數(shù)冰蘑,會通過讀取etc/hadoop/slaves文件獲取slaves機(jī)器信息。
這個腳本的最后有個非常長的命令:
1
exec "$bin/slaves.sh" --config $HADOOP_CONF_DIR cd "$HADOOP_PREFIX" ; "$bin/hadoop-daemon.sh" --config $HADOOP_CONF_DIR "$@"
這個命令表示:在本shell內(nèi)執(zhí)行slaves.sh腳本村缸,參數(shù)是后面那么一堆東西祠肥。
我們?nèi)lave.sh那打印出它接收到的參數(shù)看看:
1
--config /home/orange/hadoop-2.0.0-alpha/etc/hadoop cd /home/orange/hadoop-2.0.0-alpha ; /home/orange/hadoop-2.0.0-alpha/sbin/hadoop-daemon.sh --config /home/orange/hadoop-2.0.0-alpha/etc/hadoop --script /home/orange/hadoop-2.0.0-alpha/sbin/hdfs start namenode
在這個腳本里面通過ssh登陸到各個slave節(jié)點上,然后執(zhí)行后面的cd進(jìn)入slave節(jié)點的Hadoop安裝目錄梯皿,然后調(diào)用hadoop-daemon.sh去執(zhí)行對應(yīng)的操作仇箱。
hadoop-daemon.sh的參數(shù)是
1
localhost: --config /home/orange/hadoop-2.0.0-alpha/etc/hadoop --script /home/orange/hadoop-2.0.0-alpha/sbin/hdfs start namenode
執(zhí)行hadoop-env.sh設(shè)置環(huán)境變量,因為即將啟動的JVM是由這個shell啟動的东羹,所以這個環(huán)境變量會傳給JVM工碾。
配置啟動單點NameNode或者DataNode的運行環(huán)境:除了hadoop-config.sh里面的以外還有HADOOP_LOG_DIR,HADOOP_PID_DIR百姓,HADOOP_IDENT_STRING等渊额,這些都是與運行這個daemon的本機(jī)相關(guān)的變量
最后通過
1
nohup nice -n $HADOOP_NICENESS $hdfsScript --config $HADOOP_CONF_DIR $command "$@" > "$log" 2>&1 < /dev/null &
啟動對應(yīng)的進(jìn)程,也就是hdfs start namenode命令垒拢。其實是調(diào)用 bin/hdfs腳本旬迹,啟動JVM。
hadoop-daemon.sh這個腳本是在每臺機(jī)器上啟動各種JVM前的準(zhǔn)備工作求类,包括設(shè)置環(huán)境變量什么的奔垦。因為每個腳本基本都會調(diào)用hadoop-config.sh,這個也不例外尸疆,所以我們理解一般情況下hadoop-config.sh里面的環(huán)境變量椿猎。但是從我的實際使用經(jīng)驗來看,由于操作系統(tǒng)和SSH的問題寿弱,會導(dǎo)致SSH登陸到slave節(jié)點之后執(zhí)行shell腳本的時候獲取系統(tǒng)環(huán)境變量失效的問題犯眠。例如,$JAVA_HOME環(huán)境變量症革,看hadoop-config.sh這個文件可知$JAVA_HOME直接從操作系統(tǒng)環(huán)境變量獲取筐咧。但是當(dāng)hadoop-daemons.sh調(diào)用slaves.sh通過ssh登陸到各個slave節(jié)點之后去執(zhí)行hadoop-daemon.sh時,在獲取$JAVA_HOME時出現(xiàn)失敗的情況。而如果在對應(yīng)的那臺機(jī)器上執(zhí)行 echo $JAVA_HOME是沒有問題的量蕊。也就是SSH之后的環(huán)境變量獲取失敗铺罢。我的debian上就出現(xiàn)了這個問題,這個坑害死人残炮。而在我的CentOS上卻沒有這樣的問題韭赘。通過搜索網(wǎng)絡(luò)得知是因為/.bashrc不會被SSH調(diào)用,而/.bash_profile或者/.profile是會被SSH調(diào)用的势就。所以需要在/.bash_profile或者/.profile中通過類似下面的語句執(zhí)行/.bashrc
1
2
3
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
但是在我的debian上還是搞不定泉瞻,至今原因未明。有對Debian熟悉的同學(xué)如果知道是什么原因可以Email我蛋勺。
還好hadoop社區(qū)為了防止類似的問題瓦灶,也做了很嚴(yán)謹(jǐn)?shù)牟呗浴T赟SH登陸到每臺slave之后抱完,都會去調(diào)用hadoop-env.sh贼陶。這個文件很重要啊。我在看別人的攻略時巧娱,看別人在說要在這個hadoop-env.sh文件里設(shè)置$JAVA_HOME碉怔,但是就在想,我的系統(tǒng)環(huán)境變量里已經(jīng)設(shè)置了$JAVA_HOME禁添,難道你一個應(yīng)用程序的環(huán)境變量比我系統(tǒng)的還管用撮胧?所以就試了下這個hadoop-env.sh不設(shè)置$JAVA_HOME,結(jié)果就出現(xiàn)了上面所說的問題老翘∏凵叮看來hadoop-env.sh正如其名,有關(guān)Hadoop的環(huán)境變量應(yīng)該設(shè)置在這里铺峭,這樣才能在社么樣的底層系統(tǒng)環(huán)境下都能穩(wěn)定運行墓怀。
start-yarn.sh

注意到這個腳本里不再執(zhí)行hadoop-config.sh,而是執(zhí)行yarn-config.sh卫键。配置環(huán)境變量傀履。(實際上yarn-config.sh還是會調(diào)用hadoop-config.sh的)
1
"$bin"/yarn-daemon.sh --config $YARN_CONF_DIR start resourcemanager
指定日志和pid的格式,也就是:yarn-orange-nodemanager-orange.log
yarn-orange-resourcemanager-orange.log
yarn-orange-nodemanager.pid
yarn-orange-resourcemanager.pid
通過執(zhí)行下面這行代碼莉炉,啟動ResourceManager對應(yīng)的JVM
1
nohup nice -n $YARN_NICENESS "$YARN_HOME"/bin/yarn --config $YARN_CONF_DIR $command "$@" > "$log" 2>&1 < /dev/null &
1
"$bin"/yarn-daemons.sh --config $YARN_CONF_DIR start nodemanager
和啟動DataNode類似钓账,也是通過SSH到每臺slave節(jié)點上之后,執(zhí)行yarn-daemon.sh啟動對應(yīng)的NodeManager絮宁。
1
exec "$bin/slaves.sh" --config $YARN_CONF_DIR cd "$YARN_HOME" ; "$bin/yarn-daemon.sh" --config $YARN_CONF_DIR "$@"
注意這里面也存在和上面一樣的問題梆暮,所以推薦在yarn-env.sh里面也設(shè)置相關(guān)環(huán)境變量,要不然就會出現(xiàn)啟動Job的時候找不到類羞福。惕蹄。。
總的來說這個啟動過程分為多個層次治专,分別是:整個集群級別的配置卖陵,單臺機(jī)器OS級別的配置,單個JVM級別的配置张峰。
對那句話“系統(tǒng)總是不可靠的泪蔫,我們要通過軟件冗余來使得系統(tǒng)更加可靠”有了更深層次的認(rèn)識。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喘批,一起剝皮案震驚了整個濱河市撩荣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饶深,老刑警劉巖餐曹,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異敌厘,居然都是意外死亡台猴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門俱两,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饱狂,“玉大人,你說我怎么就攤上這事宪彩⌒莼洌” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵尿孔,是天一觀的道長俊柔。 經(jīng)常有香客問我,道長活合,這世上最難降的妖魔是什么雏婶? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮芜辕,結(jié)果婚禮上尚骄,老公的妹妹穿的比我還像新娘。我一直安慰自己侵续,他們只是感情好倔丈,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著状蜗,像睡著了一般需五。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轧坎,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天宏邮,我揣著相機(jī)與錄音,去河邊找鬼。 笑死蜜氨,一個胖子當(dāng)著我的面吹牛械筛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播飒炎,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼埋哟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了郎汪?” 一聲冷哼從身側(cè)響起赤赊,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎煞赢,沒想到半個月后抛计,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡照筑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年吹截,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朦肘。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡饭弓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出媒抠,到底是詐尸還是另有隱情弟断,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布趴生,位于F島的核電站阀趴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏苍匆。R本人自食惡果不足惜刘急,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浸踩。 院中可真熱鬧叔汁,春花似錦、人聲如沸检碗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽折剃。三九已至另假,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怕犁,已是汗流浹背边篮。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工己莺, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戈轿。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓凌受,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凶杖。 傳聞我的和親對象是個殘疾皇子胁艰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

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