关于Hadoop集群无法正常关闭的问题
原生命令
正常情况我们是通过以下命令来停止和开启集群的
sbin/stop-all.sh
sbin/start-all.sh
但有时候不生效,通过ps还能查看到,但jps命令查看不到
自定义停止命令
#!/bin/bash
# 停止hadoop进程
hadoop_pids=`ps -ef | grep -v grep | grep -v historyserver | grep apache.hadoop | awk '{print $2}'`
for pid in ${hadoop_pids}
do
kill -9 ${pid}
done
通过kill强制杀死hadoop进程,可能会丢失数据或其他问题。如果仅使用grep hadoop
可能会将其他使用hadoop的也找到,如flume或hive等。
问题分析
根据查阅资料,Hadoop启动后,会把进程的PID号存储在一个目录下(默认为/tmp
),这样stop-dfs脚本就可以按照进程PID去关闭进程了。
hadoop-root-datanode.pid
hadoop-root-namenode.pid
hadoop-root-secondarynamenode.pid
yarn-root-nodemanager.pid
yarn-root-resourcemanager.pid
但是/tmp是临时目录,系统会定时清理该目录中的文件。显然把pid文件放在这里是不靠谱的,pid文件长时间不被访问,就被清理了。
所以我们只需要在配置文件中更改默认的pid存放位置即可。修改etc/hadoop/hadoop-env.sh,添加以下配置。
export HADOOP_PID_DIR=/root/test_hadoop/pid_dir