Flink 中如何保证 Exactly Once?

在分布式场景下,我们的应用程序随时可能出现任何形式的故障,例如:机器硬件故障、程序 OOM 等。当应用程序出现故障时,Flink 为了保证数据消费的 Exactly Once,需要有相应的故障容错能力。Flink 是通过周期性 Checkpoint 的方式来实现故障容错,这里使用的是基于 Chandy-Lamport 改进的算法。本节会介绍 Flink 内部如何保证 Exactly Once 以及端对端如何保证 Exactly Once。

Flink 内部如何保证 Exactly Once?

Flink 官网的定义是 Stateful Computations over Data Streams(数据流上的有状态计算),那到底什么是状态呢?举一个无状态计算的例子,比如:我们只是进行一个字符串拼接,输入a,输出a666,输入b,输出 b666。无状态表示计算输出的结果跟之前的状态没关系,符合幂等性。幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生副作用。而计算 PV、UV 就属于有状态计算。实时计算 PV 时,每次都需要从某个存储介质的结果表中拿到之前的 PV 值,+1 后 set 到结果表中。有状态计算表示输出的结果跟之前的状态有关系,不符合幂等性,访问多次,PV 会增加。

Flink的 Checkpoint 功能简介

Flink Checkpoint 机制的存在就是为了解决 Flink 任务在运行过程中由于各种原因导致任务失败后,能够正常恢复任务。那 Checkpoint 具体做了哪些功能,为什么任务挂掉之后,通过 Checkpoint 机制能使得任务恢复呢?Checkpoint 是通过给程序做快照的方式使得将整个程序某些时刻的状态保存下来ÿ

你可能感兴趣的:(大数据实时计算引擎,Flink,实战与性能优化)