一、集群描述
主機: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
關閉展示:
若你喜歡我的文章,歡迎關注
👇點贊
👇評論
👇收藏
👇 謝謝支持!!!