Flume事务(重点)
Put 事务流程
doPut:将批数据先写入临时缓冲区 putList
doCommit:检查 channel 内存队列是否足够合并
doRollback:channel 内存队列空间不足,回滚数据
Take 事务流程
doTake:将数据取到临时缓冲区 takeList,并将数据发送到 HDFS
doCommit:如果数据全部发送成功,则清除临时缓冲区 takeList
doRollback:数据发送过程中如果出现异常,rollback 将临时缓冲区 takeList 中的数据归还给 channel 内存队列
事务实现
flume使用两个独立的事务分别负责从soucrce到channel,以及从channel到sink的事件传递
source->channel
source端到channel事务容易实现,比如spooldir,每次文件从source端到channel端,一旦文件所有数据全部传递到channel,则文件标示为成功,如果要做到精细化点,可以设置batchsize,配置一个事务多少行数据,一个batch一个事务单元,多个batch事务成功,则文件标示成功。
channel->target
channel端到sink端事务,根据不同的channel类型有不同设定,基于FileChannel,根据sink传递状态来决定,重传数据还是标示该事务成功。而基于MemoryChannel,由于不存在数据备份,一旦sink失败,需要数据回滚,重新写回channel,等待重新传递。
Flume Agent内部原理
注:DefaultSinkProcessor 单 Sink
LoadBalancingSinkProcessor 多个Sink 平均分
FailoverSinkProcessor 多个Sink 往一个Sink放,直到放不下再往下个放