一个用Java写的计算程序通过JDBC的方式连接Hive数据库,执行SQL查询语句查询数据。结果对应的MapReduce任务执行到Map 18% Reduce xx%之后,所有的进度输出都变为了Map 0% Reduce 0%
在排查Java语句无问题后,kill掉了Job,由于Job的log已经不可查,直接尝试重新运行程序
新的Hive查询创建的MapReduce任务阻塞在了Accepted状态,无法开始Running
仔细检查了Hadoop的Web页面,发现当前集群的5个节点都变为了Unhealthy状态,可用的Memory和VCore都为0,推测应是资源不足的原因导致的任务无法开始执行
用“Hadoop Unhealthy”作为关键词,百度到的网页,有一些的做法是重启Yarn的NodeManager和ResourceManager,然而之前已经做过多次重启操作,并无效果
又找到了一篇文章,提到了Unhealthy原因是bad file,遂查看本集群的Unhealthy原因,发现也是bad file(包括local-file和log-file),确定为是剩余存储空间不足,导致yarn将五个节点都标记为不可用,因此整个集群处于无资源可以执行任务的状态
集群的5个节点,使用磁盘比例均达到90%以上,甚至更多,由于暂时无法进行数据转移和删除操作,找到了临时解决方法——提高节点健康度检查中磁盘占用的最大值,参考链接:http://stackoverflow.com/questions/29010039/yarn-unhealthy-nodes
更改$HADOOP_HOME/etc/hadoop/目录下的yarn-site.xml文件,增加property:
<property> <name>yarn.nodemanager.disk-health-checker.min-healthy-disks</name> <value>0.0</value> </property> <property> <name>yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage</name> <value>99.0</value> </property>
为了为每个节点磁盘稍稍预留空间,此处的最大值设为了99%。
更改后,执行stop-yarn.sh和start-yarn.sh,重启NodeManager和ResourceManager,在Hadoop的Web页面刷新(http://namenode:8088//),可以看到节点重新回到了Headthy状态,有了可用的Memory和VCore资源,Job可以正常执行了。
不过以上还是权宜之计,为了让集群可以健康稳定的运行,还是需要及时对集群的磁盘进行清理,备份不常用的数据or补充存储设备