我们有一个包含五个节点的HDFS集群。在将新文件写入文件系统时,我们常常遇到“没有足够的副本”错误或以下内容:
2016-05-29 13:30:03,972 [Thread-486536] INFO org.apache.hadoop.hdfs.DFSClient - Exception in createBlockOutputStream
java.io.IOException: Got error, status message , ack with firstBadLink as 10.100.1.22:50010
at org.apache.hadoop.hdfs.protocol.datatransfer.DataTransferProtoUtil.checkBlockOpStatus(DataTransferProtoUtil.java:142) ~[hadoop-hdfs-2.7.1.jar!/:na]
...
2016-05-29 13:30:03,972 [Thread-486536] INFO org.apache.hadoop.hdfs.DFSClient - Abandoning BP-1195099512-10.100.1.21-1454597789659:blk_1085523876_11792285
2016-05-29 13:30:03,977 [Thread-486536] INFO org.apache.hadoop.hdfs.DFSClient - Excluding datanode DatanodeInfoWithStorage[10.100.1.22:50010,DS-2f34af8d-234a-4036-a810-908c3b2bd9cf,DISK]
2016-05-29 13:30:04,003 [pool-1272-thread-3] WARN org.apache.hadoop.hdfs.DFSClient - Slow waitForAckedSeqno took 65098ms (threshold=30000ms)
我们也经历了很多这些,这似乎是在发生大型GC时。
[pool-9-thread-23] WARN org.apache.hadoop.hdfs.DFSClient - Slow waitForAckedSeqno took 34607ms (threshold=30000ms)
[pool-9-thread-30] WARN org.apache.hadoop.hdfs.DFSClient - Slow waitForAckedSeqno took 34339ms (threshold=30000ms)
[pool-9-thread-5] WARN org.apache.hadoop.hdfs.DFSClient - Slow waitForAckedSeqno took 34593ms (threshold=30000ms)
文件系统拥有650万个小(4-20 kB)文件,当我们编写新文件时,节点会因OOM而关闭。新文件总是分批编写,批处理可以是几十万。
目前节点有很多RAM而不是OOM,4 GB用于名称节点,3 GB用于数据节点。
这真的是预期的行为吗?为什么节点吃了这么大量的RAM?
我想增加节点数,看看我们是否可以运行更严格的mem设置,比如1024 MB。可能的?
编辑:我们看到很多GC正在发生,当GC发生时,节点没有响应。
答案 0 :(得分:1)
最后问题是失败的底层存储系统。将集群移动到HW机架,添加了第二个名称节点,定期将使用过的文件存档到HAR文件系统中,HDFS是一个快乐的熊猫。
如果您遇到类似的问题,并且您的平台基于任何类型的虚拟化。立刻远离虚拟的mumbo jumbo。