Flink的Checkpoints机制详解

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: Flink的Checkpoints机制详解

这是我的第83篇原创

所有的数据处理工具都面临数据高可靠、高可用的问题,一旦服务发生问题,如何保证数据不会丢失?


高可靠解决方案

MySQL用BinLog来解决这个问题,它把每一步事务操作都记录下来,一旦发生问题,可以追踪binlog找到每一步的操作记录。MySQL还会提供快照、备份的功能。


HDFS通过多副本和ZooKeeper的选举机制来解决这个问题,它会把收到的每一份数据存成N个副本,当发生故障的时候,通过ZooKeeper来确定最新的副本数据。另外,HDFS也提供快照SnapShot的功能。


storm里面是通过ack和Trident搞定。


Spark比较复杂,不同版本不一样,1.3之前是用Receiver保存offset,重启后先获取上一次的offset,然后到kafka重新读取数据。1.3之后,跟Flink一样用checkpoint机制存储任务所有元数据,包括offset。具体可以看我之前分析的这篇文章,点击查看:SparkStreaming实时任务处理的三种语义


Flink的Checkpoint机制

MySQL的思想很容易理解,就像棋谱一样,把每一步都记录下来。后人读棋谱,可以随时切换到任意一张棋谱,然后跟着每一步的操作重现当时的情景。


HDFS的思想也比较好理解,怕丢数据,就存成N份。只要写进去最少副本数,就自动会把所有旧副本都覆盖了,最大程度的保存好数据。而且他们都属于离线数据库,随时可以存一个快照。


但是Flink不一样啊,MySQL和HDFS都是离线存储,Flink是在线的,是一个数据流呀,不能停啊!也不能把数据流做一个快照啊,那咋弄?


其实现实世界就有这种场景:

顾客源源不断的往收银台上的传送带上放物品,收银员负责扫码、计算、收钱。前面那个顾客和后面的顾客的东西都放在一起,怎么区分?你看Flink的场景跟超市购物是不是一样一样的?


最简单的方式是:

  1. 顾客1放商品到收银台
  2. 收银员把顾客1的东西陆续扫完,并结账
  3. 清台
  4. 顾客2放商品上去,重复步骤2、3


但是这样也太慢了点吧!这时间浪费的太多了!


于是就有了这个:下图中的“欢迎光临”:

在每个顾客之间,放一个“欢迎光临”,隔断一下就行了。“欢迎光临”之前的商品该扫码扫码,该结账结账。等看到“欢迎光临”了,就相当于看到Checkpoint的标志了,把小票数据上报系统。

在Flink中就是这样:

第1步:由Job Manager初始化Checkpoint,在数据源之后放一个barrier“欢迎光临”,以此为隔断。在“欢迎光临”下游的数据,照常处理。

第二步:在“欢迎光临”下游的所有数据都处理完毕之后,我们就可以获取到几个信息:CheckPoint的source、数据源的offset和最终计算的Result。然后我们把这几个数据存到state里面就好了。这样就即能搞定Checkpoint的记录,又不耽误流式数据的处理了。一旦任务发生故障,重启任务,到State中读取所有任务元数据,重来一遍就好了。


当然,上面只是并行度为1的情况,这两个图可以画的更复杂一些,并行度为2的情况,原理也是一样一样的:

第一步:发起Checkpoint:

第二步:将所有barrier下游的数据都计算完,并将source、offset等数据上报至State,存好。

当然,再复杂一些,就会遇到Checkpoint的时间过长的问题了。短时间内,Flink会把该barrier后的数据暂时缓存下来,等Checkpoint完成之后再进行计算。另外,还会启动Checkpoint超时时间,超过这么长时间没完成,该Checkpoint将被丢弃,保证Flink的通畅。


Checkpoint的参数配置

//默认checkpoint功能是disabled的,使用

StreamExecutionEnvironment.enableCheckpointing方法来设置开启

checkpoint StreamExecutionEnvironment env =

StreamExecutionEnvironment.getExecutionEnvironment();

// 每隔1秒进行启动一个Checkpointing【设置checkpoint的周期,建议不要太短,否则前一个checkpoint未完成,后面的又要启动】

env.enableCheckpointing(1000);

