【Flink入門修煉】2-3 Flink Checkpoint 原理機制

来源:https://www.cnblogs.com/shuofxz/p/18158541
-Advertisement-
Play Games

如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...


如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢?
單機和多機會遇到什麼不同的問題?
Flink Checkpoint 是做什麼用的?原理是什麼?

一、什麼是 Checkpoint?

Checkpoint 是對當前運行狀態的完整記錄。程式重啟後能從 Checkpoint 中恢復出輸入數據讀取到哪了,各個運算元原來的狀態是什麼,並繼續運行程式。
即用於 Flink 的故障恢復。
這種機制保證了實時程式運行時,即使突然遇到異常也能夠進行自我恢復。

二、如何實現 Checkpoint 功能?

如果讓你來設計,對於流式應用如何做到故障恢復?
我們從最簡單的單機單線程看起。

一)單機情況

同步執行,每次只處理一條數據

image.png

很簡單,這種情況下,整個流程一次只處理一條數據。

  • 數據到 Write 階段結束,各個運算元記錄一次各自狀態信息(如讀取的 offset、中間運算元的狀態)
  • 遇到故障需要恢復的時候,從上一次保存的狀態開始執行
  • 當然為了降低記錄帶來的開銷,可以攢一批之後再記錄。

同時處理多條數據

每個計算節點還是只處理一條數據,但該節點空閑就可以處理下一條數據。
image.png

如果還按照一個數據 Write 階段結束開始保存狀態,就會出現問題:

  • 前面節點的狀態,在處理下一個數據時被改過了
  • 從此時保存的記錄恢復,前面的節點會出現重覆處理的問題
  • 此時被稱為 - 確保數據不丟(At Least Once)

一種解決方式:

  • 在輸入數據中,定期插入一個 barrier
  • 各運算元遇到 barrier 就開始做狀態保留,並且不再接收新數據的計算。
  • 當前運算元狀態保留後,將 barrier 傳遞給下一個運算元,並重覆上面的步驟。
  • 當 barrier 傳遞到最後一個運算元,並完成狀態保留後,本次狀態保留完成。

這樣,各個節點保存的都是相同數據節點時的狀態。
故障恢復時,能做到不重覆處理數據,也就是精確一次(Exactly-once)。
image.png

但這裡,你可能會發現一個問題:

  • 數據已經寫出了怎麼辦?在兩個保存點之間,已經把結果寫到外部了,重啟後不是又把部分數據再寫了一次?

這裡實際是「程式內部精確一次」「端到端精確一次」
那麼如何做到「端到端精確一次」?

  • 方案一:最後一個 sink 運算元不直接向外部寫出,等到 barrier 來了,才把這一批數據批量寫出去
  • 方案二:兩階段提交。需要 sink 端支持(如 kafka)。
    • 方式類似於 MySQL 的事務。
    • sink 端正常向外部寫出,不過輸出端處於 pre-commit 狀態,這些數據還不可讀取
    • 當 sink 端等到 barrier 時,將輸出端數據變為 committed,下游輸出端的數據才正式可讀

不過以上方法為了做到端到端精確一次,會帶來數據延遲問題。(因為要等 Checkpoint 做完,數據才實際可讀)。

解決數據延遲有一種方案:

  • 方案:冪等寫入。同樣一條數據,無論寫入多少次對輸出端看來都是一樣的。(比如按照主鍵重覆寫這一條數據,並且數據本身沒變化)

二)重要概念介紹

一致性級別

前面的例子中,我們提到了部分一致性級別,這裡我們總結下。在流處理中,一致性可以分為 3 個級別:

  • at-most-once(最多一次): 這其實是沒有正確性保障的委婉說法——故障發生之後,計數結果可能丟失。
  • at-least-once (至少一次): 這表示計數結果可能大於正確值,但絕不會小於正確值。也就是說,計數程式在發生故障後可能多算,但是絕不會少算。
  • exactly-once (精確一次): 這指的是系統保證在發生故障後得到的計數結果與正確值一致。恰好處理一次是最嚴格的保證,也是最難實現的。

按區間分:

  • 程式(Flink)內部精確一次
  • 端到端精確一次

Checkpoint 中保留的是什麼信息?


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Java開發中,我們經常需要獲取和處理時間,這需要使用到各種不同的方法。其中,使用SimpleDateFormat類來格式化時間是一種常見的方法。雖然這個類看上去功能比較簡單,但是如果使用不當,也可能會引發一些問題。 ...
  • 一、MyBatis動態 sql 是什麼 動態 SQL 是 MyBatis 的強大特性之一。在 JDBC 或其它類似的框架中,開發人員通常需要手動拼接 SQL 語句。根據不同的條件拼接 SQL 語句是一件極其痛苦的工作。 例如,拼接時要確保添加了必要的空格,還要註意去掉列表最後一個列名的逗號。而動態 ...
  • 故事 “不能在寫if else來拓展當前系統了,現在已經有三個支付場景了......”工位上,小貓看著電腦,撓著頭。 就在剛剛,小貓接到了一個新需求,需要和客戶公司打通資產,形成資產聯動。說白了就是需要定製化對接客戶公司的支付資產體系。除了這次接到的之外。前面其實已經對接了三家了。由於每家對接規範都 ...
  • 數據結構演算法題 通過鍵盤輸入一個包括 '(' 和 ')' 的字元串string ,判斷字元串是否有效。要求設計演算法實現檢查字元串是否有效,有效的字元串需滿足以下條件: A.左括弧必須用相同類型的右括弧閉合。 B.左括弧必須以正確的順序閉合。 C.每個右括弧都有一個對應的相同類型的左括弧。 思路: 1 ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...