參考地址:https://www.cnblogs.com/airnew/p/9544683.html
問題一、什么是狀態?
問題二、Flink狀態類型有哪幾種?
問題三、狀態有什么作用?
問題四、如何使用狀態,實現什么樣的API?
問題五、什么是checkpoint與savepoint?
問題六、如何使用checkpoint與savepoint?
問題七、checkpoint原理是什么?
問題八、什么是有狀態的計算?
問題九、使用checkpoint的作用?
一、狀態
定義:
一般指一個具體的 task/operator 某一時刻在內存中的狀態(一個中間結果)
快照(snapshot)
作用:
state可以被記錄,在失敗的情況下可以恢復。
基本類型:
Operator state
Keyed state
Flink提供一套狀態保存的方法,無需在借助第三方存儲系統來解決狀態存儲問題。
二、Flink狀態類型有哪幾種?
按照數據的划分和擴張方式,Flink中大致分為2類:
(1)Operator State
1、可以用於所有算子(常用於source,例如 FlinkKafkaConsumer)
2、一個Operator 實例對應一個State (與 key 無關,唯一綁定到特定 operator)
3、並發改變時有多種重新分配方式可選
(1)均勻分配
(2)合並后每個得到全量
4、實現 CheckpintedFunction 或 ListCheckpointed 接口
5、支持的數據結構
ListState (只支持這一種數據結構)
(2)Keyed State
1、只能用在KeyedStream 上的算子中,基於 keyedStream 之上的狀態,dataStream.keyBy(),只能在作用於 keyedStream 上的 function/Operator 里使用。
keyBy 之后的 Operator State,可理解為分區過的 Operator State。
每個 並行 keyed Operator 的每個實例的每個 key有一個 keyed state, 即 <paralled-operator-instance,key> 就是一個唯一的狀態,由於每個 key 屬於一個 keyed operator的
並行實例,因此我們可以將其簡單的理解為 <operator,key>
2、每個key 對應一個State。(一個Operator 實例處理多個key,訪問相應的多個State)
3、並發改變,State隨着Key 在實例間遷移
4、通過 RuntimeContext 訪問 RichFunction
5、支持的數據結構
ValueState
ListState
ReducingState
AggregatingState
FoldingState(不推薦使用,過期了)
MapState
注意:狀態不一定存儲在內部,可能駐留在磁盤或者其他地方
狀態是使用RuntimeContext訪問的,因此只能在Rich函數中訪問。
三、狀態的表現形式
Keyed State 和 Operator State ,可以有兩種形式存在:原始狀態和托管狀態。
managed(托管狀態):
托管狀態是由Flink 框架管理的狀態,如 ValueState、ListState、MapState等。
通過框架提供的接口來更新和管理狀態的值。
不需要序列化
raw(原始狀態)
原始狀態是由用戶自行管理的具體的數據結構,Flink 在做 checkpoint的時候,使用 byte[] 來讀寫狀態內容,對其內部數據結構一無所知。
需要序列化
通常在DataStream 上的狀態推薦使用托管的狀態,當用戶自定義operator時,會使用到原始狀態。
問題八、什么是有狀態的計算?
計算任務的結果不僅僅依賴於輸入,還依賴於它的當前狀態,其實大多數的計算都是有狀態的計算。比如wordcount,給一些word,
其計算它的count,這是一個很常見的業務場景。count作為輸出,在計算的過程中要不斷的把輸入累加到count上去,
那么count就是一個state。
什么是checkpoint?
checkpoint 則表示了一個 Flink Job ,在一個特定時刻的一份全局狀態狀態快照,即包含了一個 job 下 所有
task/operator 某時刻的狀態。
問題九、使用checkpoint(檢查點)的作用?
使用Checkpoint提高程序的可靠性
用戶可以根據程序里面的配置將checkpoint打開,給定一個時間間隔后,框架會按照時間間隔給程序的狀態進行備份。
當發生故障時,Flink會將所有Task的狀態一起恢復到Checkpoint的狀態。從那個位置開始重新執行。
Flink也提供了多種正確性的保障,包括:
AT LEAST ONCE
Exactly once
備份為保存在State中的程序狀態數據
Flink也提供了一套機制,允許把這些狀態放到內存當中。做Checkpoint 的時候,由Flink去完成恢復。
從已停止作業的運行狀態中恢復
當組件升級的時候,需要停止當前作業。這個時候需要從之前停止的作業當中恢復,Flink提供了2種機制恢復作業:
Savepoint(保存點):是一種特殊的checkpoint,只不過不像checkpoint定期的從系統中去觸發的,它是用戶通過命令觸發,存儲格式和checkpoint也是不相同的,
會將數據按照一個標准的格式存儲,不管配置什么樣,Flink都會從這個checkpoint 恢復,是用來做版本升級一個非常好的工具。
External Checkpoint:對已有checkpoint的一種擴展,就是說做完一次內部的一次Checkpoint后,還會在用戶給定的一個目錄中,多
存儲一份checkpoint的數據。
