天天看點

Flink的容錯機制第三篇 狀态管理及容錯

上篇我們大體講了Flink容錯機制的處理方法,和産生checkpoint的機制;這次主要講一些補充

一,Flink的checkpoint形式

checkpoint有兩種特殊形式:

Savepoint:是一種特殊的checkpoint,隻不過不像checkpoint定期的從系統中去觸發的,它是使用者通過指令觸發,

存儲格式和checkpoint也是不相同的,會将資料按照一個标準的格式存儲,不管配置什麼樣,Flink都會從這個checkpoint恢複,是用來做版本更新一個非常好的工具;

 External Checkpoint:對已有checkpoint的一種擴充,就是說做完一次内部的一次Checkpoint後,還會在使用者給定的一個目錄中,多存儲一份checkpoint的資料;

二,Flink的狀态劃分

Flink中包含兩種基礎的狀态:Keyed State和Operator State。(Blink現在支援MapState)

Keyed State

顧名思義,就是基于KeyedStream上的狀态。這個狀态是跟特定的key綁定的,對KeyedStream流上的每一個key,可能都對應一個state。是以keyedState支援多種資料結構并支援動态拓展

Operator State

與Keyed State不同,Operator State跟一個特定operator的一個并發執行個體綁定,整個operator隻對應一個state。相比較而言,在一個operator上,可能會有很多個key,進而對應多個keyed state。Operator State可以在任意流中使用但支援有限的資料結構(list)

三,Flink狀态持久化方式

Flink有三種狀态持久化的方式

使用者可以根據自己的需求選擇,如果資料量較小,可以存放到MemoryStateBackend和FsStateBackend中,如果資料量較大,可以放到RockDB中。RockDB和FsStateBackend都支援将資料寫在檔案中,而檔案路徑傳給master。

MemoryStateBackend:state資料存儲在記憶體中,并被儲存在一個由多層java map嵌套而成的資料結構中,預設情況下,資料大小不可以超過5MB

FsStateBackend:政策是當狀态的大小小于1MB(可配置,最大1MB)時,會把狀态資料直接存儲在meta data file中,避免出現很小的狀态檔案。

FsStateBackend另外一個成員變量就是basePath,即checkpoint的路徑。它會記錄狀态的檔案路徑,然後傳給master節點,一般用于記錄容量比較大的狀态。

它會在本地檔案系統中維護狀态,KeyedStateBackend等會直接寫入本地rocksdb中。同時它需要配置一個遠端的filesystem uri(一般是HDFS),在做checkpoint的時候,會把本地的資料直接複制到filesystem中。fail over的時候從filesystem中恢複到本地。

RocksDB:每個state存儲在單獨一個columnfamily中,存儲狀态的檔案路徑,隻用于增量checkpoint。

更新的時候會直接以key + namespace作為key,然後把具體的值更新到rocksdb中。

做checkpoint的時候,會首先在本地對rockdb做checkpoint(rocksdb自帶的checkpoint功能),這一步是同步的。然後将checkpoint異步複制到遠端檔案系統中。最後傳回RocksDBStateHandle。

RocksDB克服了HeapKeyedStateBackend受記憶體限制的缺點,同時又能夠持久化到遠端檔案系統中,比較适合在生産中使用。

Flink的容錯機制第三篇 狀态管理及容錯

本文章隻用于了解,最後補充一下Flink實戰的學習資源:

1. 官網 https://ci.apache.org/projects/flink/flink-docs-stable/

所有技術棧和接口都在官網文檔中有介紹

2. 資料倉庫 https://www.ververica.com/flink-forward-san-francisco-2018

各種有關于Flink前沿論壇的資料和視訊

3.阿裡雲flink系列 https://yq.aliyun.com/articles/225623#

實戰内容多一些,連結隻是一個例子,教你如何在實戰中配置使用

4. 過往記憶 https://www.iteblog.com/archives/category/flink/

很多大資料技術的中文文檔

5. Flink論壇 https://cwiki.apache.org/confluence/display/FLINK/Apache+Flink+Home

可以看到很多課題和問題,以及解決方法

6. github https://github.com/apache/flink

源碼才是王道

繼續閱讀