Flume事务总结
1.概念
1.1 事务的介绍
flume中的事务和关系型数据库中的事务是不同的,只是名称一样!
Flume中的事务代表的是一批要以原子性写入到channel或要从channel中移除的events!
Flume在设计时,采取的是at least once语义!因此在没有故障时,flume只会写入一次数据!
但是,如果遇到sink端的超时或写入文件系统失败等异常,flume可能采用重试机制!直到全部写入成功!
因此可能会产生重复的数据!
如果数据重复怎么办?
如果对数据不敏感,重复无所谓!
如果对数据敏感,要求数据最好有一个唯一的id字段,在具体使用数据时,进行去重!
1.1.1 put事务
put事务指source将封装好的event,交给ChannelProcessor,ChannelProcessor在处理这批events时,
先把events放入到putList中,放入完成后,一次性commit(),这批events就可以成功写入到channel!
写入成功后,执行清空putList操作!
如果在过程中,发生任何异常,此时执行rollback(),rollback()会回滚putList,回滚也会直接清空putList!
1.1.2 take事务
take事务指sink不断从channel中获取event!,每获取一批event中的一个,都会将这个event放入takeList中!
一般一批evnet全部写入,执行commit()方法,这个方法会清空takeList!如果在此期间,发生了异常,执行rollback(),此时会回滚takeList中的这批event到channel!
1.2 事务的特点
事务的实现由channel提供!source和sink在put和 take数据时,只是先获取channel中已经定义好的事务!
不同的channel的事务可能实现方式是不同的,但是原理和目的是一样的!都是为了put和take一批events的原子性!
1.3 take事务的数据重复情况
当前是sink的运行逻辑(模拟)