当前位置:首页 > Web开发 > 正文

? 当takeList中存放了batch size 数量的event之后

2024-03-31 Web开发

? 一提到事务,我们首先就想到的是MySQL中的事务,事务就是将一批操纵做成原子性的,即这一批要么都告成,要么都掉败。

? 同样的原理,在flume中也有事务,那么Flume中的事务在哪个处所呢?在Flume中的批量操纵又是指什么呢?

Flume中的事务存在于哪个位置?

? 在Flume中一共有两个事务,一个是在Source到Channel之间,一个是Channel到Sink之间。在Source到Channel之间的叫put事务,在Channel到Sink之间的叫Take事务

在Flume中两个事务的批量操纵指的是什么?

? 从source到channel过程中,数据在flume中会被封装成Event东西,也就是一批event,把这批event放到一个事务中,把这个事务也就是这批event一次性的放入channel中。同理,Take事务的时候,也是把这一批event构成的事务统一拿出来到sink放到HDFS上。

? 接下来我们看下这两个事务具体是怎么实现的:

1、Flume的Put事务

? 事务必定有的两个特性就是:告成了提交,掉败了回滚。

? 我们先考虑Put事务的正常的情况,即任务告成情况。

如图所示:

技术图片

? 事务开始的时候会挪用一个doPut要领,doPut要领将一批数据(多个event)batch data 放在putList中,而这批数据“批”的巨细取决于配置的 batch size 的参数的值。而putList的巨细取决于配置channel的参数transaction capacity的巨细,这个参数的巨细就表此刻putList上了。(tips:channel的另一个参数capacity指的是channel的容量)。

此刻这批数据顺利的放到putList之后,接下来可以挪用doCommit要领,把putList中所有的event放到channel中,告成放完之后就清空putList

? 以上是顺利的情况下,那如果事务进行的过程中出问题了怎么解决呢?

第一种问题:数据传输到channel过程出问题
? 在doCommit提交之后,事务在向channel放的过程中,事务容易出问题。好比:sink那边取数据慢,而source这边放数据速度快,就容易造成channel中的数据的积压,这个时候就会造成putList中的数据放不进去。那此刻事务出问题了,如何解决呢?

? 通过挪用doRollback要领,doRollback要领会进行两项操纵:1、将putList清空; 2、抛出channelException异常。这个时候source就会捕捉到doRollback抛出的异常,然后source就会把适才的一批数据从头收罗一下,收罗完之后从头走事务的流程。这就是事务的回滚
(putList的数据在向channel发送之前先查抄一下channel的容量能否放得下,如果放不下,就一个都不放。)

第二种问题:数据收罗过程出问题
? 有这么种场景,source收罗数据时候给与的是tailDir source,而我们因为某种原因将监控的目录文件删除,这个时候就会呈现问题,同样地,呈现问题的解决方法是挪用doRollback要领来对事务进行回滚。

2、Flume的Take事务

? Take事务和Put事务很相似。

同样地,我们先不考虑doRollback,先考虑顺利不出问题的情况下事务的完成。

如图所示:

技术图片

? Take事务同样也有takeList,HDFS sink配置也有一个 batch size,这个参数决定sink从channel取数据的时候一次取几多个,所以这batch size 得小于takeList的巨细,而takeList的巨细取决于transaction capacity的巨细,同样是channel 中的参数。

? Take事务流程:事务开始后,doTake要领会将channel中的event剪切到takeList中,固然,后面接的是HDFS Sink的话,在把channel中的event剪切到takeList中的同时也往写入HDFS的IO缓冲流中放一份event(数据写入HDFS是先写入IO缓冲流然后flush到HDFS)。

? 当takeList中存放了batch size 数量的event之后,就会挪用doCommit要领,doCommit要领会做两个操纵:1、针对HDFS Sink,手动挪用IO流的flush要领,将IO流缓冲区的数据写入到HDFS磁盘中;2、然后直接清空takeList中的数据。

? 以上是顺利的情况下,那如果事务进行的过程中出问题了怎么解决呢?

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

? 如:flush到HDFS的时候,可能由于网络原因超时导致数据传输掉败,,这个时候同样地挪用doRollback要领来进行回滚,回滚的时候,由于takeList中还有备份数据,所以将takeList中的数据原封不动地还给channel,这时候就完成了事务的回滚。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31031.html