Flume的事务性与数据安全性
在flume中事务是一个重要的概念,事务保证了数据的可靠性。这里的事务性和数据库中的事务性有些区别,flume中的事务在回滚时,可能会造成数据重复,所以flume保证的是每条数据最少发送一次,以此来保证数据不丢失。(比如上传文件的过程中HDFS宕机,则会造成HDFS数据重复)
Flume的事务性,主要有put事务和take事务,其中put事务位于source和channel之间,take事务位于channel和sink之间。
Put事务流程:
主要分为doPut(将数据先写入临时缓冲区putList)、doCommit(检查channel内存列队是否足够合并)、doRollback(channel内存列队空间如果不足,则会回滚数据)
-
putList接收Source交给Channel的event数据,takeList保存Channel交给Sink的event数据。
-
如果是Source交给Channel任务完成,进行commit的时候。会把putList中的所有event放到MemoryChannel中的queue。
-
如果是Source交给Channel任务失败,进行rollback的时候。程序就不会继续走下去,比如KafkaSource需要commitOffsets,如果任务失败就不会commitOffsets。
Take事务流程:
主要分为doTake(将数据写到临时缓冲区takeList)、doCommit(如果数据全部发送成功,则会清空临时缓冲区takeList)、doRollback(数据在发送的过程中如果出现异常,rollback将临时缓冲区的takeList中的数据回滚到channel队列中)
-
如果是Sink处理完Channel带来的event,进行commit的时候。会清空takeList中的event数据,因为已经没consume。
-
如果是Sink处理Channel带来的event失败的话,进行rollback的时候。会把takeList中的event写回到queue中。
缺点:
Flume的Transaction跟数据库的Transaction不一样。数据库中的事务回滚之后所有操作的数据都会进行处理。而Flume的却不能还原。比如HDFS Sink写数据到HDFS的时候需要rollback,比如本来要写入10000条数据,但是写到5000条的时候rollback,那么已经写入的5000条数据不能回滚,而那10000条数据回到了阻塞队列里,下次再写入的时候还会重新写入这10000条数据。这样就多了5000条重复数据,这是flume设计上的缺陷。
posted on 2021-02-25 22:33 RICH-ATONE 阅读(309) 评论(0) 编辑 收藏 举报