Flume数据传输事务分析

  • 时间:
  • 浏览:3
  • 来源:彩神大发幸运飞艇_神彩大发幸运飞艇官方

Flume在对Channel进行Put和Take操作的完后 ,前要要用事物包住,比如:

亲戚亲戚大伙从Source数据接收到写入Channel有些过程对Put事物进行分析。

Put事务不让 分为以下阶段:

Sink虽然是由SinkRunner多线程 池调用Sink.process法律法律依据来了正确处理数据的。亲戚亲戚大伙从HdfsEventSink的process法律法律依据说起,Sink类就让个process法律法律依据,用来正确处理传输数据的逻辑。:

本文基于ThriftSource,MemoryChannel,HdfsSink另另六个 组件,对Flume数据传输的事务进行分析,机会使用的是有些组件,Flume事务具体的正确处理法律法律依据机会不同。一般情形下,用MemoryChannel就好了,亲戚亲戚大伙公司用的也不我有些,FileChannel波特率慢,虽然提供日志级别的数据恢复,有就让 一般情形下,不断电MemoryChannel是不让丢数据的。

ThriftSource会spawn多个Worker多线程 池(ThriftSourceHandler)去正确处理数据,Worker正确处理数据的接口,亲戚亲戚大伙只看batch批量正确处理有些接口:



Flume提供事物操作,保证用户的数据的可靠性,主要体现在:

同个节点内,Source写入数据到Channel,数据在另另六个 批次内的数据出先异常,则不写入到Channel。已接收到的偏离 数据直接被抛弃,靠上另另六个 节点重发数据。

很简单,虽然也不我清空takeList而已。机会bucketWriter在写数据到HDFS的完后 出先异常,则要rollback:

Take事务分为以下阶段:



channel.put -> transaction.doPut:

接着,HDFS写多线程 池bucketWriter将take到的数据写到HDFS,机会批数据都写完了,则要commit了:

实际上,Transaction实例蕴含另另六个 双向阻塞队列LinkedBlockingDeque(感觉没必要用双向队列,每个多线程 池写个人的putList,又就让多个多线程 池?),分别为:

接着看看channel.take,作用是将数据装进去 临时缓冲区,实际调用的是transaction.doTake:

transaction.commit:

大致流程图:



事务逻辑就让processEventBatch有些法律法律依据里:

每个Worker多线程 池都拥有另另六个 Transaction实例,保处于Channel(BasicChannelSemantics)里的ThreadLocal变量currentTransaction.

对于Put事物操作,当然是只用到putList了。putList也不我另另六个 临时的缓冲区,数据会先put到putList,最后由commit法律法律依据会检查channel算是有足够的缓冲区,有则合并到channel的队列。

这么 ,事务到底做了哪此?

机会在事务期间出先异常,比如channel剩余空间匮乏,则rollback: