【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 Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...