Flume事务

Flume事务

Flume在处理数据的时候,涉及到数据流动的有两个地方。一个是Source向Channel中放数据的时候,涉及到一个数据的发送(put事务)。还一个是Sink从Channel中拉取数据,也涉及到一个数据的发送。当涉及到数据的批量操作时,就会通过事务来保证数据的一致性和完整性。

1.put事务

流程:Flume在内存中建立以块缓存,所有Source拉来的数据会包装成Event,并在putList中进行积累。到达一定程度的时候(到达一定的数量,一定时间没有拉倒新数据)就会尝试往Channel中发送。在发送的时候会进行doCommit检查Channel中是否还有足够的空间来容纳putList中的所有数据,如果有doCommit就成功了,putList中的所有数据就会进入到Channel中并清空putList中的数据。如果检测的时候发现Channel中的空间不足以容纳putList中的数据的时候,事务就会进行回滚(所谓的回滚就是等一定的时间后,再尝试将putList中的数据发送到Channel),Flume中有两种source,一种名为Pullable Source,TailDirSource就是这种Source,这种Source是主动拉取数据,而不是由数据源推送过来的,这种Source在回滚等待的过程中source不会继续拉取数据。还有一种是Eventdriven Source,这种Source中的数据是由数据源主动不停的提交数据,在事务回滚的时候,会停止接收数据,这时有可能会产生数据丢失,这种丢失并不是发生在Flume内部,而是发生在Flume和数据源之间。常用的Source都是前一种。简单来将可以将这个过程分为三个步骤:
doPut:将数据先写入到临时缓冲区putList。
doCommit:检查Channel中的内存队列是否足够合并。
doRollback:当Channel中的内存队列空间不足的时候,回滚数据。
在这里插入图片描述

2.take事务

流程:Sink从Channel中拉取数据放到takeList中,并将数据发送到指定的地方,比如Hdfs。同样在发送的时候也会进行doCommit检查,如果全部数据发送成功,则清除临时缓冲区takeList中的数据。如果没有发送成功,那么会进行rollback,相当于又把数据放回到Channel中。严格来讲其实数据并没有真正的离开Channel,只是给了一个引用,只有在成功的时候Channel中的数据才会被清理掉,此时Channel才会腾出空间,如果没有提交成功takeList会被销毁(销毁是因为两次拉取的数据有可能不一样,比如Channel中又积攒了一些数据)。简单来讲也是分为了三个步骤:
doTake:将数据先写入到临时缓冲区takeList,并将数据发送到Hdfs。
doCommit:如果数据全部提交成功,则清除临时缓冲区takeList。
doRollback:数据发送过程如果出现异常,rollback将临时缓冲区takeList中的数据归还给Channel中的内存队列。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值