检查点

Flink中的每一个函数和操作符都可以是有状态的(详情请看使用状态)。有状态的函数在单个元素/事件的处理过程中存储数据,使得状态成为任何类型的更复杂操作的关键构建模块。

为了使状态具有容错性,Flink需要对状态进行检查点。检查点允许Flink恢复流中的状态和位置,使应用程序具有与无故障执行相同的语义。

关于流式容错的文档详细描述了Flink的流式容错机制背后的技术。

前置条件

Flink的检查点机制与流和状态的持久存储交互。一般来说,它需要

  • 一个能在一定时间内重放记录的持久(或耐用)数据源。这种来源的例子是持久性消息队列(如Apache Kafka、RabbitMQ、Amazon Kinesis、Google PubSub)或文件系统(如HDFS、S3、GFS、NFS、Ceph...)。
  • 状态的持久性存储,通常是一个分布式文件系统(如HDFS、S3、GFS、NFS、Ceph...)。

启用和配置检查点

默认情况下,检查点被禁用。要启用检查点,在StreamExecutionEnvironment上调用enableCheckpointing(n),其中n是检查点间隔,单位为毫秒。

检查点的其他参数包括

  • exactly-once vs. at-least-once:你可以选择向enableCheckpointing(n)方法传递一个模式,以便在两个保证级别之间进行选择。对于大多数应用来说,exactly-once是比较好的。At-least-once可能适用于某些超低延迟(持续几毫秒)的应用。
  • 检查点超时。如果一个正在进行中的检查点没有完成,那么它被中止的时间。
  • 检查点之间的最小时间。为了确保流应用在检查点之间有一定的进度,可以定义检查点之间需要经过多少时间。例如,如果这个值设置为5000,那么下一个检查点将在上一个检查点完成后不早于5秒开始,无论检查点持续时间和检查点间隔如何。请注意,这意味着检查点间隔永远不会小于这个参数。
  • 通过定义 "检查点之间的时间 "通常比检查点间隔更容易配置应用程序,因为 "检查点之间的时间 "不容易受到检查点有时可能比平均时间长的事实的影响(例如,如果目标存储系统暂时缓慢)。
  • 请注意,这个值也意味着并发检查点的数量为1。
  • 并发检查点的数量。默认情况下,当一个检查点仍在进行时,系统不会触发另一个检查点。这可以确保拓扑不会在检查点上花费太多时间,而使处理流的工作没有进展。可以允许多个重叠的检查点,这对于那些有一定处理延迟(例如因为函数调用外部服务,需要一些时间来响应),但仍然希望做非常频繁的检查点(100s毫秒),以便在故障时重新处理很少的管道来说是很有意思的。
  • 当定义了检查点之间的最小时间时,不能使用这个选项。
  • 外部化检查点。您可以配置周期性检查点,使其在外部持久化。外部化的检查点会将它们的元数据写入持久化存储中,当作业失败时不会自动清理。这样一来,如果你的工作失败了,你身边就会有一个检查点来恢复。关于外部化检查点的部署说明中有更多细节。
  • Fail/continue task on checkpoint errors。这决定了如果在执行任务的检查点过程中出现错误,任务是否会失败。这是默认行为。另外,当禁用该功能时,任务将简单地拒绝向检查点协调器提供检查点并继续运行。
  • 更喜欢用于恢复的检查点。这决定了即使有更近的保存点可用时,任务是否会回退到最新的检查点,以减少恢复时间。
  • 不对齐的检查点。你可以启用不对齐的检查点,以大大减少背压下的检查点时间。只适用于精确的一次检查点,并且并发检查点的数量为1。
val env = StreamExecutionEnvironment.getExecutionEnvironment()

// start a checkpoint every 1000 ms
env.enableCheckpointing(1000) // advanced options: // set mode to exactly-once (this is the default)
env.getCheckpointConfig.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE) // make sure 500 ms of progress happen between checkpoints
env.getCheckpointConfig.setMinPauseBetweenCheckpoints(500) // checkpoints have to complete within one minute, or are discarded
env.getCheckpointConfig.setCheckpointTimeout(60000) // prevent the tasks from failing if an error happens in their checkpointing, the checkpoint will just be declined.
env.getCheckpointConfig.setFailTasksOnCheckpointingErrors(false) // allow only one checkpoint to be in progress at the same time
env.getCheckpointConfig.setMaxConcurrentCheckpoints(1) // enables the experimental unaligned checkpoints
env.getCheckpointConfig.enableUnalignedCheckpoints()

  

相关配置选项

