當 Task 發生故障時,Flink 需要重啟出錯的 Task 以及其他受到影響的 Task ,以使得作業恢復到正常執行狀態。
Flink 通過重啟策略和故障恢復策略來控制 Task 重啟:重啟策略決定是否可以重啟以及重啟的間隔;故障恢復策略決定哪些 Task 需要重啟。
全圖重啟故障恢復策略
在全圖重啟故障恢復策略下,Task 發生故障時會重啟作業中的所有 Task 進行故障恢復。
基於 Region 的局部重啟故障恢復策略
該策略會將作業中的所有 Task 划分為數個 Region。當有 Task 發生故障時,它會嘗試找出進行故障恢復需要重啟的最小 Region 集合。
相比於全局重啟故障恢復策略,這種策略在一些場景下的故障恢復需要重啟的 Task 會更少。
此處 Region 指以 Pipelined 形式進行數據交換的 Task 集合。也就是說,Batch 形式的數據交換會構成 Region 的邊界。
- DataStream 和 流式 Table/SQL 作業的所有數據交換都是 Pipelined 形式的。
- 批處理式 Table/SQL 作業的所有數據交換默認都是 Batch 形式的。
- DataSet 作業中的數據交換形式會根據 [ExecutionConfig]({{ site.baseurl }}/zh/dev/execution_configuration.html)
中配置的 [ExecutionMode]({{ site.javadocs_baseurl }}/api/java/org/apache/flink/api/common/ExecutionMode.html)
決定。
需要重啟的 Region 的判斷邏輯如下:
1. 出錯 Task 所在 Region 需要重啟。
2. 如果要重啟的 Region 需要消費的數據有部分無法訪問(丟失或損壞),產出該部分數據的 Region 也需要重啟。
3. 需要重啟的 Region 的下游 Region 也需要重啟。這是出於保障數據一致性的考慮,因為一些非確定性的計算或者分發會導致同一個
Result Partition 每次產生時包含的數據都不相同。
Region 的局部重啟故障恢復策略實現
1. 根據ExecutionGraph 構建 FailoverTopology