// 设置数据消费语义为exactly-once严格一次 【数据消费语义:严格一次,默认且推荐】

env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);

// 确保检查点之间有至少500 ms的间隔【checkpoint最小间隔,可以适当放大】

env.getCheckpointConfig().setMinPauseBetweenCheckpoints(500);

// 检查点必须在一分钟内完成,或者被丢弃【checkpoint的超时时间,建议结合资源和占用情况,可以适当加大。时间短可能存在无法成功的情况】

env.getCheckpointConfig().setCheckpointTimeout(60000);

// 同一时间只允许进行几个检查点,一般1个就够。

env.getCheckpointConfig().setMaxConcurrentCheckpoints(1);


总结

无论是结构化数据库还是分布式数据库,无论是实时还是离线,数据的高可靠和高可用都是必须要解决的问题。单点故障就用主从、分布式解决,防止任务故障,就用各种log、快照、checkpoint解决。

一个新技术的出现,总是会遇到各种问题,但也同样会有高手来解决问题。我要赞美这些聪明的脑袋,是怎么想出这么奇妙的解决方案的?

相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
相关文章
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
513 3
|
存储 数据处理 Apache
超越传统数据库:揭秘Flink状态机制,让你的数据处理效率飞升!
【8月更文挑战第26天】Apache Flink 在流处理领域以其高效实时的数据处理能力脱颖而出,其核心特色之一便是状态管理机制。不同于传统数据库依靠持久化存储及 ACID 事务确保数据一致性和可靠性,Flink 利用内存中的状态管理和分布式数据流模型实现了低延迟处理。Flink 的状态分为键控状态与非键控状态,前者依据数据键值进行状态维护,适用于键值对数据处理;后者与算子实例关联,用于所有输入数据共享的状态场景。通过 checkpointing 机制,Flink 在保障状态一致性的同时,提供了更适合流处理场景的轻量级解决方案。
401 0
|
消息中间件 存储 NoSQL
Flink(十二)【容错机制】(4)
Flink(十二)【容错机制】
|
存储 缓存 算法
Flink(十二)【容错机制】(2)
Flink(十二)【容错机制】
|
分布式计算 数据处理 流计算
【原理】Flink如何巧用WaterMark机制解决乱序问题
【原理】Flink如何巧用WaterMark机制解决乱序问题
|
存储 消息中间件 算法
Flink(十二)【容错机制】(1)
Flink(十二)【容错机制】
Flink(十二)【容错机制】(1)
|
存储 缓存 监控
Flink内存管理机制及其参数调优
Flink内存管理机制及其参数调优
|
存储 Java 流计算
Flink 分布式快照,神秘机制背后究竟隐藏着怎样的惊人奥秘?快来一探究竟!
【8月更文挑战第26天】Flink是一款开源框架,支持有状态流处理与批处理任务。其核心功能之一为分布式快照,通过“检查点(Checkpoint)”机制确保系统能在故障发生时从最近的一致性状态恢复,实现可靠容错。Flink通过JobManager触发检查点,各节点暂停接收新数据并保存当前状态至稳定存储(如HDFS)。采用“异步屏障快照(Asynchronous Barrier Snapshotting)”技术,插入特殊标记“屏障(Barrier)”随数据流传播,在不影响整体流程的同时高效完成状态保存。例如可在Flink中设置每1000毫秒进行一次检查点并指定存储位置。
415 0
|
存储 消息中间件 缓存
Flink(十二)【容错机制】(3)
Flink(十二)【容错机制】
|
消息中间件 安全 Kafka
Flink与Kafka的终极联盟:揭秘如何在一瞬间切换SASL机制,保护您的数据不受黑客侵袭!
【8月更文挑战第7天】Apache Flink作为高性能流处理框架,在与Kafka集成时确保数据安全至关重要。通过配置`KafkaConsumer`使用SASL机制如SCRAM-SHA-256或PLAIN,可有效防止未授权访问。SCRAM-SHA-256采用强化的身份验证流程提高安全性,而PLAIN机制则相对简单。配置涉及设置`properties`参数,包括指定`sasl.mechanism`、`security.protocol`及JAAS认证信息。合理选择和配置这些参数对于保护Flink应用与Kafka间的数据通信安全至关重要。
489 0