关于Hadoop集群无法正常关闭的问题

发布时间 2023-05-31 07:20:57作者: strongmore

原生命令

正常情况我们是通过以下命令来停止和开启集群的

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

参考

完美解决Hadoop集群无法正常关闭的问题!
stop-all.sh无法停止hadoop集群