Hadoop 完美解決start-all.sh不能啟動resourcemanager的問題


一、集群描述

主機:CentOS7.8
jdk1.8
hadoop、hive、hbase、zookeeper:CDH5.14.2

namenode datanode1 datanode2
NameNode ✔(主) ✔(備)
DataNode
JournalNode
QuorumPeerMain
ResourceManager ✔(主) ✔(備)
NodeManager
HMaster ✔(主) ✔(備)
HRegionServer

二、問題描述

還記得上學期學習的時候,老師說過備用ResourceManager要手動啟動,手動關閉,start-all.sh、start-yarn.sh都是是不能啟動的。

啟動的時候要這樣:
[root@datanode2 ~]# yarn-daemon.sh start resourcemanager

關閉的時候要這樣:
[root@datanode2 ~]# yarn-daemon.sh stop resourcemanager

當時覺得麻煩就麻煩點吧,畢竟剛開始水平有限,也沒有必要深究那么多,所以這個問題到了現在不僅沒有解決,反而變本加厲。

前幾天將集群的CentOS6換成了7,進行了一次大換血,結果這回連主ResourceManager都啟動不起來了!需要手動啟動!

start-all.sh命令其實就是連續執行了start-dfs.sh和start-yarn.sh這兩個命令,而在starting yarn daemons的時候只是在namenode上啟動ResourceManager,雖然我的namenode上根本就沒有ResourceManager。。。而另外兩個裝有ResourceManager的結點沒有收到要啟動的命令,所以自然就沒有ResourceManager進程。

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

三、問題分析

starting yarn daemons后只是對namenode下達了啟動ResourceManager的命令,不像NodeManager對三個結點都下達了啟動命令。

所以我覺得可能是start-yarn.sh這個腳本有問題,在有了一定的shell編程基礎后,我也嘗試着寫一些shell腳本。

看一下這個腳本
[root@namenode /]# vim $HADOOP_HOME/sbin/start-yarn.sh

開頭的注釋即提到 Start all yarn daemons. Run this on master node.
要在主節點上啟動所有的yarn守護進程,我是在namenode上啟動的呀,所有這一點沒有問題,繼續往下看。

在31行發現了問題,與33行的NodeManager啟動命令相比較,它用的是yarn-daemon.sh這個腳本而不是yarn-daemons.sh

在這里插入圖片描述
hadoop和yarn都有一個daemon.sh和daemons.sh,這個在$HADOOP_HOME/sbin目錄下都能看得到

在這里插入圖片描述

daemon.sh就是在本節點上啟動守護進程,而daemons.sh是在所有節點上啟動守護進程。daemons.sh會讀取$HADOOP_CONF_DIR下的slaves文件(這個在搭集群的時候要寫好的),里面保存着每個節點的域名或域名映射。然后daemons.sh就會在每個節點上運行daemon.sh腳本,從而達到在每台機器上都啟動守護進程的目的。不得不說,這很妙!

這下問題就變得簡單了,只要在31行給daemon加個s就行!雖然會在沒有RM的namenode上也啟動一下RM,不過這是小問題了,我的主要目的已經達到了。

四、解決問題

以下修改只需在主節點上完成

修改start-yarn.sh

最簡單的就直接給31行的daemon加個s就行了,下面的寫法主要是為了模仿start-dfs.sh的輸出格式(強迫症)

echo "Starting yarn daemons"

bin=`dirname "${BASH_SOURCE-$0}"`
bin=`cd "$bin"; pwd`

DEFAULT_LIBEXEC_DIR="$bin"/../libexec
HADOOP_LIBEXEC_DIR=${HADOOP_LIBEXEC_DIR:-$DEFAULT_LIBEXEC_DIR}
. $HADOOP_LIBEXEC_DIR/yarn-config.sh

echo "Starting Resourcemanagers on [datanode1 datanode2]"

# start resourceManager
"$bin"/yarn-daemons.sh --config $YARN_CONF_DIR  start resourcemanager

echo "Starting NodeManagers on [namenode datanode1 datanode2]"

# start nodeManager
"$bin"/yarn-daemons.sh --config $YARN_CONF_DIR  start nodemanager
# start proxyserver
#"$bin"/yarn-daemon.sh --config $YARN_CONF_DIR  start proxyserver

啟動展示:

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
整整齊齊一家子!

上文說到,關閉的時候也要手動關閉,所以也偷懶一下

修改stop-yarn.sh

最簡單的也是給31行的daemon加個s,當然患有強迫症的我就例外了

在這里插入圖片描述
這是修改之前的關閉結果,發現最后一行沒有代理服務器去關閉,我記得在start-yarn.sh中官方把start proxyserver的啟動命令給注釋掉了,事實上我也沒有用到這個守護進程,所以在stop-yarn.sh中也可以順便把它給注釋掉。

echo "Stopping yarn daemons"

bin=`dirname "${BASH_SOURCE-$0}"`
bin=`cd "$bin"; pwd`

DEFAULT_LIBEXEC_DIR="$bin"/../libexec
HADOOP_LIBEXEC_DIR=${HADOOP_LIBEXEC_DIR:-$DEFAULT_LIBEXEC_DIR}
. $HADOOP_LIBEXEC_DIR/yarn-config.sh

echo "Stopping ResourceManagers on [datanode1 datanode2]"

# stop resourceManager
"$bin"/yarn-daemons.sh --config $YARN_CONF_DIR  stop resourcemanager

echo "Stopping NodeManagers on [namenode datanode1 datanode2]"

# stop nodeManager
"$bin"/yarn-daemons.sh --config $YARN_CONF_DIR  stop nodemanager
# stop proxy server
#"$bin"/yarn-daemon.sh --config $YARN_CONF_DIR  stop proxyserver

關閉展示:

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述


若你喜歡我的文章,歡迎關注👇點贊👇評論👇收藏👇 謝謝支持!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM