一、JPS命令和pid进程剖析


1.1、HDFS下jps命令位置

hadoop jps指令 jps命令在hadoop中做了什么_hadoop jps指令


ps -ef|grep hadoop与jps打印出的是一致的,ps -ef打印出的更全。

hadoop jps指令 jps命令在hadoop中做了什么_hadoop_02

是否有进程名称和pid它就是存活的,没有它就是不存活?

1.2、对应的进程标识文件路径?

因为我们使用的是Hadoop用户启动的三进程,cd /tmp/hsperfdata_hadoop,这个路径是hdfs进程对应的标识文件位置。这个文件实质是 /tmp/hsperfdata_进程用户名称

hadoop用户jps查看到的结果:

hadoop jps指令 jps命令在hadoop中做了什么_root用户_03


root用户jps查看到的结果:

root用户能看所有用户的jps结果,普通用户只能看自己的(加上sudo权限后也能看所有)。

hadoop jps指令 jps命令在hadoop中做了什么_hadoop jps指令_04


下图是第一次写博客时候的图。

hadoop jps指令 jps命令在hadoop中做了什么_hadoop_05

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掉。

hadoop jps指令 jps命令在hadoop中做了什么_hadoop_06


hadoop jps指令 jps命令在hadoop中做了什么_hdfs_07

  1. 问题:为什么root用户杀掉进程后,jps查看命令还有残留,而新开session切换为hadoop用户后无残留。
  2. 回答:在部署过程中,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掉后再启动即可。

hadoop jps指令 jps命令在hadoop中做了什么_hadoop_08

3.1、 坑:linux在/tmp目录下会定期删除此文件下的目录

linux在tmp目录下,30天为周期会定期删除一些文件及文件夹。
	大数据组件运行周期两三个月,我们先要知道/tmp目录下存放的是这三个进程的pid,
	cat hadoop-hadoop-namenode.pid		27619

hadoop jps指令 jps命令在hadoop中做了什么_hadoop_09

**
测试hadoop004用户,进入 /tmp目录,删除hadoop-hadoop-namenode.pid目录。
1、删除目录后,我们使用jps、ps -ef|grep 27619、hdfs dfs -ls /、hdfs dfs -mkdir /g6 …这些命令都能完美运行,测试下来没有问题。

hadoop jps指令 jps命令在hadoop中做了什么_root用户_10

但是

当我们使用stop-dfs.sh时,会显示no namenode to stop;
当我们使用jps查看时,namenode还在。
那我们使用start-dfs.sh,进行重启(有可能进程异常崩溃、生产过程中参数变更),而NameNode的pid永远是旧的;即使进行N次重启,NameNode的pid都是旧的,相当于是无法生效。

hadoop jps指令 jps命令在hadoop中做了什么_hdfs_11

3.2如何操作避免踩坑

pid的默认路径:cd /app/hadoop/etc/hadoop/
 				vi hadoop-env.sh 
 	进入尾行模式,输入 :/pid,查找pid的位置。

hadoop jps指令 jps命令在hadoop中做了什么_hadoop_12

对应的操作方法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.