當我們使用flink進行流式計算時,通常會產生各種形式的中間結果,我們稱之為state。有狀態產生,就必然涉及到狀態的儲存,那麼flink中定義了哪些形式的狀態儲存呢,下面一一給大家介紹一下。顧名思義,memorystatebackend狀態後端是將狀態資料以object的形式存放於j**a heap中。
當執行檢查點時,memorystatebackend會為當前的狀態生成snapshot,然後將快照資訊作為檢查點ack訊息的一部分傳送給jobmanager(master節點),jobmanager會將收到的快照資料存放於自己的堆記憶體中。
memorystatebackend預設採用非同步snapshots的方式來避免資料流管道阻塞,這是一種比較推薦的方式。當然,我們也可以通過配置來禁用這種方式。
new memorystatebackend(max_mem_state_size, false); // max_mem_state_size表示最大允許的狀態容量
memorystatebackend的使用限制
基於以上這些限制,我們通常建議在如下場景中使用memorystatebackend:
此外,官方建議將託管記憶體(managed memory
)設定為0,這樣可以確保為jvm上的使用者程式分配最大的記憶體。
fsstatebackend需要配置乙個檔案系統url,如:「hdfs://namenode:40010/flink/checkpoints」 or 「file:///data/flink/checkpoints」。
fsstatebackend將作業執行過程中的動態資料存放在taskmanager的記憶體當中,當執行檢查點時,狀態快照資料會被儲存在配置的檔案系統目錄中,還有一部分metadata資料會被儲存在jobmanager的記憶體當中。
同樣的,fsstatebackend也是預設採用非同步snapshot的方式。我們可以通過例項化fsstatebackend來更改快照生成方式。
new fsstatebackend(path, false);
官方建議在以下場景中使用fsstatebackend:
同樣官方建議將託管記憶體(managed memory
)設定為0,這樣可以確保為jvm上的使用者程式分配最大的記憶體。
rocksdbstatebackend同樣需要配置乙個檔案系統url:「hdfs://namenode:40010/flink/checkpoints」 or 「file:///data/flink/checkpoints」。
rocksdbstatebackend將作業執行過程中的動態資料存放在rocksdb資料庫中,rocksdb資料庫預設儲存在taskmanager的資料目錄下。當執行檢查點時,整個rocksdb資料庫會被存檔到配置的檔案系統目錄下。只有少量的metadata資料儲存在jobmanager的記憶體當中。
同樣地,rocksdbstatebackend通常也採用非同步snapshot的方式。
使用上的一些限制:
官方建議在以下場景中使用rocksdbstatebackend:
乍一看,好像跟fsstatebackend沒啥區別?其實不是,這裡需要注意的是,當我們使用rocksdbstatebackend作為狀態儲存時,可以維護的狀態大小僅僅受限於程式可訪問的磁碟空間大小。這就使得我們可以維護比fsstatebackend更大的作業狀態。
當然,這也帶來乙個問題:由於與狀態後端之間的所有讀寫操作都要經過de-/serialization,因此這種方式犧牲了一定的吞吐量。
一文了解Perl語言
perl,一種功能豐富的計算機程式語言,執行在超過100種計算機平台上,適用廣泛,從大型機到便攜裝置,從快速原型建立到大規模可擴充套件開發。1 perl最初的設計者為拉里 沃爾 larry wall 於1987年12月18日發表。現在的版本為perl 6,於2015年12月25日更新。perl借取了...
一文了解Perl語言
perl,一種功能豐富的計算機程式語言,執行在超過100種計算機平台上,適用廣泛,從大型機到便攜裝置,從快速原型建立到大規模可擴充套件開發。1 perl最初的設計者為拉里 沃爾 larry wall 於1987年12月18日發表。現在的版本為perl 6,於2015年12月25日更新。perl借取了...
一文了解M Tree(M樹)
這篇部落格分析了 indexing metric spaces with m tree 後文簡稱m tree或m樹 我將從以下幾個方面介紹它 背景m tree的結構 m tree的插入 m tree的 如何使用m tree進行range搜尋 m tree的 m tree被設計為了解決最近鄰搜尋問題 ...