學習Flink時遇到關於事物處理的幾個問題

2021-10-07 06:53:29 字數 2121 閱讀 5211

支援事務處理,支援兩階段提交

兩階段提交指的是一種協議,經常用來實現分布式事務,可以簡單理解為預提交+實際提交,一般分為協調器coordinator(以下簡稱c)和若干事務參與者participant(以下簡稱p)兩種角色。

c先將prepare請求寫入本地日誌,然後傳送乙個prepare的請求給p

p收到prepare請求後,開始執行事務,如果執行成功返回乙個yes或ok狀態給c,否則返回no,並將狀態存到本地日誌。

c收到p返回的狀態,如果每個p的狀態都是yes,則開始執行事務commit操作,發commit請求給每個p,p收到commit請求後各自執行commit事務操作。如果至少乙個p的狀態為no,則會執行abort操作,發abort請求給每個p,p收到abort請求後各自執行abort事務操作。

注:c或p把傳送或接收到的訊息先寫到日誌裡,主要是為了故障後恢復用,類似wal

flink在1.4.0版本引入了twophasecommitsinkfunction介面,封裝了兩階段提交邏輯,並在kafka sink connector中實現了twophasecommitsinkfunction,依賴kafka版本為0.11+,twophasecommitsinkfunction具體實現如下:

執行兩階段提交的流程圖大致如下:

假設一種場景,從

kafka source

拉取資料,經過一次視窗聚合,最後將資料傳送到

kafka sink

,如下圖:

jobmanager向source傳送barrier,開始進入pre-commit階段,當只有內部狀態時,pre-commit階段無需執行額外的操作,僅僅是寫入一些已定義的狀態變數即可。當chckpoint成功時flink負責提交這些寫入,否則就終止取消掉它們。

當source收到barrier後,將自身的狀態進行儲存,後端可以根據配置進行選擇,這裡的狀態是指消費的每個分割槽對應的offset。然後將barrier傳送給下乙個operator。

當window

這個operator

收到barrier

之後,對自己的狀態進行儲存,這裡的狀態是指聚合的結果

(sum

或count

的結果)

,然後將

barrier

傳送給sink

。sink

收到後也對自己的狀態進行儲存,之後會進行一次預提交。

預提交成功後,

jobmanager

通知每個

operator

,這一輪檢查點已經完成,這個時候,

kafka sink

會向kafka

進行真正的事務

以上便是兩階段的完整流程,提交過程中如果失敗有以下兩種情況

pre-commit失敗,將恢復到最近一次checkpoint位置

一旦pre-commit完成,必須要確保commit也要成功

因此,所有opeartor必須對checkpoint最終結果達成共識:即所有operator都必須認定資料提交要麼成功執行,要麼被終止然後回滾。

flink讀取有界流時開時間窗遇到的問題

有界流 不知道有沒有這個概念,我這裡用它表示以流處理的方式讀取的批資料,比如streamexecutionenvironment.fromcollection 其實這種做法或需求是比較奇怪的,要用流處理,但讀的卻是批資料,最好用流處理api處理流資料,用批處理api處理批資料。我這裡之所以有這樣 的...

關於使用pip時,遇到的問題

問題描述 當我使用pip install 需要的安裝包時,其會報如下錯誤 insecureplatformwarning could not fetch url there was a problem confirming the ssl certificate httpsconnectionpoo...

關於學習c程式設計中呼叫函式時遇到的些許問題

c程式語言對於乙個初學者來說是陌生的,所以學起來總會覺得不容易。在學習過程中,總會遇到這些那些的問題。現在說說我遇到的一些問題。一開始看書時看到的總是一些概念性的語言,然而這對於乙個理科生來說稍微琢磨便不成問題,而到後來開始講解程式設計時,就會有一些麻煩了。剛開始講的是簡單程式語言,如語法錯誤,語義...