hadoop将不完整的文件写入hdfs

eoxn13cs  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(463)

我有一个日志系统,它向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?

disbfnqx

disbfnqx1#

作为部分答案,我们发现在工作节点中,gc每6小时(预定义的gc跨度)会导致大量的长时间暂停(3~5秒)。我们将堆从1gb增加到4gb,似乎已经解决了。是什么导致堆不断满的仍然是一个悬而未决的问题,但超出了本文的范围。堆增加后,日志中不再有错误(与此相关)。

相关问题