吊打面试官之flume的事务理解

Flume事务概念

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

我们都知道Flume是一个日志文件传输的工具,传输过程会经过三大步骤:

1.通过source 把数据从数据源(网络端口,本地磁盘等)读出出来
2.通过source把数据传入到channel里面
3.再把数据从channel传输到sink里面,sink把数据传给目的地(hdfs).
当然传输数据的过程并不是只有这三个步骤,flume 竟然是传输数据的,所以得考虑到数据传输时数据的完整性 . Flume在传输数据的时候很有可能因为传输速率的不一致导致channel满了,从而导致数据丢失。

channel是被动的,source这边是主动把数据put给channel,sink这边是主动把数据从channel拉取take,所以channel是被动操作的。

一般channel使用MemoryChannel,这是内存的,断电会丢失数据,也可以使用filechannel(磁盘),filechannel速度慢,但有提供日志级别的数据恢复功能,不过不断电MemoryChannel是不会丢数据的,所以一般选用memorychannel也OK。

source把数据传给channel 时不是直接传给channel,中间还有put事务,当然从channel到sink也不是直接传过去的,中间还有take事务。

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中的内存队列。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42706464/article/details/108865343