翻看了yarn-deamon.sh stop部分的脚本:
-
(stop)
-
-
if [ -f $pid ]; then
-
TARGET_PID=`cat $pid`
-
if kill -0 $TARGET_PID > /dev/null 2>&1; then
-
echo stopping $command
-
kill $TARGET_PID
-
sleep $YARN_STOP_TIMEOUT
-
if kill -0 $TARGET_PID > /dev/null 2>&1; then
-
echo "$command did not stop gracefully after $YARN_STOP_TIMEOUT seconds: killing with kill -9"
-
kill -9 $TARGET_PID
-
fi
-
else
-
echo no $command to stop
-
fi
-
else
-
echo no $command to stop
-
fi
根据上面代码。在关闭hadoop的进程的时候,会首先TARGET_PID=`cat $pid`,后面的操作都
针对这个TARGET_PID。
首先发送kill -0 TARGET_PID来检测这个pid存在不存在,若存在那么就使用kill TARGET_PID 来关闭进程。
第二个 kill -0 $TARGET_PID,意思是第一次删除失败的时候,则执行kill -9 $TARGET_PID。
在默认情况下,hadoop会使用/tmp目录作为临时文件存放地点,包括pid的文件:
-
[hadoop@hadoop2 hadoop]$ cat /tmp/
-
.esd-0/ Jetty_0_0_0_0_50075_datanode____hwtdwq/ orbit-gdm/
-
.esd-500/ Jetty_0_0_0_0_8042_node____19tj0x/ pulse-oVhJlALLtsum/
-
[color=red]hadoop-hadoop-datanode.pid [/color] Jetty_0_0_0_0_8480_journal____.8g4awa/ pulse-rZOxQTGmpouA/
-
[color=red]hadoop-hadoop-journalnode.pid[/color] Jetty_hadoop2_50070_hdfs____.roo38u/ pulse-v2bO3KgmFqB6/
-
[color=red]hadoop-hadoop-namenode.pid [/color] Jetty_hadoop2_8088_cluster____2k46ah/ ssh-ZAuFHp2599/
-
hadoop-hadoop-zkfc.pid keyring-5PcL7q/ .X0-lock
-
hsperfdata_hadoop/ keyring-DGU27L/ .X11-unix/
-
.ICE-unix/ keyring-prSBtx/ [color=red][color=orange]yarn-hadoop-nodemanager.pid[/color][/color]
-
Jetty_0_0_0_0_50070_hdfs____w2cu08/ keyring-wrTBmk/ [color=darkred]yarn-hadoop-resourcemanager.pid[/color]
由于/tmp会定期清除(以前认为只有在重启的时候,tmp才会清除,后来李天王提到由于tmpwatch的作用,会定期每隔240小时删除tmp的内容),会将pid清除,pid不存在的时候,就会报no *** to stop
-
[hadoop@hadoop2 hadoop]$ cat /tmp/yarn-hadoop-resourcemanager.pid
-
5232
-
[hadoop@hadoop2 hadoop]$ rm /tmp/yarn-hadoop-resourcemanager.pid
-
[hadoop@hadoop2 hadoop]$ yarn-daemon.sh stop resourcemanager
-
no resourcemanager to stop
那么此时该怎么做呢,我之前的做法就是很粗暴的kill -9 pid关闭进程,幸亏由于hadoop的editlog日志机制,保证了数据不会丢失,若是其他。。。
学习一下脚本,可以看出hadoop在关闭进程的时候是采取了比较保险妥当的方式。首先使用kill 而不是使用kill -9 来关闭进程。
另外朋友们在平时运维的时候要首先使用kill TARGET_PID。kill -9的这种比较粗暴的方式,还是少用,之前使用在hadoop 升级实验的时候,在hdfs namenode -upgrade 之后,就直接使用kill -9 pid,居然java 虚拟机抛出了致命错误。
虚拟机日志我作为附件放上去,希望有虚拟机方面的大牛能给我分析。。。
总结:1.修改你的hadoop的hdfs以及yarn的tmp目录,都要修改哦。
2.关闭hadoop的时候请尽量使用kill 。
(责任编辑:IT) |