1. 程式人生 > >Hadoop集群namenode(standby),異常掛掉問題

Hadoop集群namenode(standby),異常掛掉問題

with awk select gpo 開發人員 stand kill -9 img lis

2018-02-24

2月22號,發現namenode02服務器的namenode(standby)節點掛掉,查看hadoop日誌/app/hadoop/logs/hadoop-appadm-namenode-prd-bldb-hdp-name02.log
發現2018-02-17 03:29:34,首次報出java.lang.OutOfMemoryError的ERROR,具體報錯信息如下

2018-02-17 03:29:34,485 ERROR org.apache.hadoop.hdfs.server.namenode.EditLogInputStream: caught exception initializing http://
datanode01:8480/getJournal?jid=cluster1&segmentTxId=2187844&storageInfo=-63%3A1002064722%3A1516782893469%3ACID-02428012-28ec-4c03-b5ba-bfec77c3a32b java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) at java.lang.Thread.start(Thread.java:
714)

 之後在2018-02-17 03:34:34,Shutting down standby NN

2018-02-17 03:34:34,495 FATAL org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer: Unknown error encountered while tailing edits. Shutting down standby NN.
java.lang.OutOfMemoryError: unable to create new native thread
        at java.lang.Thread.start0(Native Method)
        at java.lang.Thread.start(Thread.java:
714) at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949) at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1371) at com.google.common.util.concurrent.MoreExecutors$ListeningDecorator.execute(MoreExecutors.java:440) at com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:56) at org.apache.hadoop.hdfs.qjournal.client.IPCLoggerChannel.getEditLogManifest(IPCLoggerChannel.java:553) at org.apache.hadoop.hdfs.qjournal.client.AsyncLoggerSet.getEditLogManifest(AsyncLoggerSet.java:270) at org.apache.hadoop.hdfs.qjournal.client.QuorumJournalManager.selectInputStreams(QuorumJournalManager.java:474) at org.apache.hadoop.hdfs.server.namenode.JournalSet.selectInputStreams(JournalSet.java:278) at org.apache.hadoop.hdfs.server.namenode.FSEditLog.selectInputStreams(FSEditLog.java:1590) at org.apache.hadoop.hdfs.server.namenode.FSEditLog.selectInputStreams(FSEditLog.java:1614) at org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer.doTailEdits(EditLogTailer.java:216) at org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer$EditLogTailerThread.doWork(EditLogTailer.java:342) at org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer$EditLogTailerThread.access$200(EditLogTailer.java:295) at org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer$EditLogTailerThread$1.run(EditLogTailer.java:312) at org.apache.hadoop.security.SecurityUtil.doAsLoginUserOrFatal(SecurityUtil.java:455) at org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer$EditLogTailerThread.run(EditLogTailer.java:308) 2018-02-17 03:34:34,500 INFO org.apache.hadoop.util.ExitUtil: Exiting with status 1

  當天檢查系統內存使用情況,發現的確剩余內存不足,於是手動釋放了內存,並重新啟動了namenode02節點。

free -g 
sync
echo 3 > /proc/sys/vm/drop_caches
echo 1 > /proc/sys/vm/drop_caches

# 在namenode02節點執行,
su - appadm
hadoop-daemon.sh start namenode

為了驗證釋放是由於namenode節點剩余內存不足,而導致的namenode(standby)掛掉,開發人員調整了MapReduce JOB的運行頻率。為了盡快模擬出長時間運行後的狀態,抽了一個原本1天跑一次的JOB改成5分鐘跑一次。

在持續跑了2天JOB之後,從雲平臺CAS監控上看到namenode主機的歷史內存使用趨勢圖如下

技術分享圖片

技術分享圖片

技術分享圖片

22 號17:00~18:00 增加了JOB運行頻率,22號18:20之前,內存使用率維持在40%左右,18:20~19:10,線性增長到70%,並維持在這個水平,一直到23號 14:42,之後緩慢增長,突破80%臨界值。 在24號 0:00~1:00 這個時間段,達到90%的峰值。

 技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

根據stackoverflow上面,對該問題的描述,提問題的人物理內存是12G,也就是建議把 -Xmx值設置為物理內存的3/4。我們生產環境的namenode 物理內存為8G,datanode 物理內存為 125G

https://stackoverflow.com/questions/9703436/hadoop-heap-space-and-gc-problems

技術分享圖片

18:43 2018-2-24 保理Hadoop生產集群變更
在5臺服務器上分別執行,以下命令
vim /app/hadoop/etc/hadoop/hadoop-env.sh
添加如下參數
export HADOOP_OPTS="-XX:+UseParallelGC -Xmx4g"

為了方便日後操作,特記錄下集群重啟操作步驟

保理Hadoop/Hive/HBase/Zookeeper集群 重啟操作步驟
########################################################
############
1、關閉 Hive
# 在namenode01,關閉hiveserver2
lsof -i :9999|grep -v "ID"|awk {print "kill -9",$2}|sh

############
2、關閉 HBase
# 在namenode01執行,關閉HBase
stop-hbase.sh

############
3、關閉 Hadoop
# 在namnode01執行,關閉Hadoop
stop-all.sh

############
4、關閉 Zookeeper
# 在3個datanode節點執行
zkServer.sh stop
zkServer.sh status


########################################################
手動釋放Linux系統內存
sync
echo 3 > /proc/sys/vm/drop_caches
echo 1 > /proc/sys/vm/drop_caches

########################################################
############
5、啟動 Zookeeper
# 在3個datanode節點執行
zkServer.sh start
zkServer.sh status

############
6、啟動 Hadoop
# 在namenode01執行
start-all.sh

# 在namenode02執行,重啟namenode
hadoop-daemon.sh stop namenode
hadoop-daemon.sh start namenode


# HDFS Namenode01:9000 (active) WEB UI
http://172.31.132.71:50070/ 

# HDFS Namenode02:9000 (standby) WEB UI
http://172.31.132.72:50070/ 

# YARN WEB UI
http://172.31.132.71:8088/ 

############
7、啟動 HBase
# 在namenode01和namenode02節點,分別執行
start-hbase.sh

# Master WEB UI
http://172.31.132.71:60010/ 

# Backup Master WEB UI
http://172.31.132.72:60010/ 

# RegionServer WEB UI
http://172.31.132.73:60030/ 
http://172.31.132.74:60030/ 
http://172.31.132.75:60030/ 

############
8、啟動 Hive
# 在namenode01,啟動hiveserver2
hive --service hiveserver2 &

# 在datanode01,啟動metastore
hive --service metastore &

# 在namenode01,啟動hwi(Web界面)
hive --service hwi &

# HWI WEB UI
http://172.31.132.71:9999/hwi 
########################################################

Hadoop集群namenode(standby),異常掛掉問題