欢迎光临散文网 会员登陆 & 注册

第五章 Exactly-Once的实现

2022-04-02 22:06 作者:huanyigntianhe  | 我要投稿

对于流处理系统,实现exactly-once非常重要,否则系统输出的结果便会有重复或者遗漏数据。在流处理系统刚兴起的时候,结果不正确的情况是默认允许的,人们在当时提出了lambda架构来解决这个问题,lambda架构包含两套系统,一套是结果不怎么准确的流系统,另一套是结果精确的批处理系统,流系统可以实时给出报表数据,但是这个数据不怎么准确,需要定时的用批处理系统的结果去修正。lambda架构带来了一系列问题:

(1)不准确性:有时候会低估这种不准确性。

(2)不一致性:已经给客户展示的数据有可能变化

(3)复杂性:同时维护两套系统比较复杂

(4)不可预测性

(5)延迟比较大

Beam(Data flow)端到端一致性的实现

端到端的exactly-once需要考虑三个中间步骤

(1)从源去读

(2)算子的shuffle

(3)写到sink

shuffle的时候保证exactly once

Dataflow通过rpc来完成shuffle,在rpc移动数据的时候,如果rpc返回的结果不是成功,会一直重试,直到返回成功,这样的情况下数据虽然不会遗失,但是会出现重复,那么如何避免重复呢?

Dataflow给每一条要处理的数据加上了唯一标识ID,同时shuffle的接受方会对ID进行判重处理,如果发现ID已经处理过,会丢掉当前的这条数据。Dataflow利用kv存储作为底层存储实现判重的功能。

解决不可重复操作

处理过程的某些算子操作是不可重复的,也就是说数据流每次运行的结果是不一样的,这种情况下多次重试去执行数据流,并将结果通过RPC发送到对方是不正确的。Dataflow通过checkpoint技术来解决这个问题。简单说通过checkpoint将每个算子的输出保存到存储上,在shuffle的时候,RPC发送的数据是从存储去读,这样就避免执行之前的算子,这样保证重试传输的时候发送的数据还是以前产生好的数据。

性能优化

前边提到的exactly-once实现起来会非常的低效,为了解决性能问题,Dataflow实现了几个优化措施:计算图优化和布隆过滤器

  1. 计算图优化

(1)多个逻辑算子合并成一个物理计算单元,这样不需要存储每个算子的输出,而是为整个计算单元存储输出

(2)在shuffle前进行预聚合,这样可以减少shuffle的数据量

2. 布隆过滤器

前边提到的去重操作依赖于kv存储,而存储的读写比较耗时。根据布隆过滤器的false positive特性,以及重复数据比较少的情况,我们通过增加布隆过滤器来提高重复判断。接收方在收到接受的数据记录,首先通过布隆过滤器来判断ID是否存在,如果不存在,那么一定不存在,我们就不需要再去读存储去判断。如果在布隆过滤器中存在,那么需要进一步读存储来判断ID是否真的存在。这样我们就减少了读存储的次数,从而提升性能。

当在布隆过滤器存储的数据比较多的时候,返回false的概率就会降低,为了避免这种情况,Dataflow会定时产生一个新的布隆过滤器,而系统的每条数据附带着timestamp, 可以通过timestamp来选取对应的布隆过滤器

3. 垃圾回收

为了去重,Dataflow需要存储一系列的id在存储上,但是随着时间推移,数据会越来越多,怎么去做数据清理工作呢?Dataflow通过产生垃圾回收watermark来决定清楚已经过期的数据。

第五章 Exactly-Once的实现的评论 (共 条)

分享到微博请遵守国家法律