我有一个日志系统,它向hadoop写入5分钟的聚合,每小时超过60gb的数据。我的问题是,在查看数据时,有些高峰时间似乎不完整(只写了部分日志)。这种信息丢失与最高负荷期一致。我在跟踪日志,尽我所能阅读每一条线索,但我无法找出问题的症结所在。
批处理进程从kafka获取许多服务器的日志行,然后将这些行排队给writer线程,后者在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 tunning?
1条答案
按热度按时间disbfnqx1#
作为部分答案,我们发现在工作节点中,gc每6小时(预定义的gc跨度)会导致大量的长时间暂停(3~5秒)。我们将堆从1gb增加到4gb,似乎已经解决了。是什么导致堆不断满的仍然是一个悬而未决的问题,但超出了本文的范围。堆增加后,日志中不再有错误(与此相关)。