Spark和Flink的输出一致性保证及事务

事务

可以称之为一次对数据库进行的操作序列。

特性(ACID)

原子性:指这些操作序列具有原子性,不可分割,要么全部执行成功,要么全部失败。

一致性:
一致性概念的说法很多,有说事务执行前后状态保持正确的,有说完整性体现的,也有说从一个一致性状态变成另一个一致性状态的,也有说是对数据可见性约束的等等。个人感觉还是很含糊,根据维基百科描述并综合一些观点,我的总结如下:
1)、一致性是针对事务执行前后数据的状态而言的。
2)、事务执行前数据处于一个合法有效状态,事务执行后数据也要处于一个合法有效状态。
3)、一致性C是目的,数据库本身不管事务执行的结果是否正确,其它AID三种特性是手段,来确保一致性。

隔离性:在某个事务没有提交之前,其它事务不能看到该事务的中间结果,以进行并发控制。
持久性:事务被提交之后,它对数据库中数据的改变是永久性的。

粒度

大数据计算通常是运用分治法,将庞大计算量分布到多个计算单元上,再对所有计算单元上的数据运用同一套计算逻辑,以达到海量数据处理的目的,这也是大数据处理的优势。可见,其特点是计算逻辑相同,只是每个计算单元分担的数据不同。可将其理解为处理对象上的粗粒度。

事务通常是细粒度的操作,可能是针对某一条数据的更新、查询、插入、删除等,并且一个操作序列可能较多,而且还具有强相关性,比如说一次交易中,一次操作要考虑买卖两个数据实体的操作。当然,不同的应用都有其应用领域,这里先不讨论这个。

CAP理论(Consistence、Availability、Partition tolerance)

一致性:多副本数据保持一致
可靠性:任意时刻数据读写正常
分区容忍性:系统在可用的同时能够容忍的数据不同步的极限(出于各种不可预知的原因,导致的多副本不可能一直处于同步状态)

CAP理论指出一个分布式系统最多可以满足以上三个需求中的两个,并且至今并没有出现十全十美的方案。接下来看两个流行的大数据引擎如果保证输出一致性:

Spark

首先对于Spark计算引擎,要支持输出的Exactly-Once语义,必须从源到计算引擎本身再到sink系统,都需要支持Exactly-Once

1、对于数据源必须支持replay(重放)功能,也就是说可以从任一位置开始处理(源可以reposition)。
2、计算引擎本身支持Exactly-Once(无论同一数据重计算多少次,上游算子传给下游算子的结果均只有一个且相同)。
3、Sink系统支持幂等写入或者事务性写入。

Flink

通过2CP(Two Phase Commit)两阶段提交协议来提供 Exactly-Once 语义保证。但是需要外部Sink系统支持事务才能集成Flink两步提交协议。

预提交阶段:检查点启动,将算子状态写入状态后端,并预先提交外部接收器的事务。
提交阶段:所有算子检查点都已经成功完成,这时提交外部事务。

以此保证 Exactly-Once 语义。

发布了95 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43878293/article/details/104479119