Flink的Checkpoints机制详解

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 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轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
1月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
68 3
|
3月前
|
存储 数据处理 Apache
超越传统数据库:揭秘Flink状态机制,让你的数据处理效率飞升!
【8月更文挑战第26天】Apache Flink 在流处理领域以其高效实时的数据处理能力脱颖而出,其核心特色之一便是状态管理机制。不同于传统数据库依靠持久化存储及 ACID 事务确保数据一致性和可靠性,Flink 利用内存中的状态管理和分布式数据流模型实现了低延迟处理。Flink 的状态分为键控状态与非键控状态,前者依据数据键值进行状态维护,适用于键值对数据处理;后者与算子实例关联,用于所有输入数据共享的状态场景。通过 checkpointing 机制,Flink 在保障状态一致性的同时,提供了更适合流处理场景的轻量级解决方案。
58 0
|
5月前
|
消息中间件 存储 NoSQL
Flink(十二)【容错机制】(4)
Flink(十二)【容错机制】
|
5月前
|
存储 缓存 算法
Flink(十二)【容错机制】(2)
Flink(十二)【容错机制】
|
3月前
|
存储 Java 流计算
Flink 分布式快照,神秘机制背后究竟隐藏着怎样的惊人奥秘?快来一探究竟!
【8月更文挑战第26天】Flink是一款开源框架,支持有状态流处理与批处理任务。其核心功能之一为分布式快照,通过“检查点(Checkpoint)”机制确保系统能在故障发生时从最近的一致性状态恢复,实现可靠容错。Flink通过JobManager触发检查点,各节点暂停接收新数据并保存当前状态至稳定存储(如HDFS)。采用“异步屏障快照(Asynchronous Barrier Snapshotting)”技术,插入特殊标记“屏障(Barrier)”随数据流传播,在不影响整体流程的同时高效完成状态保存。例如可在Flink中设置每1000毫秒进行一次检查点并指定存储位置。
63 0
|
4月前
|
存储 缓存 监控
Flink内存管理机制及其参数调优
Flink内存管理机制及其参数调优
|
3月前
|
消息中间件 安全 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间的数据通信安全至关重要。
74 0
|
5月前
|
存储 消息中间件 算法
|
5月前
|
存储 消息中间件 缓存
Flink(十二)【容错机制】(3)
Flink(十二)【容错机制】
|
6月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之flink sql ROW_NUMBER()回退更新的机制,有相关文档介绍吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
90 1