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是以毫秒为单位的检查点间隔。

用于检查点的其他参数包括:

  • 精确一次与最少一次:可以选择将模式传递给enableCheckpointing(n)方法,以在两个保证级别之间进行选择。对于大多数应用而言,一次最好。至少一次可能与某些超低延迟(持续几毫秒)的应用有关。
  • checkpoint timeout:正在进行中的检查点被终止的时间,如果该时间点之前尚未完成的话。
  • 检查点之间的最短时间:为了确保流式应用程序在检查点之间取得一定的进度,可以定义检查点之间需要经过多少时间。如果将此值设置为5000,则下一个检查点将在上一个检查点完成后不超过5秒的时间内启动,而不管检查点持续时间和检查点间隔如何。请注意,这意味着检查点间隔永远不会小于此参数。
  • 通过定义“检查点之间的时间”而不是检查点间隔,通常更容易配置应用程序,因为“检查点之间的时间”不容易受到检查点有时可能花费比平均时间更长的事实的影响(例如,如果目标存储系统暂时变慢)。请注意,此值还表示并发检查点的数量为1。
  • 并发检查点数:默认情况下,当一个检查点仍在进行时,系统不会触发另一个检查点。这样可以确保拓扑不会在检查点上花费太多时间,也不会在处理流方面取得进展。可以允许多个重叠的检查点,这对于具有一定处理延迟(例如,因为函数调用需要一些时间来响应的外部服务,但仍要执行非常频繁的检查点(100毫秒)),以便在失败时很少进行重新处理。当定义检查点之间的最短时间时,不能使用此选项。
  • 外部检查点:可以配置要在外部持久保存的定期检查点。外部化的检查点将其元数据写出到永久存储中,并且在作业失败时不会自动清除。这样,将有一个检查点可以从工作失败的地方恢复。
  • 检查点错误时的失败/继续任务:如果执行任务的检查点过程时发生错误,这将确定任务是否失败。这是默认行为。禁用此选项后,任务将简单地将检查点拒绝给检查点协调器并继续运行。
  • 首选恢复检查点:即使有更多可用的最近保存点来减少恢复时间,这也可以确定作业是否将回退到最新的检查点。
  • 未对齐的检查点:可以启用未对齐的检查点,以大大减少背压下的检查点时间。仅适用于仅一次检查点,并且同时检查点数为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:
Flink高级特性之检查点_第1张图片
Flink高级特性之检查点_第2张图片

五.选择状态后端

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

默认情况下,状态保存在TaskManager的内存中,检查点保存在JobManager的内存中。为了适当保留大状态,Flink支持在其他状态后端中存储和检查点状态的各种方法。可以通过StreamExecutionEnvironment.setStateBackend(…)来配置状态后端。

六.迭代作业中的状态检查点

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

请注意,在故障期间,循环边缘中正在运行的记录(以及与它们相关的状态更改)将丢失。

七.重新启动策略

Flink支持不同的重新启动策略,这些策略控制在出现故障时如何重新启动作业。

你可能感兴趣的:(大数据,流计算,Flink)