长时间运行集群之后,如何需要停止集群使用stop相关命令时常常会都提示no datanode,no namenode等等之类的信息,查看相关
stop-all.sh stop-dfs.sh,stop-yarn.sh脚本,发现原理都是通过一个pid文件来停止集群的。
这些进程的pid文件默认都是保存在系统的/tmp目录下面,系统每个一段时间就会清楚/tmp下面的内容,于是我ls /tmp看了一下,果然没有相关进程的pid文件了。才导致了stop-all.sh无法停止集群的原因。
如果强制kill -9杀进程的话会破坏集群,可以按照pid文件的命名规则重新在/tmp目录下面创建这些pid文件,在翻看了一堆sbin目录下的脚本之后,找到了它们的命名规则。
比如hadoop相关进程的pid文件命名规则为:pid=$HADOOP_PID_DIR/hadoop-$HADOOP_IDENT_STRING-$command.pid
yarn相关进程的pid文件规则:pid=$YARN_PID_DIR/yarn-$YARN_IDENT_STRING-$command.pid
默认情况下$HADOOP_PID_DIR和$YARN_PID_DIR都为/tmp,$HADOOP_IDENT_STRING和$YARN_IDENT_STRING都为当前系统登录的用户名,比如我的用户名为hadoop,$command为当前执行的命令
比如执行了一个 hadoop-daemon.sh stop namenode,这时候就会去找/tmp/hadoop-hadoop-namenode.pid文件拿到namenode进程的pid号,来停止namenode进程。
了解原理之后,于是我就开始手动创建这些文件,我首先jps把所有进程的pid都记录下来了,然后在/tmp目录按照命名规则创建好了这些进程的pid文件,然后再重新执行stop-all.sh命令,ok可以成功关闭集群了。
但这不是一个长久之计,因为下次pid文件还是保存在/tmp目录下,还是会出这个问题,所以要彻底解决这个问题,就是不使用默认的/tmp文件夹来存放pid文件。
按以下步骤:
1 在集群各个节点的/var目录下面创建一个文件夹: sudo mkdir -p /XXX/pids,(XXX指自己指定目录)记得更改这个文件夹的权限,chown -R hadoop:hadoop /var/hadoop,将这个目录及子目录的拥有者改为你的当前用户,我这是hadoop,不然执行start-all.sh的时候当前用户会没有权限创建pid文件
2 修改hadoop-env.sh 将原有修改为:export HADOOP_PID_DIR=/XXX/pids
3 修改yarn-env.sh 增加:export YARN_PID_DIR=/XXX/pids
4 修改hbase-env.sh ,放开原有注释:export HBASE_PID_DIR=/XXXp/pids
5
修改
spark-env.sh
,增加:export SPARK_PID_DIR=/XXX/pids
重新运行 start-all.sh,start-hbase.sh把hadoop集群和hbase集群启动起来,
然后我们ls /XXX/pids查看一下pid文件是否生成在里面了,果然出现在了里面
master上pid文件
hadoop-hadoop-namenode.pid hbase-hadoop-master.pid spark-hadoop-org.apache.spark.deploy.master.Master-1.pid
hadoop-hadoop-secondarynamenode.pid yarn-hadoop-resourcemanager.pid
slaves上pid:
hadoop-hadoop-datanode.pid yarn-hadoop-nodemanager.pid spark-hadoop-org.apache.spark.deploy.worker.Worker-1.pid
hbase-hadoop-regionserver.pid
然后我们再运行stop-hbase.sh和stop-all.sh命令来测试一下看看能不能正常停止hbase集群和hadoop集群,结果是肯定的。说明配置是有效的。
至此,这个问题已经完美的解决了。
最后注意一点就是,不仅仅是修改master的所有env文件,集群中的所有节点的这些文件都要修改!