背景
一般情况下,flink job 应用可能会依赖多个第三方服务,如 kafka、elasticsearch。如果第三方服务故障,我们希望应用能自动恢复。结合 node.js 经验,第三方服务故障,应用报错,触发 pm2 重启应用,直到服务恢复正常。flink 也有类似的配置来实现相似的工作方式。
最近一次偶然的本地测试事故,1.234 的服务器跳电,上面的 elasticsearch 不可用了,导致在 flink 上运行的 job fail down ,但 es 恢复后 job一直没能恢复,这显然不是我们想要的。我们允许第三个服务短暂故障,但是一些依赖第三方的服务最好需要有恢复机制来保证服务是可持续的,而 flink 的任务重启策略可以很好解决类似问题。
本文将会重点介绍 flink 任务的重启策略。
配置方式
有两种配置方式,一种是集群配置,另外一种是应用代码配置。
如果未启用检查点,则使用“无重启”策略。如果激活了检查点并且尚未配置重启策略,则固定延迟策略将用于 Integer.MAX_VALUE重启尝试。
固定延迟重启策略
固定延迟重启策略尝试给定次数重新启动作业。如果超过最大尝试次数,则作业最终会失败。在两次连续重启尝试之间,重启策略等待一段固定的时间。
我们可以在 flink-conf.yaml
上配置:
restart-strategy: fixed-delay
restart-strategy.fixed-delay.attempts: 3
restart-strategy.fixed-delay.delay: 10s
当然,我们也可以在应用中配置,优先级也是最高的:
val env = ExecutionEnvironment.getExecutionEnvironment()
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(
3, // number of restart attempts
Time.of(10, TimeUnit.SECONDS) // delay ))
故障率重启策略
故障率重启策略在故障后重新启动作业,但是当 failure rate 超过(每个时间间隔的故障)时,作业最终会失败。在两次连续重启尝试之间,重启策略等待一段固定的时间。
我们可以在flink-conf.yaml
上配置:
restart-strategy: failure-rate
restart-strategy.failure-rate.max-failures-per-interval: 3
restart-strategy.failure-rate.failure-rate-interval: 5min
restart-strategy.failure-rate.delay: 10s
当然,我们也可以在应用中配置,优先级也是最高的:
val env = ExecutionEnvironment.getExecutionEnvironment()
env.setRestartStrategy(RestartStrategies.failureRateRestart(
3, // max failures per unit
Time.of(5, TimeUnit.MINUTES), //time interval for measuring failure rate
Time.of(10, TimeUnit.SECONDS) // delay ))
不重启策略
我们可以在flink-conf.yaml
上配置:
restart-strategy: none
或者,我们可以在应用上配置:
val env = ExecutionEnvironment.getExecutionEnvironment()
env.setRestartStrategy(RestartStrategies.noRestart())
目前的策略
在flink-conf.yaml
上配置
restart-strategy: failure-rate
restart-strategy.failure-rate.max-failures-per-interval: 10
restart-strategy.failure-rate.failure-rate-interval: 5 min
restart-strategy.failure-rate.delay: 10 s
意思是5分钟内失败10次,每次失败重启的间隔是10s,超过10次就认定down了,不再重试。
参考链接
本文由 Chakhsu Lau 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。