Flink Streaming检查点(Checkpointing)设置

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

为了使状态容错,Flink需要对状态进行checkpoint(检查点)。检查点允许Flink恢复流中的状态和位置,从而为应用程序提供与无故障执行相同的语义。
documentation on streaming fault tolerance详细描述了Flink流容错机制背后的技术。

前提

Flink的检查点机制与流和状态的持久存储交互。一般而言,它要求:

  • 可以在一定时间内重复使用持久化的数据源。此类源的示例:持久消息队列(例如Apache Kafka、RabbitMQ、Amazon Kinesis、谷歌PubSub)或文件系统(例如HDFS、S3、GFS、NFS、Ceph,……)。
  • 状态的持久存储,通常是分布式文件系统(例如,HDFS, S3, GFS, NFS, Ceph,…)

启用和配置检查点(Enabling and Configuring Checkpointing)

默认情况下,禁用检查点。要启用检查点请在StreamExecutionEnvironment上调用enablecheckpoint(n),其中n是检查点间隔(以毫秒为单位)。
检查点的其他参数包括:

  • 精确一次和至少一次(exactly-once vs. at-least-once): 可以选择将一个模式传递给enablecheckpoint(n)方法,在两个保证级别之间进行选择。 精确一次(Exactly-once)适用于大多数应用程序。至少一次(At-least-once)可能与某些超低延迟(持续几毫秒)的应用程序相关。
  • 检查点超时(checkpoint timeout):如果在此之前未完成,则中止正在执行的检查点的时间。
  • 检查站之间的最短时间(minimum time between checkpoints): 为了确保流应用程序在检查点之间取得一定的进展,可以定义在检查点之间需要经过多少时间。例如,如果将该值设置为5000,则下一个检查点将在上一个检查点完成后5秒内启动,不考虑检查点持续时间和检查点间隔。注意,这意味着检查点间隔永远不会小于此参数。

通过定义检查点之间的时间比检查点间隔更容易配置应用程序,因为“检查点之间的时间”不容易受到检查点有时花费的时间可能超过平均时间这一事实的影响(例如,如果目标存储系统临时变慢)。
注意,这个值还意味着并发检查点的数量是1。

  • 并发检查点数量(number of concurrent checkpoints):默认情况下,当一个检查点仍在运行时,系统不会触发另一个检查点。这确保拓扑不会在检查点上花费太多时间,也不会在处理流方面取得进展。可以允许多个重叠的检查点,这对于具有一定处理延迟(例如,因为函数调用需要一些时间来响应的外部服务)但仍然希望执行非常频繁的检查点(100毫秒)以在出现故障时很少重新处理的管道来说非常有趣。
    当定义检查点之间的最小时间时,不能使用此选项。

  • 外部化的检查点(externalized checkpoints):您可以将定期检查点配置为在外部持久化。外部化检查点将它们的元数据写到持久存储中,并且在作业失败时不会自动清理。这样,如果你的工作失败了,你就有一个检查点可以继续。关于外部化检查点的部署说明中有更多详细信息。

  • 检查点错误上的失败/继续任务(fail/continue task on checkpoint errors): 如果在执行任务的检查点过程中发生错误,则任务将失败。这是默认行为。或者当禁用此选项时,任务将简单地将检查点交给检查点协调器并继续运行。

val env = StreamExecutionEnvironment.getExecutionEnvironment()

// 每隔1000 ms进行启动一个检查点
env.enableCheckpointing(1000)

// advanced options:

// 设置模式为exactly-once 默认(this is the default)
env.getCheckpointConfig.setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE)

// 确保检查点之间有进行500 ms的进度
env.getCheckpointConfig.setMinPauseBetweenCheckpoints(500)

// 检查点必须在一分钟内完成,或者被丢弃
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)

// 同一时间只允许进行一个检查点
env.getCheckpointConfig.setMaxConcurrentCheckpoints(1)

相关的配置选项

可以通过 conf/flink-conf.yaml设置更多参数或默认值(详见配置):

Key默认值描述
state.backend(none)用于存储和检查点状态的状态后端。
state.backend.asynctrue选项状态后端是否应在可能且可配置的情况下使用异步快照方法。某些状态后端可能不支持异步快照,或者只支持异步快照,并忽略此选项。
state.backend.fs.memory-threshold1024状态数据文件的最小值。所有小于此值的状态块都内联存储在根检查点元数据文件中。
state.backend.incrementalfalse如果有可能的话,选项状态后端应该创建增量检查点,对于增量检查点,只存储与前一个检查点的差异,而不是完整的检查点状态。一些状态后端可能不支持增量检查点,并忽略此选项。
state.backend.local-recoveryfalse此选项配置此状态后端的本地恢复。默认情况下,本地恢复是不可用的。本地恢复目前只有键状态后端可用。目前,memorystateback不支持本地恢复,并忽略此选项。
state.checkpoints.dir(none)用于在支持Flink的文件系统中存储检查点的数据文件和元数据的默认目录。存储路径必须可以从所有参与的流程/节点访问(即所有任务管理器和作业管理器)。
state.checkpoints.num-retained1保留已完成的检查点的最大数量。
state.savepoints.dir(none)保存点的默认目录。用于将保存点写入文件系统的状态后端(memorystate后端、fsstate后端、rocksdbstate后端)。
taskmanager.state.local.root-dirs(none)配置参数定义根目录,用于存储本地恢复的基于文件的状态。本地恢复目前只覆盖键状态后端。目前,memorystateback不支持本地恢复,并忽略此选项

选择状态后端

Flink的(检查点机制)[https://ci.apache.org/projects/flink/flink-docs-release-1.7/internals/stream_checkpointing.html]在计时器和有状态操作符中存储所有状态的一致快照,包括连接器、窗口和用户定义的状态。检查点存储在何处(例如,JobManager内存、文件系统、数据库)取决于配置的状态后端。

默认情况下,状态保存在Taskmanager的内存中,检查点存储在JobManager的内存中。对于大状态的适当持久性,Flink支持在其他状态后端存储和检查点状态的各种方法。状态后端可以通过streamexecutionenvironment.setStateBackend(…)配置。

有关可用的状态后端以及作业范围和集群范围配置的选项的详细信息,请参见状态后端

迭代作业中的状态检查点

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

重新启动策略

Flink支持不同的重启策略,这些策略控制在出现故障时如何重新启动作业。有关更多信息,请参见重新启动策略

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值