更多的参数和/或默认值可以通过conf/flink-conf.yaml来设置(参见配置的完整指南)。

Key Default Type 描述
state.backend
(none) String 用于存储和检查状态的状态后端。
state.backend.async
true Boolean

状态后端是否应该在可能的情况下使用异步快照方法的选项,可配置。有些状态后端可能不支持异步快照,或者只支持异步快照,而忽略这个选项。

state.backend.fs.memory-threshold
20 kb MemorySize

状态数据文件的最小尺寸。小于这个大小的所有状态块都内嵌存储在根检查点元数据文件中。此配置的最大内存阈值为1MB。

state.backend.fs.write-buffer-size
4096 Integer

写入文件系统的检查点流的默认写缓冲区大小。实际的写入缓冲区大小是由这个选项和选项'state.backend.fs.memory-threshold'的值的最大值决定的。

state.backend.incremental
false Boolean

如果可能,状态后端是否应该创建增量检查点。对于增量检查点,只存储与前一个检查点的差异,而不是完整的检查点状态。一旦启用,在web UI中显示的状态大小或从休息API中获取的状态大小只代表delta检查点大小,而不是完整的检查点大小。一些状态后端可能不支持增量检查点而忽略这个选项。

state.backend.local-recovery
false Boolean

这个选项可以配置这个状态后端的本地恢复。默认情况下,本地恢复是被停用的。本地恢复目前只覆盖键控状态后端。目前,MemoryStateBackend不支持本地恢复,忽略此选项。

state.checkpoints.dir
(none) String

在Flink支持的文件系统中,用于存储检查点数据文件和元数据的默认目录。该存储路径必须可以从所有参与进程/节点(即所有任务管理器和工作管理器)访问。

state.checkpoints.num-retained
1 Integer

保留已完成的检查点的最大数量。

state.savepoints.dir
(none) String

保存点的默认目录。由将保存点写入文件系统的状态后端(MemoryStateBackend, FsStateBackend, RocksDBStateBackend)使用。

taskmanager.state.local.root-dirs
(none) String 配置参数,定义本地恢复中存储基于文件的状态的根目录。本地恢复目前只覆盖键态后端。目前,MemoryStateBackend不支持本地恢复,忽略这个选项。

选择状态后端

Flink的检查点机制在定时器和有状态的操作符中存储所有状态的一致快照,包括连接器、窗口和任何用户定义的状态。检查点的存储位置(例如,JobManager内存、文件系统、数据库)取决于配置的状态后端。

默认情况下,状态保存在TaskManagers的内存中,检查点保存在JobManager的内存中。为了正确地持久化大状态,Flink支持各种方法在其他状态后端存储和检查点状态。状态后端的选择可以通过StreamExecutionEnvironment.setStateBackend(...)来配置。

关于可用的状态后端以及作业范围和集群范围配置的选项,请参见状态后端。

迭代作业中的状态检查点

Flink目前只为没有迭代的作业提供处理保证。在迭代作业上启用检查点会导致异常。为了在迭代程序上强制检查点,用户需要在启用检查点时设置一个特殊标志:env.enableCheckpointing(interval, CheckpointingMode.EXACTLY_ONCE, force = true)。

请注意,循环边缘中飞行中的记录(以及与之相关的状态变化)将在失败时丢失。

重新启动策略

Flink支持不同的重启策略,这些策略可以控制作业在发生故障时如何重启。更多信息,请参阅重启策略。

