Hadoop将不完整的文件写入HDFS

时间:2016-10-24 12:59:13

标签: hadoop hdfs

我有一个日志系统,每小时向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调整?

1 个答案:

答案 0 :(得分:0)

作为部分答案,我们发现在工作节点中,GC每六小时(预定义的GC范围)导致大量长暂停(3~5秒)。我们将堆从1GB增加到4GB并且似乎已经解决了。造成堆不断满的原因仍然是一个悬而未决的问题,但超出了这个范围。堆增加后,日志中不再有错误(与此相关)。