一提到事务,首先就想到的是关系型数据库中的事务,事务一个典型的特征就是将一批操作做成原子性的,要么都成功,要么都失败。
在Flume中一共有两个事务:
- Put事务:在Source到Channel之间
- Take事务:Channel到Sink之间
从Source到Channel过程中,数据在Flume中会被封装成Event对象,也就是一批Event,把这批Event放到一个事务中,把这个事务也就是这批event一次性的放入Channel中。同理,Take事务的时候,也是把这一批event组成的事务统一拿出来到sink放到HDFS上。
Flume中的Put事务
- 事务开始的时候会调用一个doPut 方法,doPut方法将一批数据放在putList中;
- putList在向Channel发送数据之前先检查Channel的容量能否放得下,如果放不下一个都不放,只能doRollback;
- 数据批的大小取决于配置参数batch size的值;
- putList的大小取决于配置Channel的参数transaction capacity的大小,该参数大小就体现在putList上;(Channel的另一个参数capacity指的是Channel的容量);
- 数据顺利的放到putList之后,接下来可以调用doCommit方法,把putList中所有的Event放到 Channel 中,成功放完之后就清空putList;
在doCommit提交之后,事务在向Channel存放数据的过程中,事务容易出问题。如Sink取数据慢,而Source放数据速度快,容易造成Chann