Hadoop Unhealthy Nodes问题和Zookeeper清理

解决Hadoop Unhealthy Nodes问题,以及Zookeeper的清理

zookeeper


问题

开发告知测试环境出现yarn提交MR job后遇到阻塞的情况:
MRJOB


资料

分析与解决

查看application详细情况,发现没有分配节点:
APP

查看node情况,发现只有1个节点runnning:
NODES

剩余2个节点为unhealthy状态:
NODESTATS
报错:1/1 local-dirs are bad: /u01/app/hadoop/dfs/yarn/local; 1/1 log-dirs are bad: /u01/app/hadoop/dfs/yarn/log

查看DataNode状态,发现空间不足:
DATANODESTATS

连接服务器查看空间占用后,发现是zookeeper的dataDir和dataLogDir占用过大。进行清理后问题解决。
OK1
OK2

反思

Hadoop Unhealthy Nodes
  1. 问题来源:
    磁盘空间不足导致unhealthy节点,错误信息为1/1 local-dirs are bad: /u01/app/hadoop/dfs/yarn/local; 1/1 log-dirs are bad: /u01/app/hadoop/dfs/yarn/log
    磁盘空间释放后,unhealthy节点一般不会恢复

  2. 原因分析:
    NodeManager默认会每两分钟检查本地磁盘(local-dirs),找出哪些目录可以使用。注意如果判定这个磁盘不可用,则在重启NodeManager之前,就算磁盘好了,也不会把它变成可用。代码在LocalDirsHandlerServiceDirectoryCollection

  3. 解决方案

  • 重启nodemanager:/usr/local/goldmine/hadoop/default/sbin/yarn-daemon.sh stop/start nodemanager
  • 重启resourcemanager(否则会导致修改的节点状态错乱) :/usr/local/goldmine/hadoop/default/sbin/yarn-daemon.sh stop/start resourcemanager
  • 刷新http://hadoop/cluster/nodes/unhealthy页面:可以看到不健康的nodemanager已经消失在列表了。
  • 显示yarn各节点状态: yarn node -list -all
ZooKeeper Clean

在使用zookeeper过程中,会有dataDir和dataLogDir两个目录,分别用于snapshot和事务日志的输出(默认情况下只有dataDir目录,snapshot和事务日志都保存在这个目录中

正常运行过程中,ZK会不断地把快照数据和事务日志输出到这两个目录,并且如果没有人为操作的话,ZK自己是不会清理这些文件的,需要管理员来清理:

  1. crontab & bash script:
    通过定时任务配合清理脚本完成清理
    dataDir=/path/to/zookeeper/dataDir/version-2
    dataLogDir=/path/to/zookeeper/dataLogDir/version-2
  2. PurgeTxnLog:
    使用ZK的工具类PurgeTxnLog,它的实现了一种简单的历史文件清理策略,可以在这里看一下使用方法,可以指定要清理的目录和需要保留的文件数目。
    简单使用如下:
    java -cp zookeeper.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar:conf org.apache.zookeeper.server.PurgeTxnLog <dataDir> <snapDir> -n <count>
  3. zkCleanup.sh(对于PurgeTxnLog类的封装):
    对于上面这个Java类的执行,ZK自己已经写好了脚本,在bin/zkCleanup.sh中,所以直接使用这个脚本也是可以执行清理工作的。
  4. 配置zookeeper参数设定:
  • 从3.4.0开始,zookeeper提供了自动清理snapshot和事务日志的功能,通过配置autopurge.snapRetainCountautopurge.purgeInterval这两个参数能够实现定时清理。
  • 这两个参数都是在zoo.cfg中:
    autopurge.purgeInterval这个参数指定了清理频率,单位是小时,需要填写一个1或更大的整数,默认是0,表示不开启自己清理功能。
    autopurge.snapRetainCount这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。

参考资料:

  1. hadoop Unhealthy Nodes问题解决
  2. zookeeper日志清理
如果文章对您有帮助,感谢您的赞助支持!