Flink的状态管理
Flink 可以处理有状态的数据,通过自身的 state 机制来保障作业 失败时数据不丢失;Flink 的 checkpoint 和故障恢复算法保证了故障发生后应用状态的一致性。因此,Flink 能够在应用程序发生故障时,对应用程序透明,不造成正确性的影响。
Flink 提供了内置的状态管理,可以把这些状态存储在Flink内部,而不需要把它存储在外部系统。
这样做的好处是
第一降低了计算引擎对外部系统的依赖以及部署,使运维更加简单;
第二,对性能带来了极大的提升:如果通过外部去访问,如Redis,HBase,它一定是通过网络及RPCo如果通过Flink内部去访问,它只通过自身的进程去访问这些变量
同时Flink 会定期将这些状态做Checkpoint 持久化,把Checkpoint存储到一个分布式的持久化系统中,比如HDFS。这样的话,当Flink 的任务出现任何故障时,它都会从最近的一次Checkpoint 将整个流的状态进行恢复,然后继续运行它的流处理。对用户没有任何数据上的影响。
Flink是如何做到在 Checkpoint恢复过程中没有任何数据的丢失和数据的冗余?来保证精准计算的?
这其中原因是 Flink利用了一套非常经典的Chandy-Lamport算法,它的核心思想是把这个流计算看成一个流式的拓扑,定期从这个拓扑的头部 Source点开始插入特殊的 Barriers,从上游开始不断的向下游广播这个Barriers 。
每一个节点收到所有的Barriers,会将State做一次 Snapshot,当每个节点都做完 Snapshot之后,整个拓扑就算完整的做完了一次Checkpoint。接下来不管出现任何故障,都会从最近的Checkpoint进行恢复。
checkpoint机制
Flink定期保存状态数据到存储上,故障发生后从之前的备份中恢复,这个过程被称为Checkpoint机制。Checkpoint为Flink提供了Exactly-Once的投递保障。
一个简单的Checkpoint的大致流程:
暂停处理新流入数据,将新数据缓存起来。
将算子子任务的本地状态数据拷贝到一个远程的持久化存储上。
继续处理新流入的数据,包括刚才缓存起来的数据。
端到端Exactly Once 语义实现
source
支持故障发生和恢复过程中出现的数据重放
Transformation
Flink 的 checkpoint 和故障恢复算法保证了故障发生后应用状态的一致性
sink
从故障恢复时,数据不会重复写入外部系统(幂等写入、事务写入)