我使用的是 CDH 5.1.2,我经常看到此错误,其中一个数据节点经常暂停。我从日志中看到这一点。
WARN org.apache.hadoop.util.JvmPauseMonitor: Detected pause in JVM or host machine (eg GC): pause of approximately 12428ms
GC pool 'ConcurrentMarkSweep' had collection(s): count=1 time=12707ms
知道为什么我会看到这个吗?每隔一段时间,hdfs 容量就会下降一个节点。
GC 池“ConcurrentMarkSweep”已收集:计数=1 时间=12707ms
您正在经历 CMS 收集器的长时间 GC 暂停。
要进一步调查,您应该通过
-Xloggc:<path to gc log file> -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
打开 GC 日志记录,如果您使用的是 java 7,还可以添加 -XX:+PrintGCCause
。
GCViewer 可以帮助可视化日志。
找到原因后,您可以尝试调整 CMS 以避免这些暂停。对于初学者来说,有官方 CMS 调整指南。
我们刚刚在运行 CDH 5.3.2 时遇到了一个非常类似的问题,我们无法在 Hadoop 集群上成功启动 HDFS NameNode 服务。
当时非常令人困惑,因为除了 WARN org.apache.hadoop 之外,我们没有在 /var/log/messages 和 /var/log/hadoop-hdfs/NAMENODE.log.out 中观察到任何明显的错误.util.JvmPauseMonitor:检测到 JVM 或主机暂停(例如 GC)
与 Cloudera 支持合作后,我们能够确定我们遇到了未记录的 OOM 异常...作为一般经验法则,请查看堆大小的配置...对于每 1百万块您应该至少有 1GB 的堆大小。
在我们的例子中,解决方案非常简单,只需增加 NameNode 和辅助 NameNode 服务的 Java 堆大小并重新启动...,因为我们有 150 万个块,但仅使用默认的 1GB 堆大小设置。 增加 Java 堆大小并重新启动 HDFS 服务后,我们全面恢复正常。
干杯!