问题定义:
Hadoop由于对系统的进程管理的缺陷,会有些Hadoop mapred Child 进程一直存留在系统中,占有大量的CPU或者内存,影响整个系统的性能。因此需要定期清理Hadoop的进程。通过观察我们发现实际上并非僵尸进程,因此我们把持续运行超过特定天数(此处为14天)的进程杀掉。脚本如下:
ps -e -o pid -o etime -o args |grep org.apache.hadoop.mapred.Child |grep -v grep |awk '{ if (int(substr($2,1,index($2,"-")-1))>14) {print $1;} }' | xargs -t kill -9
注:etime ELAPSED elapsed time since the process was started, in the form [[dd-]hh:]mm:ss.
在解决此问题时的一些其它思路:
# 比如用ps找到cpu占用超过某个数目,同时累积CPU时间超过某个数目来确定要kill掉的进程。
for i in `ps aux |grep org.apache.hadoop.mapred.Child |grep Aug |awk '{printf "%d\n", $10}'`
do
if [ `ps aux |grep $i |grep Aug |awk '{printf "%d\n", $10}'` -gt "200000" ]
then
if [ `ps auxf |grep $i |grep Aug |awk '{printf "%d\n", $3}'` -gt "100" ]
then
echo $i
kill -9 $i
fi
fi
done
把脚本放在crontab里,定时执行即可。