flume内部有两个事务:

  • Source到Channel是Put事务
    • doPut:将批数据先写入临时缓冲区 putList
    • doCommit:检查 channel 内存队列是否足够合并
    • doRollback:channel 内存队列空间不足,回滚数据
  • Channel到Sink是Take事务
    • doTake:将数据取到临时缓冲区 takeList,并将数据发送到 HDFS
    • doCommit:如果数据全部发送成功,则清除临时缓冲区 takeList
    • doRollback:数据发送过程中如果出现异常, 将临时缓冲区 takeList 中的数据归还给 channel 内存队列

      丢数据

      唯一可能丢数据是采用memory channel, 断电导致数据丢失

      数据重复

      flume可能数据重复:数据已经成功由 Sink 发出, 但是没有接收到响应,Sink 会再次发送数据
      image.png