上篇我們大體講了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實戰的學習資源:
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
源碼才是王道