Flink內存模型

  之前聊Flink的slot時簡單提到過內存,Flink計算框架的內存大致分爲Flink使用的內存、Jvm使用的內存。Flink爲什麼不全使用JVM內存的原因是顯而易見的,作爲實時計算框架,JVM內存依賴GC自動回收一旦稍微慢一點,就會對系統性能造成巨大影響,而且使用JVM內存容易內存溢出,所以Flink是主動擁抱內存管理的,充分發揮機器內存的性能。

    下面我們來看看JobManager和TaskManager的內存模型,如圖1

由圖1可以看出無論是jobmanager或者taskmanager進程佔用的總內存都是Flink使用內存+Jvm使用的內存,Flink內存管理關注taskmanager的即可,jobmanager進程內存管理相對簡單,下面對taskmanager的內存進行分類展示描述。

    Flink使用的內存主要分爲JVM堆內、堆外內存,具體分類如下:

1.JVM堆上內存

   堆上內存管理序列化之後的數據,如果需要處理的數據超出了內存限制,則會將部分數據存儲到硬盤上。堆上內存在寫磁盤或網絡傳輸時至少需要一次內存複製。

(1)框架堆上內存即Flink框架本身所使用的內存,即TaskManager本身所佔用的堆上內存,不計入Slot資源中,可通過taskmanager.memory.framework.heap.size=128MB配置。

(2)Task堆上內存即執行Flink代碼使用的堆上內存,可通過taskmanager.memory.task.heap.size進行配置。

2.JVM堆外內存

    使用堆外內存,可以將大量的數據保存在堆外,極大地減小堆內存,避免GC和內存溢出的問題。堆外內存在寫磁盤或網絡傳輸時是零拷貝,堆外內存是進程間共享的,jvm崩潰也不會導致數據丟失。堆內內存的使用、監控、調試簡單,堆外內存出現問題後的診斷則較爲複雜。

(1)框架堆外內存即Flink框架本身所使用的內存,不計入Slot資源,比如taskmanager的內存可通過taskmanager.memory.framework.off-heap.size=128MB進行配置。

(2)Task堆外內存即執行Flink代碼使用的堆外內存,taskmanager內存可通過taskmanager.memory.task.off-heap.size=0進行配置。

(3)網絡緩衝內存即網絡數據交換所使用的堆外內存大小,如網絡數據交換緩衝區(Network Buffter),可通過taskmanager.memory.network.[64/1024/0.1](min/max/fraction),默認min=64MB,max=1GB,fraction=0.1進行配置。

(4)堆外託管內存即Flink管理的堆外內存,可通過taskmanager.memory.managed.[size|fraction],默認值fraction=0.4進行配置。

    Jvm使用的內存具體分類如下:

(1)JVM元空間即JVM元空間所使用的內存,可通過參數taskmanager.memory.jvm-metaspace=96m進行配置。
(2)JVM執行開銷即JVM在執行時自身所需要的內容,包括線程堆棧、IO、編譯緩存等所使用的內存。可通過taskmanager.memory.jvm-overhead=[min/max/fraction],默認min=192MB,max=1GB,fraction=01進行配置。

  

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章