您好,登錄后才能下訂單哦!
本篇內容主要講解“Flink1.10狀態管理是怎樣的”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Flink1.10狀態管理是怎樣的”吧!
一、概述
我們先來看Flink官方文檔的第一句話:
Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale.
有道翻譯如下:
Apache Flink是一個框架和分布式處理引擎,用于無界和有界數據流上的有狀態計算。Flink被設計成可以在所有常見的集群環境中運行,以內存中的速度和任何規模執行計算。
這里要明確一點,Flink的流式處理可以是有狀態的可以是無狀態的,比如有些一些任務我只基于某個獨立的數據進行計算,最簡單的比如說從source端接收數據直接打印到控制臺了,然后后面輸出到sink,這種不依賴其他數據,這種根本就不涉及到狀態,直接就是來一條數據處理一條數據,這個應該比較好理解。
之前我們說過大多數的流應用都是有狀態的,Flink執行計算任務的過程中,從source端到sink端中間會有很多的operator,中間會存在多個臨時狀態,如果任務的某個task掛掉,那它在內存中的狀態都會丟失,如果我們中間沒有存儲中間狀態的話,需要從頭開始計算,如果我們存儲了中間狀態,就可以恢復到中間狀態,從該狀態繼續計算,而不是從頭開始計算 ;Flink就設計了一種機制來保存任務執行的中間狀態,就是狀態管理機制。
例如,經典的wordcount程序,task不斷的從source端接收數據,處理數據之前,task先去訪問state,獲取該單詞當前的count數,加1后再更新state,并將新的計算結果輸出。下面這個圖就展示了flink的task如何和state進行交互。
哪些場景需要狀態計算呢?下面是我整理了一些典型場景:
a.數據增量統計;
b.聚合操作;
c.機器學習訓練模型迭代運算時保存當前模型;
d.Job故障重啟,需要從之前的狀態恢復;
e.數據記錄去重;
f.歷史數據的比對。
二、狀態分類
在講解Flink的狀態分類之前我們需要先區分幾個概念:
1).State 狀態
State一般指一個具體的task/operator的狀態,Flink為了保證計算過程中出現異常進行數據恢復,就將中間結果存儲起來,這個中間結果就是State,默認情況下,State保存在Jobmanager的內存中,也可以保存在TaskManager本地磁盤或HDFS分布式文件系統。
2).State Backend 狀態后端
State是如何準確的存儲、訪問、以及維護是由一個可插拔的組件決定的,這個組件稱為狀態后端(State backend),一個state backend負責兩件事:本地state管理,以及為state做檢查點并存儲到外部地址。
3).Checkpoint 檢查點
Checkpoint是指在某個特定的時刻下,對整個job一個全局的快照,當我們遇到故障或者重啟的時候可以從備份中進行恢復。
按照數據的劃分和擴張方式,在Flink中有兩種類型的state:operator state和keyed state:
1.operator state 算子狀態 作用范圍限定為算子任務,一個任務一個狀態
算子狀態的作用范圍限定為算子任務,由同一并行子任務所處理的所有數據都可以訪問到相同的狀態;
算子狀態對于同一個任務而言是共享的(每一個并行的子任務共享一個狀態);
算子狀態不能由相同或不同算子的另一個任務訪問(相同算子的不同任務之間也不能訪問);
operator state提供了三種原型:
List state
以list的方式表示state
Union list state
同樣以list的方式表示state。但是它與常規list state的不同點在于:發生故障時恢復的方式、或一個application從檢查點開始的方式。
Broadcast state
被用于特殊場景,當一個operator的每個task的state都是相同時。這個屬性可以被用于檢查點,或是rescaling 一個 operator時。
2.keyed state
鍵控狀態是基于KeyStream之上的狀態,keyBy之后的Operator State。
鍵控狀態是根據輸入數據流中定義的鍵(key)來維度和訪問狀態的;
Flink為每個key維護一個狀態實例,并將具有相同鍵的所有數據,都分區到同一個算子任務中,這個任務會維護和處理這個key對應的狀態;
當任務處理一條數據時,它會自動將狀態的訪問范圍限定為當前數據的key;
keyed state提供了三種原型:
Value state
為每個key存一個單值(可以是任意類型)。復雜的數據結構也可以作為value state 存儲;
List state
為每個key存一個列表值。這個列表可以是任意類型;
Map state
為每個key存一個key-value 映射。映射中的key和value可以是任意類型。
三、狀態存在形式
Keyed State和Operator State,可以以兩種形式存在:原始狀態和托管狀態。
托管方式就是狀態管理由flink提供的框架進行管理,通過flink狀態管理框架提供的接口,來更新和管理狀態的值。這里面包括用于存儲狀態數據的數據結構,現成的包裝類等。
原始方式就是由用戶自行管理狀態具體的數據結構,框架在做checkpoint的時候(checkpoint是flink進行狀態數據持久化存儲的機制),使用byte[]來讀寫狀態內容,對其內部數據結構一無所知。
通常在DataStream上的狀態推薦使用托管的狀態,當實現一個用戶自定義的operator時,會使用到原始狀態。一般來說,托管狀態用的比較多。
到此,相信大家對“Flink1.10狀態管理是怎樣的”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。