问题背景
我们的HDFS集群是通过ambari安装的,其中一个节点的hdfs服务挂掉了,然后我们通过ambari重启这个节点上的hdfs服务,发现重启命令没有执行。如下图所示:
干活
首先想到的是ambari-server的重启命令没有发送到ambari-agent上,可能的原因就是ambari-agent心跳丢失了,但是看ambari的监控显示没有心跳丢失。不管这么多,先重启ambari-agent再说,反正没有什么影响。重启之后发现问题依旧存在,于是开始仔细的看ambari-server和ambari-agent的日志。在ambari-agent的日志中发现agent这边接收到了任务,并把任务放到了队列中,只是没有执行任务这个步骤。这是为什么呢?
到这个节点上执行ps -ef | grep python命令,发现很多阻塞的进程:
这些阻塞的进程不就是我们要执行的重启hdfs的命令吗,为什么会阻塞呢?看下进程的堆栈信息{/proc/pid/stack}发现都是一样的问题:call_rwsem_down_write_failed,这是系统获取写锁失败了呀。磁盘坏了吗?
检查一下这个节点的磁盘:dmesg | grep dev,果然,sdj盘坏了!!!
通过top命令我们看到有个僵死进程:1 zombie
找下这个僵死进程:ps -A -ostat,ppid,pid,[cmd]|grep -e '^[Zz]'
发现338802进程也是卡在了D状态,/opt/volume8这个目录刚好就是sdj盘,说明这块盘确实有问题。
最后
换盘,或者把这个目录从hdfs配置中剔除。节点比较多,剔除的话有点浪费磁盘。所以先还盘吧。