【Flink系列五】Checkpoint及Barrier原理

本章內容

  • 一致性檢查點
  • 從檢查點恢復狀態
  • 檢查點實現算法-barrier
  • 保存點Savepoint
  • 狀態后端(state backend)

本文先設置一個前提,流處理的數據都是可回放的(可以理解成消費的kafka的數據)

一致性檢查點(checkpoints)

圖1

  • checkpoint是Flink故障恢復的核心,全稱是應用狀態的一致性檢查點
  • 有狀態流應用的一致性檢查點,其實就是所有任務處理完數據的狀態,在某個時間點的一份拷貝(一份快照,存儲在狀態后端),這個時間點,應用是所有任務能恰好處理完一個相同的輸入數據的時候

(圖1中不考慮時間,假設1、2、3、4、5、6、7為source源,even為偶數6=2+4,odd為奇數求和9=1+3+5,此時5這個數據在所有tasks都處理完成了,每個任務都會提交一份快照給JM,最終這份拓撲結構(source任務狀態是5、sum_even狀態是6、sum_odd狀態是9)稱為checkpoint)

從檢查點恢復狀態

圖2

  • 在執行流應用期間,Flink會定期保存狀態的一致性檢查點
  • 如果發生故障,Flink會使用最近的檢查點來一致恢復應用程序的狀態,并重新啟動處理流程

(假設處理到7這個數據的時候,sum_even=2+4+6=12,sum_odd在處理7這個數據的時候fail了,應該如果恢復數據呢)

第一步:遇到故障之后,重啟受影響的應用,應用重啟的之后,所有任務的狀態都是空的

圖3

第二步:從checkpoint中讀取狀態,將狀態重置,從檢查點重新啟動應用程序后,其內部狀態與檢查點完成時的狀態完全相同(回到了和圖1相同的狀態,如果算子設置了并行度,也可以恢復)。恢復后,source任務必須從檢查點恢復的結果后開始讀取數據(必須從6開始讀取數據)

圖4

第三步:開始消費并處理檢查點到發生故障之間的所有數據。(處理完7后,sum_even=2+4+6=12,sum_odd=1+3+5+7=16, 所有tasks都處理完后,又會提交一個checkpoint)

圖5

這種檢查點的保存和恢復機制可以為應用程序狀態提供“精確一次”(exactly-once)的一致性,因為所有的算子都會保存檢查點并恢復其所有狀態,這樣依一來所有的輸入流就都會被重置到檢查點完成時的位置。

檢查點的實現算法

基于Chandy-Lamport算法的分布式快照,將檢查點的保存和數據處理分離開,不暫停整個應用

思考一個問題:flink如何判斷某個數據已經處理完了呢?(比如圖1的offset=5的數據)

答案:是否在每個數據后面跟一個標記,當讀到這個標記的時候觸發task狀態的保存

檢查點分界線(checkpoint barrier)
  • Flink的檢查點算法用到了一種稱為分界線(barrier)的特殊數據形式,用來把一條流上數據按照不同的檢查點分開
  • 分界線之前到來的數據導致的狀態更改,都會包含在當前分界線所屬的檢查點中;二基于分界線之后的數據導致的所有更改,就會包含在之后的檢查點中

圖6

barrier有很多叫法,如檢查點屏障等

分析一下barrier的工作流程,假設現在有這樣的一個場景:有兩個輸入流的應用程序,用并行的兩個source任務來讀取(可以認為kafka的兩個分區,source并行度設置為2),如圖7所示。barrier也是和watermark一樣,都是通過廣播的方式傳遞給下游算子

圖7

(source任務的并行度=2,sum任務的并行度也是2,sink任務的并行度也是2。)

如圖7,兩個流的數據都是1、2、3、4、5、6;藍色數字圓圈代表最后一個處理的是藍流里面的數據,黃色數字圓圈代表最后一個處理的是黃流里面的數據。

圖8

圖8中兩條流的情況下,barrier如何傳遞呢?(watermark是取上游分區的最小值)下面一起來看一下

圖9

barrier是怎么產生的?

答:JobManager會向每個source任務(同時發給并行的source任務)發送一條帶有檢查點ID的消息(藍色三角形2),通過這種方式來啟動檢查點。產生barrier的過程中,不會影響下游task的正常工作(圖9相比圖8黃2和藍2都sink完成了)圖9中barrier(ID=2)插入在stream1的3后面,stream2的4后面

圖10

barrier隨著數據流動,廣播到下游,source任務處理完barrier(ID=2)后,會向狀態后端發送checkpoint,記錄此時的狀態。圖10相比圖9藍3和黃4都被sum任務處理了。

  • 數據源將他們的狀態寫入檢查點,并發出一個檢查點barrier
  • 狀態后端在狀態存入檢查點之后,會返回通知給source任務,source任務就會向JobManager確認檢查點完成

sum_even收到上游所有的barrier之后,才能去做checkpoint狀態保存,這就叫做Barrier對齊(分分界線對齊)

