溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Flink1.10狀態(tài)管理是怎樣的

發(fā)布時間:2021-12-31 10:45:48 來源:億速云 閱讀:140 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Flink1.10狀態(tài)管理是怎樣的”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Flink1.10狀態(tài)管理是怎樣的”吧!

一、概述

    我們先來看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是一個框架和分布式處理引擎,用于無界和有界數(shù)據(jù)流上的有狀態(tài)計算。Flink被設計成可以在所有常見的集群環(huán)境中運行,以內(nèi)存中的速度和任何規(guī)模執(zhí)行計算。

    

    這里要明確一點,Flink的流式處理可以是有狀態(tài)的可以是無狀態(tài)的,比如有些一些任務我只基于某個獨立的數(shù)據(jù)進行計算,最簡單的比如說從source端接收數(shù)據(jù)直接打印到控制臺了,然后后面輸出到sink,這種不依賴其他數(shù)據(jù),這種根本就不涉及到狀態(tài),直接就是來一條數(shù)據(jù)處理一條數(shù)據(jù),這個應該比較好理解。

    之前我們說過大多數(shù)的流應用都是有狀態(tài)的,F(xiàn)link執(zhí)行計算任務的過程中,從source端到sink端中間會有很多的operator,中間會存在多個臨時狀態(tài),如果任務的某個task掛掉,那它在內(nèi)存中的狀態(tài)都會丟失,如果我們中間沒有存儲中間狀態(tài)的話,需要從頭開始計算,如果我們存儲了中間狀態(tài),就可以恢復到中間狀態(tài),從該狀態(tài)繼續(xù)計算,而不是從頭開始計算 ;Flink就設計了一種機制來保存任務執(zhí)行的中間狀態(tài),就是狀態(tài)管理機制。

    例如,經(jīng)典的wordcount程序,task不斷的從source端接收數(shù)據(jù),處理數(shù)據(jù)之前,task先去訪問state,獲取該單詞當前的count數(shù),加1后再更新state,并將新的計算結(jié)果輸出。下面這個圖就展示了flink的task如何和state進行交互。

哪些場景需要狀態(tài)計算呢?下面是我整理了一些典型場景:

    a.數(shù)據(jù)增量統(tǒng)計;
    b.聚合操作;
    c.機器學習訓練模型迭代運算時保存當前模型;

    d.Job故障重啟,需要從之前的狀態(tài)恢復;

    e.數(shù)據(jù)記錄去重;

    f.歷史數(shù)據(jù)的比對。

二、狀態(tài)分類

   

    在講解Flink的狀態(tài)分類之前我們需要先區(qū)分幾個概念:

    1).State 狀態(tài)

        State一般指一個具體的task/operator的狀態(tài),F(xiàn)link為了保證計算過程中出現(xiàn)異常進行數(shù)據(jù)恢復,就將中間結(jié)果存儲起來,這個中間結(jié)果就是State,默認情況下,State保存在Jobmanager的內(nèi)存中,也可以保存在TaskManager本地磁盤或HDFS分布式文件系統(tǒng)。

      

    2).State Backend 狀態(tài)后端

    State是如何準確的存儲、訪問、以及維護是由一個可插拔的組件決定的,這個組件稱為狀態(tài)后端(State backend),一個state backend負責兩件事:本地state管理,以及為state做檢查點并存儲到外部地址。

    3).Checkpoint 檢查點

    Checkpoint是指在某個特定的時刻下,對整個job一個全局的快照,當我們遇到故障或者重啟的時候可以從備份中進行恢復。

    按照數(shù)據(jù)的劃分和擴張方式,在Flink中有兩種類型的state:operator state和keyed state:

1.operator state 算子狀態(tài) 作用范圍限定為算子任務,一個任務一個狀態(tài)

Flink1.10狀態(tài)管理是怎樣的

    

    算子狀態(tài)的作用范圍限定為算子任務,由同一并行子任務所處理的所有數(shù)據(jù)都可以訪問到相同的狀態(tài);

     算子狀態(tài)對于同一個任務而言是共享的(每一個并行的子任務共享一個狀態(tài));

    算子狀態(tài)不能由相同或不同算子的另一個任務訪問(相同算子的不同任務之間也不能訪問);

operator state提供了三種原型:

List state  

    以list的方式表示state

Union list state

    同樣以list的方式表示state。但是它與常規(guī)list state的不同點在于:發(fā)生故障時恢復的方式、或一個application從檢查點開始的方式。

Broadcast state

    被用于特殊場景,當一個operator的每個task的state都是相同時。這個屬性可以被用于檢查點,或是rescaling 一個 operator時。

2.keyed state 

Flink1.10狀態(tài)管理是怎樣的

    鍵控狀態(tài)是基于KeyStream之上的狀態(tài),keyBy之后的Operator State。

    鍵控狀態(tài)是根據(jù)輸入數(shù)據(jù)流中定義的鍵(key)來維度和訪問狀態(tài)的;

    Flink為每個key維護一個狀態(tài)實例,并將具有相同鍵的所有數(shù)據(jù),都分區(qū)到同一個算子任務中,這個任務會維護和處理這個key對應的狀態(tài);

    當任務處理一條數(shù)據(jù)時,它會自動將狀態(tài)的訪問范圍限定為當前數(shù)據(jù)的key;

keyed state提供了三種原型:

Value state

    為每個key存一個單值(可以是任意類型)。復雜的數(shù)據(jù)結(jié)構也可以作為value state 存儲;

List state

    為每個key存一個列表值。這個列表可以是任意類型;

Map state

    為每個key存一個key-value 映射。映射中的key和value可以是任意類型。

三、狀態(tài)存在形式

    Keyed State和Operator State,可以以兩種形式存在:原始狀態(tài)和托管狀態(tài)。

    托管方式就是狀態(tài)管理由flink提供的框架進行管理,通過flink狀態(tài)管理框架提供的接口,來更新和管理狀態(tài)的值。這里面包括用于存儲狀態(tài)數(shù)據(jù)的數(shù)據(jù)結(jié)構,現(xiàn)成的包裝類等。

    原始方式就是由用戶自行管理狀態(tài)具體的數(shù)據(jù)結(jié)構,框架在做checkpoint的時候(checkpoint是flink進行狀態(tài)數(shù)據(jù)持久化存儲的機制),使用byte[]來讀寫狀態(tài)內(nèi)容,對其內(nèi)部數(shù)據(jù)結(jié)構一無所知。

    通常在DataStream上的狀態(tài)推薦使用托管的狀態(tài),當實現(xiàn)一個用戶自定義的operator時,會使用到原始狀態(tài)。一般來說,托管狀態(tài)用的比較多。

到此,相信大家對“Flink1.10狀態(tài)管理是怎樣的”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI