Hadoop DataNode 内存消耗和 GC 行为

Hadoop DataNode memory consumption and GC behaviour

最近我们 运行 遇到了我们的集群 (CDH 5.3.1) 的问题,这在 NameNode 和 DataNode 中都体现在长时间的 GC 周期中,从 30 秒到几秒不等分钟。

JVM 设置仍然是默认设置,但考虑到我们的集群同时增长到 3400 万个块,这种行为是可以解释的。

对于 NN,对堆大小的简单调整和对 GC 设置的其他小调整(例如新生代大小、幸存者比率)再次让我们获得了可预测的短 GC 暂停。

然而,对于 DN,我们仍然遭受周期性长时间 GC 暂停的困扰。我观察到异常长的 GC 暂停每 6 小时发生一次(Full GC)。现在我假设 Cloudera 为 blockreport 间隔设置默认值 6 小时 dfs.blockreport.intervalMsec 是造成这种模式的原因。

我想了解的是,如果有建议我可以如何解决这个问题,我需要找到既能满足正常操作内存分配(似乎大部分都很好)又能满足快速分配 我每 6 小时看到一次,持续几分钟。

DN 服务器有 256G 内存和 20 个物理内核

这是Java热点jdk1.7.0_67。

我当前的次优设置是:

-server 
-Xmn5g 
-Xms12884901888 
-Xmx12884901888 
-XX:SurvivorRatio=3 
-XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC 
-XX:+CMSConcurrentMTEnabled 
-XX:CMSInitiatingOccupancyFraction=60 
-XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSInitiatingOccupancyOnly 
-XX:+ScavengeBeforeFullGC 
-XX:+CMSScavengeBeforeRemark 
-XX:MaxTenuringThreshold=15 

我也很想知道除了调整 JVM 之外,是否还有一种方法可以影响 blockreport 以降低攻击性?

查看 gc 日志以了解相关时间范围: http://hastebin.com/zafabohowi

好的,运行 通过 GCViewer 的日志似乎只是 activity 的爆发(例如开始 17:09)填满了老一代直到它导致一些失败(在 17:15)。

只需尝试增加堆大小,让它有更多的喘息空间,直到任务完成。

除了 并发模式故障 似乎还有一些相对较长的暂停,尝试应用 these options 看看它们是否可以缩短几毫秒。