圖11

  • 分界線對齊:barrier向下游傳遞,sum任務會等待所有的輸入分區的barrier到達
  • 對于barrier已經到達的分區,繼續到達的數據會被緩存
  • 而barrier尚未到達的分區,數據會被正常處理

圖11中的sum_even中的藍4需要被緩存,因為來自上游任務的黃色barrier(ID=2)還未到達。(stream1有可能在同一個slot,stream2和stream1跨slot,可能barrier到達的時間會不一致)

圖12

  • 當收到所有分區的barrier時,任務就講其狀態保存到狀態后端的檢查點中,然后barrier繼續向下游廣播

圖12中,barrier(ID=2)繼續向下游廣播。此時藍色4會從緩存中拿出來做接下來的計算

圖13

圖13中,sum_even處理完4+8=12,以及4+6+8=18,任務開始正常的數據處理

圖14

  • sink任務向JobManager確認狀態保存到checkpoint完畢
  • 當所有的任務都確認已經成功將狀態保存到檢查點時,檢查點就真正完成了(3-4-8-8拓撲保存完成)

最終JobManager會向所有的任務確認task的狀態是否正確,確認完成后任務完成。

保存點

  • Flink還提供了自定義的鏡像保存功能,就是保存點(savepoints)
  • 原則上,創建保存點使用的算法與檢查點的完全相同,因此保存點可以認為就是具有一些額外元數據的檢查點
  • Flink不會自動創建保存點,因此用戶(或者外部調度系統)必須明確的觸發創建操作
  • 保存點是一個強大的功能。除了故障恢復外,保存點可以用于:有計劃的手動備份,更新應用程序,版本遷移,暫停和重啟應用,等等

狀態后端

Flink 提供了三種可用的狀態后端用于在不同情況下進行狀態的保存

  • MemoryStateBackend

內存級的狀態后端,將監控狀態作為內存中的對象進行管理,將他們存儲在TM的JVM堆上,而將checkpoint存儲在JM的內存中

  • FsStateBackend

將checkpoint存儲到遠程的持久化系統FileSystem中,而對于本地狀態,和MemotyStateBackend一樣,也會存儲在TM的JVM堆上

  • RocksDBStateBackend

將所有的狀態序列化后,存入本地的RocksDB中(注意:RocksDb的支持并不直接包含在Flink中,需要引入依賴),RocksDBStateBackend 是唯一支持增量快照的狀態后端。

后續補充具體的代碼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208012.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208012.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208012.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習之注意力機制

注意力機制與外部記憶 注意力機制與記憶增強網絡是相輔相成的,神經網絡去從內存中或者外部記憶中選出與當前輸入相關的內容時需要注意力機制,而在注意力機制的很多應用場景中,我們的外部信息也可以看作是一個外部的記憶 這是一個閱讀理解任務…

Nodejs安裝使用,nvm對Nodejs和npm版本控制

Nodejs 安裝 使用: npm 是Nodejs的內置 包管理工具 下載長期支持版本Node.js 中文網Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行環境。Node.js 使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。Node.js 的包管理器 npm,是全…

Flink之JDBCSink連接MySQL

輸出到MySQL 添加依賴 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-jdbc</artifactId><version>3.1.0-1.17</version> </dependency> <dependency><groupId>com.mysql</gr…

在pytorch中自定義dataset讀取數據

這篇是我對嗶哩嗶哩up主 霹靂吧啦Wz 的視頻的文字版學習筆記 感謝他對知識的分享 有關我們數據讀取預訓練 以及如何將它打包成一個一個batch輸入我們的網絡的 首先我們來看一下之前我們在講resnet網絡時所使用的源碼 我們去使用了官方實現的image folder去讀取我們的圖像數據 然…

xilinx的XVC協議

文章目錄 概述JTAG工作方式XVC協議 其他Debug Bridge IP 概述 JTAG工作方式 XVC協議 其他 Debug Bridge IP

Python正則表達式指南

正則表達式指南 摘要 本文是關于在 Python 中通過 re 模塊使用正則表達式的入門教程。它提供了比“標準庫參考”的相關章節更平易的介紹。 引言 正則表達式&#xff08;Regular expressions&#xff0c;也叫 REs、 regexs 或 regex patterns&#xff09;&#xff0c;本質上…

設計模式基礎——概述(1/2)

目錄 一、設計模式的定義 二、設計模式的三大類別 三、設計模式的原則 四、主要設計模式目錄 4.1 創建型模式&#xff08;Creational Patterns&#xff09; 4.2 結構型模式&#xff08;Structural Patterns&#xff09; 4.3 行為型模式&#xff08;Behavioral Patterns&…

Vue腳手架 生命周期 組件化開發

Vue腳手架 & 生命周期 & 組件化開發 一、今日目標 1.生命周期 生命周期介紹生命周期的四個階段生命周期鉤子聲明周期案例 2.綜合案例-小黑記賬清單 列表渲染添加/刪除餅圖渲染 3.工程化開發入門 工程化開發和腳手架項目運行流程組件化組件注冊 4.綜合案例-小兔…

