一、JPS命令和pid进程剖析
1.1、HDFS下jps命令位置
ps -ef|grep hadoop与jps打印出的是一致的,ps -ef打印出的更全。
是否有进程名称和pid它就是存活的,没有它就是不存活?
1.2、对应的进程标识文件路径?
因为我们使用的是Hadoop用户启动的三进程,cd /tmp/hsperfdata_hadoop,这个路径是hdfs进程对应的标识文件位置。这个文件实质是 /tmp/hsperfdata_进程用户名称
hadoop用户jps查看到的结果:
root用户jps查看到的结果:
root用户能看所有用户的jps结果,普通用户只能看自己的(加上sudo权限后也能看所有)。
下图是第一次写博客时候的图。
J总公司生产小插曲:一个生产脚本,判断大数据组件进程是否okay,当jps查看进程发生process information unavailable这个情况时,脚本认为这个进程是失败无效的,脚本尝试重启这个Hadoop进程;其实人家进程是好好的。
二、proces information unavailable(真真假假)
2.1 root用户下使用的jps命令查询到的三个进程不可用
真:ps -ef|grep 25293 //有可能是pid,强行写ps -ef|grep namenode,出来有进程,则证明这个进程是okay的;真正判断进程是否可用。
假:我们kill -9 25293, 后使用jps查看当前进程后显示process information unavailable;于是我们测试把其余两个进程都kill掉。
- 问题:为什么root用户杀掉进程后,jps查看命令还有残留,而新开session切换为hadoop用户后无残留。
- 回答:在部署过程中,hadoop中hdfs组件使用的是hdfs用户;我们的脚本统一使用的是root用户或sudo权限的用户获取。
现象:试用root用户杀掉进程会有残留,试用Hadoop用户jps查看无进程残留
原因:部署hadoop过程中hdfs组件是用的hdfs用户,root用户或有sudo权限的用户去获取
三、 kill 进程命令(人为或自动)
自动:当进程在Linux看来是耗内存最大的,他会自行进行kill,Linux的特性叫OOM killer。
**
1、我们在root用户下kill -9 26428、26621
[root@hadoop004 ~]# jps
26915 Jps
26428 -- process information unavailable
26621 -- process information unavailable
26328 NameNode
2、rm -rf hsperfdata_hadoop //删除hsperfdata_hadoop这个目录
3、我们在namenode进程未杀掉的情况下,直接把存放的进程标识文件给删除了,再次启动start-dfs.jps时,无NameNode进程;单独使用命令:hadoop-daemon.sh start namenode,提示进程正在运行,kill掉后再启动即可。
3.1、 坑:linux在/tmp目录下会定期删除此文件下的目录
linux在tmp目录下,30天为周期会定期删除一些文件及文件夹。
大数据组件运行周期两三个月,我们先要知道/tmp目录下存放的是这三个进程的pid,
cat hadoop-hadoop-namenode.pid 27619
**
测试hadoop004用户,进入 /tmp目录,删除hadoop-hadoop-namenode.pid目录。
1、删除目录后,我们使用jps、ps -ef|grep 27619、hdfs dfs -ls /、hdfs dfs -mkdir /g6 …这些命令都能完美运行,测试下来没有问题。
但是
当我们使用stop-dfs.sh时,会显示no namenode to stop;
当我们使用jps查看时,namenode还在。
那我们使用start-dfs.sh,进行重启(有可能进程异常崩溃、生产过程中参数变更),而NameNode的pid永远是旧的;即使进行N次重启,NameNode的pid都是旧的,相当于是无法生效。
3.2如何操作避免踩坑
pid的默认路径:cd /app/hadoop/etc/hadoop/
vi hadoop-env.sh
进入尾行模式,输入 :/pid,查找pid的位置。
对应的操作方法1:
1、mkdir /data/tmp //其它目录下创建一个/tmp目录
chmod -R 777 /data/tmp
2、export HADOOP_PID_DIR=/data/tmp //指定pid的/tmp目录
对应的操作方法2:
修改时间清理规则
3.3 jps查看进程时为什么每次都有jps自己
(1)、输入jps这个命令的刹那,自己给自己捕获到了,因为它自己也是Java的一个命令。
(2)、jps |grep -v Jps
3.4为什么需要pid
进入到hadoop目录下的sbin,读一下stop-dfs.sh脚本,他启动和停止需要去找pid.