修改 hadoop 集群及hbase集群的pid文件存放位置
修改 hadoop 集群及hbase集群的pid文件存放位置,放在/tmp会被不定时回收的,莫名其妙找不到
于是我翻看了一下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 /var/hadoop/pids,记得更改这个文件夹的权限,chown -R hadoop:hadoop /var/hadoop,将这个目录及子目录的拥有者改为你的当前用户,我这是hadoop,不然执行start-all.sh的时候当前用户会没有权限创建pid文件
2 修改hadoop-env.sh 增加:export HADOOP_PID_DIR=/var/hadoop/pids
3 修改yarn-env.sh 增加:export YARN_PID_DIR=/var/hadoop/pids
4 修改hbase-env.sh ,增加:export HBASE_PID_DIR=/var/hadoop/pids
重新运行 start-all.sh,start-hbase.sh把hadoop集群和hbase集群启动起来
然后我们ls /var/hadoop/pids查看一下pid文件是否生成在里面了,果然出现在了里面,如下:
hadoop-hadoop-namenode.pid hbase-hadoop-master.pid
hadoop-hadoop-secondarynamenode.pid yarn-hadoop-resourcemanager.pid
这是master上的pid文件,我们还可以去slaves机器上去看看都有哪些:
hadoop-hadoop-datanode.pid yarn-hadoop-nodemanager.pid
hbase-hadoop-regionserver.pid
然后我们再运行stop-hbase.sh和stop-all.sh命令来测试一下看看能不能正常停止hbase集群和hadoop集群,结果是肯定的。说明配置是有效的。
至此,这个问题已经完美的解决了。
最后注意一点就是,不仅仅是修改master的所有env文件,集群中的所有节点的这些文件都要修改!
转载请注明:SuperIT » 修改 hadoop 集群及hbase集群的pid文件存放位置,放在/tmp会被不定时回收的,莫名其妙找不到