flume到底会丢数据吗?

什么时候最容易出问题呢?——flush到HDFS的时候组容易出问题

Flume的两套事务流程,确保不丢数据(一下针对FileChannel):

Put事务:可以理解为Source和Channel为一个整体的事务(比如说,source对接kafka,真正到了Channel(Sink? 根据监控来看,应该是sink成功了,消费的延迟性才下来)中,才是真正的消费成功Kafka的数据)

Take事务:可以理解为Channel和Sink为一个整体的事务 (同上,真正Sink到HDFS上,才是真正的sink文件成功)

如:flush到HDFS的时候,可能由于网络原因超时(或者集群宕机)导致数据传输失败,这个时候同样地调用doRollback方法来进行回滚,回滚的时候,由于takeList中还有备份数据,所以将takeList中的数据原封不动地还给channel,这时候就完成了事务的回滚。

  但是,如果flush到HDFS的时候,数据flush了一半之后出问题了,这意味着已经有一半的数据已经发送到HDFS上面了,现在出了问题,同样需要调用doRollback方法来进行回滚,回滚并没有“一半”之说,它只会把整个takeList中的数据返回给channel,然后继续进行数据的读写。这样开启下一个事务的时候就容易造成数据重复的问题。

  所以,在某种程度上,flume对数据进行采集传输的时候,它有可能会造成数据的重复,但是其数据不丢失。

一般报错日志如下:

13 四月 2021 18:33:32,966 ERROR [hdfs-k8-call-runner-26] (org.apache.flume.sink.hdfs.AbstractHDFSWriter.hflushOrSync:268)  - Error while trying to hflushOrSync!
13 四月 2021 18:33:32,966 WARN  [hdfs-k8-roll-timer-0] (org.apache.flume.sink.hdfs.BucketWriter.close:364)  - failed to close() HDFSWriter for file (hdfs://mycluster/user/root/flume/xxx/ds=2021-04-13/hs=18//FlumeData.1618308212916.tmp). Exception follows.
java.io.EOFException: Premature EOF: no length prefix available
        at org.apache.hadoop.hdfs.protocolPB.PBHelper.vintPrefixed(PBHelper.java:2280)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.transfer(DFSOutputStream.java:1020)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.addDatanode2ExistingPipeline(DFSOutputStream.java:990)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.setupPipelineForAppendOrRecovery(DFSOutputStream.java:1131)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.processDatanodeError(DFSOutputStream.java:876)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:402)

参考:

https://blog.csdn.net/zhang7761/article/details/110240653

原文地址:https://www.cnblogs.com/-courage/p/14657884.html