我有一个日志系统,每小时向Hadoop写入5分钟的聚合,超过60GB的数据。我的问题出现在审查数据时,某些高峰时段似乎不完整(只有部分日志被写入)。这种信息丢失与最高负载期一致。我跟踪日志并阅读每一条痕迹,但我无法找出究竟是什么问题。
批处理从Kafka获取许多服务器的日志行,然后将这些行排队到编写器线程,编写者线程在HDFS上打开文件并写入所有行(每个源服务器一个文件)。对于低到中负载,一切都还可以。当工作负载很高时,日志会开始吐出一些错误并发出警告:
2016-10-08 14:16:24 INFO Exception in createBlockOutputStream
java.io.IOException: Got error, status message , ack with firstBadLink as <dnip>:50010
at org.apache.hadoop.hdfs.protocol.datatransfer.DataTransferProtoUtil.checkBlockOpStatus(DataTransferProtoUtil.java:140)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.createBlockOutputStream(DFSOutputStream.java:1397)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.nextBlockOutputStream(DFSOutputStream.java:1299)
at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:464)
2016-10-08 14:16:24 INFO Abandoning BP-1891784736-10.118.249.120-1467026091136:blk_1077950482_131390250
2016-10-08 14:16:24 INFO Excluding datanode DatanodeInfoWithStorage[<dnip>:50010,DS-d1b79bfe-3ee8-4dba-b3a3-48e50a357b30,DISK]
几秒钟后,会出现新错误:
2016-10-08 14:17:34 INFO Exception in createBlockOutputStream
java.net.SocketTimeoutException: 65000 millis timeout while waiting for channel to be ready for read. ch : java.nio.channels.SocketChannel
在出现错误之后,批处理过程开始关闭文件。然后,仅针对某些文件,存在一些新错误:
2016-10-08 14:17:34 WARN DataStreamer Exception
org.apache.hadoop.ipc.RemoteException(java.io.IOException): File /my/log/path/log.gz could only be replicated to 0 nodes instead of minRep
lication (=1). There are 2 datanode(s) running and 2 node(s) are excluded in this operation.
对于特定文件,尺寸为cero。否则,它们只是部分写入,丢失了一些数据。此外,HDFS记录表明:
2016-10-08 14:21:22,789 WARN datanode.DataNode (BlockReceiver.java:receivePacket(694)) - Slow BlockReceiver write data to disk cost:2143ms (threshold=300ms)
和
DataXceiver error processing WRITE_BLOCK operation
查看所有日志,HDFS上的WARN似乎与信息丢失相关,也与createBlockOutputStream相关。只要有很多行存在错误,就会丢失数据。
我应该检查的任何日志?也许Hadoop调整?
答案 0 :(得分:0)
作为部分答案,我们发现在工作节点中,GC每六小时(预定义的GC范围)导致大量长暂停(3~5秒)。我们将堆从1GB增加到4GB并且似乎已经解决了。造成堆不断满的原因仍然是一个悬而未决的问题,但超出了这个范围。堆增加后,日志中不再有错误(与此相关)。