yolov8 pose coco2yolo

import os import json from tqdm import tqdm import argparseparser argparse.ArgumentParser() # 這里根據自己的json文件位置&#xff0c;換成自己的就行 parser.add_argument(--json_path,defaultrC:\Users\k167\Desktop\dataset\person_dataset/instances_val2017_perso…

Echarts運用之柱狀圖常見問題及案例代碼

前言 ECharts 是一個開源的 JavaScript 可視化庫,用于生成各種類型的圖形和圖表。其中,柱狀圖(Bar chart)是一種常見的圖表類型,用于表示不同類別之間的數值比較。 初學者,可參考下我的另外一篇文章,從基礎到深入,解讀柱狀圖的運用。 Echarts之柱狀圖 常見問題及案例…

MQTT協議對比TCP網絡性能測試模擬弱網測試

MQTT正常外網壓測數據---時延diff/ms如下圖&#xff1a; MQTT弱網外網壓測數據 TCP正常外網壓測數據 TCP弱網外網壓測數據 結論&#xff1a; 在弱網場景下&#xff0c;MQTT和TCP的網絡性能表現會有所不同。下面是它們在弱網環境中的對比&#xff1a; 連接建立&#xff1a;M…

python文件讀寫

文章目錄 讀文件python2&python3差異示例代碼 文件路徑問題處理&#xff1a;字符編碼報錯 讀文件 python2&python3差異 普通模式&#xff08;python2、python3通用&#xff09; f open(fileName, moder)open函數在python2和python3差異點&#xff1a; python3支持…

【代碼隨想錄刷題】Day20 二叉樹06

文章目錄 1.【654】最大二叉樹1.1 題目描述1.2 解題思路1.3 java代碼實現1.4 總結 2.【617】合并二叉樹2.1 題目描述2.2 解題思路2.3 java代碼實現 3.【700】二叉搜索樹中的搜索3.1 題目描述3.2 解題思路3.3 java代碼實現 4.【98】驗證二叉搜索樹4.1 題目描述4.2 解題思路4.3 j…

盤點11月Sui生態發展,了解Sui的近期成長歷程!

11月是Web3的“回暖期”&#xff0c;行業持續展現增長趨勢。Sui緊隨行業腳步&#xff0c;開展了一系列生態活動。其中歷時一個多月的Quest 3游戲活動順利結束并公布獎勵&#xff0c;在多地區成功舉辦Move和Sui生態黑客松&交流會&#xff0c;還有針對中文社區開發者教育的星…

MQTT協議對比QUIC網絡性能測試模擬弱網測試

MQTT正常外網壓測數據---時延diff/ms如下圖&#xff1a; MQTT弱網外網壓測數據 QUIC正常外網壓測數據 QUIC弱網外網壓測數據 結論&#xff1a; 在弱網情況下&#xff0c;MQTT和QUIC&#xff08;Quick UDP Internet Connections&#xff09;這兩種協議的網絡性能表現也會有…

Axure原型圖表組件庫,數據可視化元件(Axure9大屏組件)

針對Axure制作的大屏圖表元件庫&#xff0c;幫助產品經理更高效地制作高保真圖表原型&#xff0c;是產品經理必備元件工具。現分享完整的組件庫&#xff0c;大家一起學習。 本組件庫的圖表模塊&#xff0c;已包含所有常用的圖表&#xff0c;以下為部分組件截圖示意。文末可下載…

頁面初始化后,需要滾動到某個元素的位置,但是該元素尚未渲染完成。

vue方式 <template><div class"doc"><!-- 判斷是否還在渲染期間 --><div class"fixed" v-show"loading">頁面仍在渲染中&#xff0c;請稍后</div><div class"green" v-show"!loading">…

TA-Lib學習研究筆記(九)——Pattern Recognition (2)

TA-Lib學習研究筆記&#xff08;九&#xff09;——Pattern Recognition &#xff08;2&#xff09; 形態識別的函數的應用&#xff0c;通過使用A股實際的數據&#xff0c;驗證形態識別函數&#xff0c;用K線顯示出現標志的形態走勢&#xff0c;由于入口參數基本上是open, hig…

反向傳播算法

反向傳播算法的數學解釋 反向傳播算法是深度學習中用于訓練神經網絡的核心算法。它通過計算損失函數相對于網絡權重的梯度來更新權重&#xff0c;從而最小化損失。 反向傳播的基本原理 反向傳播算法基于鏈式法則&#xff0c;它按層反向傳遞誤差&#xff0c;從輸出層開始&…

寒冬不再寒冷:氣膜體育館如何打造溫馨運動天地

取暖季即將來臨&#xff0c;隨著氣溫逐漸下降&#xff0c;人們在寒冷的冬季里如何保持運動熱情和身體的健康成為了一項挑戰。而在這個時候&#xff0c;氣膜體育館成為了運動愛好者們的理想場所&#xff0c;提供如春般溫暖舒適的運動環境。那么&#xff0c;讓我們一起揭秘氣膜體…