當任務失敗時,Flink 需要重新啓動失敗的任務和其他受影響的任務,將作業恢復到正常狀態。
重新啓動策略和故障轉移策略用於控制任務重新啓動。重新啓動策略決定是否以及何時可以重新啓動失敗/受影響的任務。故障轉移策略決定應該重新啓動哪些任務以恢復作業。
重啓策略
可以使用默認的重啓策略來啓動集羣,在沒有定義特定於作業的重啓策略時,總是使用默認的重啓策略。如果提交的作業帶有重啓策略,該策略將覆蓋集羣的默認設置。
默認的重啓策略是通過 Flink 的配置文件 flink-conf.yaml 設置的。配置參數重新啓動策略定義了採取哪種策略。如果沒有啓用檢查點,則使用“no restart”策略。如果檢查點被激活,並且沒有配置重啓策略,則使用 Integer.MAX_VALUE
的固定延遲策略重啓嘗試。請參閱下面的可用重啓策略列表,以瞭解支持哪些值。
每個重啓策略都有自己的一組參數來控制其行爲。這些值也在配置文件中設置。每個重新啓動策略的描述包含有關各自配置值的更多信息。
Restart Strategy | Value for restart-strategy |
---|---|
Fixed delay | fixed-delay |
Failure rate | failure-rate |
No restart | none |
除了定義默認的重啓策略外,還可以爲每個 Flink 作業定義一個特定的重啓策略。此重新啓動策略是通過調用 ExecutionEnvironment 上的 setRestartStrategy 方法以編程方式設置的。注意,這也適用於 StreamExecutionEnvironment。
下面的示例演示如何爲作業設置固定延遲重新啓動策略。在失敗的情況下,系統嘗試重新啓動作業3次,並在連續的重新啓動嘗試之間等待10秒。
val env = ExecutionEnvironment.getExecutionEnvironment()
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(
3, // number of restart attempts
Time.of(10, TimeUnit.SECONDS) // delay
))
下面幾節描述特定於重啓策略的配置選項。
Fixed Delay Restart Strategy
固定延遲重新啓動策略嘗試給定次數來重新啓動作業。如果超過了最大嘗試次數,作業最終會失敗。在兩次連續的重啓嘗試之間,重啓策略等待固定的時間。
通過在flink- confi.yaml中設置以下配置參數,可以將此策略作爲默認啓用。
restart-strategy: fixed-delay
Configuration Parameter | Description | Default Value |
---|---|---|
restart-strategy.fixed-delay.attempts |
在作業被聲明爲失敗之前,Flink重試執行的次數。 | 如果啓用檢查點,more之爲1, 或 Integer.MAX_VALUE |
restart-strategy.fixed-delay.delay |
延遲重試意味着在執行失敗後,重新執行不會立即開始,而是在一定的延遲之後纔開始。當程序與外部系統交互時(例如連接或掛起的事務在嘗試重新執行之前應該達到超時),延遲重試可能很有幫助。 | 如果啓用檢查點,默認值爲akka.ask.timeout , or 10s |
For example:
restart-strategy.fixed-delay.attempts: 3
restart-strategy.fixed-delay.delay: 10 s
固定延遲重啓策略也可程序設置:
val env = ExecutionEnvironment.getExecutionEnvironment()
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(
3, // number of restart attempts
Time.of(10, TimeUnit.SECONDS) // delay
))
Failure Rate Restart Strategy
故障率重新啓動策略在失敗後重新啓動作業,但是當超過故障率(每個時間間隔的失敗)時,作業最終失敗。在兩次連續的重啓嘗試之間,重啓策略等待固定的時間。
通過在flink- confi.yaml中設置以下配置參數,可以將此策略作爲默認啓用。
restart-strategy: failure-rate
Configuration Parameter | Description | Default Value |
---|---|---|
restart-strategy.failure-rate.max-failures-per-interval | 失敗作業前給定時間間隔內的最大重啓次數 | 1 |
restart-strategy.failure-rate.failure-rate-interval | 測量故障率的時間間隔。 | 1 minute |
restart-strategy.failure-rate.delay | 兩次連續重啓嘗試之間的延遲 | akka.ask.timeout |
restart-strategy.failure-rate.max-failures-per-interval: 3
restart-strategy.failure-rate.failure-rate-interval: 5 min
restart-strategy.failure-rate.delay: 10 s
故障率重啓策略也可以通過程序設置:
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
))
No Restart Strategy
作業直接失敗,沒有嘗試重新啓動。
restart-strategy: none
無重啓策略也可以通過代碼設置:
val env = ExecutionEnvironment.getExecutionEnvironment()
env.setRestartStrategy(RestartStrategies.noRestart())
Fallback Restart Strategy
使用集羣定義的重啓策略。這對於支持檢查點的流程序很有幫助。默認情況下,如果沒有定義其他重啓策略,則選擇固定延遲重啓策略。
故障恢復策略
Flink 支持不同的故障轉移策略,可以通過配置 flink-conf.yaml 中的 jobmanager.execution.failover-strategy 參數控制。
Failover Strategy | Value for jobmanager.execution.failover-strategy |
---|---|
Restart all | full |
Restart pipelined region | region |
重新啓動所有故障轉移策略
此策略重新啓動作業中的所有任務以從任務失敗中恢復。
Restart Pipelined Region Failover Strategy
這種策略把任務分成互不相連的區域。當檢測到任務失敗時,此策略計算必須重新啓動以從失敗中恢復的最小區域集。對於某些作業,與 Restart All Failover 策略相比,這會導致重新啓動的任務更少。
區域是一組通過流水線數據交換進行通信的任務。也就是說,批量數據交換表示一個區域的邊界:
- DataStream作業或流表/SQL作業中的所有數據交換都是流水線的。
- 默認情況下,批處理表/SQL作業中的所有數據交換都是成批處理的。
- 數據集作業中的數據交換類型由ExecutionMode決定,可以通過ExecutionConfig設置該模式。
重新啓動的區域決定如下:
- 包含失敗任務的區域將重新啓動。
- 如果結果分區在被重新啓動的區域時不可用,產生結果分區的區域也將重新啓動。
- 如果要重新啓動某個區域,則該區域的所有消費者區域也將重新啓動。這是爲了保證數據一致性,因爲不確定性處理或分區可能導致不同的分區。
原文地址:https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/task_failure_recovery.html