Flink-v1.12官方网站翻译-P024-Checkpointing的更多相关文章

  1. Flink-v1.12官方网站翻译-P005-Learn Flink: Hands-on Training

    学习Flink:实践培训 本次培训的目标和范围 本培训介绍了Apache Flink,包括足够的内容让你开始编写可扩展的流式ETL,分析和事件驱动的应用程序,同时省略了很多(最终重要的)细节.本书的重 ...

  2. Flink-v1.12官方网站翻译-P025-Queryable State Beta

    可查询的状态 注意:可查询状态的客户端API目前处于不断发展的状态,对所提供接口的稳定性不做保证.在即将到来的Flink版本中,客户端的API很可能会有突破性的变化. 简而言之,该功能将Flink的托 ...

  3. Flink-v1.12官方网站翻译-P004-Flink Operations Playground

    Flink操作训练场 在各种环境中部署和操作Apache Flink的方法有很多.无论这种多样性如何,Flink集群的基本构件保持不变,类似的操作原则也适用. 在这个操场上,你将学习如何管理和运行Fl ...

  4. Flink-v1.12官方网站翻译-P002-Fraud Detection with the DataStream API

    使用DataStream API进行欺诈检测 Apache Flink提供了一个DataStream API,用于构建强大的.有状态的流式应用.它提供了对状态和时间的精细控制,这使得高级事件驱动系统的 ...

  5. Flink-v1.12官方网站翻译-P021-State & Fault Tolerance-overview

    状态和容错 在本节中,您将了解Flink为编写有状态程序提供的API.请看一下Stateful Stream Processing来了解有状态流处理背后的概念. 下一步去哪里? Working wit ...

  6. Flink-v1.12官方网站翻译-P017-Execution Mode (Batch/Streaming)

    执行模式(批处理/流处理) DataStream API 支持不同的运行时执行模式,您可以根据用例的要求和作业的特点从中选择.DataStream API 有一种 "经典 "的执行 ...

  7. Flink-v1.12官方网站翻译-P015-Glossary

    术语表 Flink Application Cluster Flink应用集群是一个专用的Flink集群,它只执行一个Flink应用的Flink作业.Flink集群的寿命与Flink应用的寿命绑定. ...

  8. Flink-v1.12官方网站翻译-P010-Fault Tolerance via State Snapshots

    通过状态快照进行容错 状态后台 Flink管理的键控状态是一种碎片化的.键/值存储,每项键控状态的工作副本都被保存在负责该键的任务管理员的本地某处.操作员的状态也被保存在需要它的机器的本地.Flink ...

  9. Flink-v1.12官方网站翻译-P008-Streaming Analytics

    流式分析 事件时间和水印 介绍 Flink明确支持三种不同的时间概念. 事件时间:事件发生的时间,由产生(或存储)该事件的设备记录的时间 摄取时间:Flink在摄取事件时记录的时间戳. 处理时间:您的 ...

随机推荐

  1. 学习笔记之Python人机交互小项目一:名字管理系统

    2020是一个不平凡的一年,但即使挫折不断,我们每学期的课程实训也没有受到影响,仍旧如期实施.与往年不同的是,今年的实训老师是学校邀请的公司在职人员来给我们实训.今年实训的内容是Python语言,下面 ...

  2. 为什么Elasticsearch不适合做数据存储?(转学习使用)

    一.问题描述 公司想尝试使用Elasticsearch来存一部分数据,以此缓解数据增长带来的对数据库的压力.在研究了一段时间后,发现Elasticsearch不适合作为数据存储使用. 二.理由如下 1 ...

  3. Openwrt_Linux_crontab任务_顺序执行脚本

    Openwrt_Linux_crontab任务_顺序执行脚本 转载注明来源: 本文链接 来自osnosn的博客,写于 2020-12-21. Linux (openwrt,debian,centos. ...

  4. 3.k8s存储之ConfigMap、Secret

    1.ConfigMap ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.ConfigMap API 给我们提供了向容器 ...

  5. Java 中泛型的实现原理

    泛型是 Java 开发中常用的技术,了解泛型的几种形式和实现泛型的基本原理,有助于写出更优质的代码.本文总结了 Java 泛型的三种形式以及泛型实现原理. 泛型 泛型的本质是对类型进行参数化,在代码逻 ...

  6. 面试官:你真的了解Redis分布式锁吗?

    什么是分布式锁 说到Redis,我们第一想到的功能就是可以缓存数据,除此之外,Redis因为单进程.性能高的特点,它还经常被用于做分布式锁. 锁我们都知道,在程序中的作用就是同步工具,保证共享资源在同 ...

  7. Java内存模型与线程(二)线程的实现和线程的调度

    先行先发生原则(happen-before原则) 先行先发生是指Java内存模型中定义的两项操作之间的偏序关系. 如果说A先行于B,其实就是说在发生B操作之前,操作A产生的影响能被操作B观察到,至于这 ...

  8. Centos 6 下安装 OSSEC-2.8.1 邮件告警 (二)

    Ossec 配置邮件通知 ## 1 安装软件包: yum install -y sendmail mailx cyrus-sasl cyrus-sasl-plain #安装postfix邮件相关的软件 ...

  9. Hbase Region合并

    业务场景: Kafka+SparkStreaming+Hbase由于数据大量的迁移,再加上业务的改动,新增了很多表,导致rerigon总数接近4万(36个节点) 组件版本: Kafka:2.1.1 S ...

  10. 登陆到 SAP 系统后的用户出口

    增强类型:smod 增强名称:SUSR0001 组件(退出功能模块):EXIT_SAPLSUSF_001 功能:用户每次登陆SAP系统后都会调用这个SUSR0001增强,可以在FUNCTION EXI ...