flink記憶體模型詳解與案例

任務提交時的一些yarn設置(通用客戶端模式)

指定並行度                        -p 5 \ 

指定yarn隊列                     -Dyarn.application.queue=xxx \

指定JM總進程的大小        -Djobmanager.memory.process.size=1024mb \

指定每個TM的總進程大小,一般是 2-8g,yarn默認最大給8g    -Dtaskmanager.memory.process.size=1024mb \   

指定每個TM的slot數         -Dtaskmanager.numberOfTaskSlots=2 \

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

flink 記憶體模型如下圖:

 

 1.flink框架記憶體使用了堆上記憶體和堆外記憶體,不計入slot資源

2、task執行的記憶體使用了堆上記憶體和堆外記憶體

3、網路緩衝記憶體:網路數據交換所使用的堆外記憶體大小,如網路數據交換緩衝區

4、框架堆外記憶體、task堆外記憶體、網路緩衝記憶體,都在堆外的直接記憶體里。

5、管理記憶體:flink管理的堆外記憶體。用於管理排序、哈希表、快取中間結果及RocksDB State Backend 的本地記憶體

6、jvm特有記憶體:jvm本身佔用的記憶體,包括元空間和執行開銷

7、flink使用記憶體=框架堆內和堆外內+Task堆內和堆外記憶體+網路緩衝記憶體+管理記憶體

8、進程記憶體=Flink記憶體+jvm特有記憶體

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

記憶體模型詳解:

jvm特定記憶體:jvm本身使用的記憶體,包含jvm的metaspace和over-head

①JVM metaspace:jvm元空間

taskmanager.memory.jvm-metaspace.size 默認256mb

②JVM over-head執行開銷:JVM執行時自身所需要的內容,包括執行緒堆棧、IO、編譯快取等所使用的記憶體。

taskmanager.memory.jvm-overhead.fraction, 默認0.1

taskmanager.memory.jvm-overhead.min,      默認192mb

taskmanager.memory.jvm-overhead.max,     默認1gb

總進程記憶體*fraction,如果小於配置的min或大於配置的max,則使用min/max

框架記憶體:flink框架,即TaskManager本身所佔用的記憶體,不計入slot的資源中。

堆內:taskmanager.memory.framework.heap.size, 默認128mb

堆外:taskmanager.memory.framework.off-heap.size,默認128mb

Task記憶體:Task執行用戶程式碼時所使用的記憶體

堆內:taskmanager.memory.task.heap.size,默認none,由flinl記憶體口扣除掉其他部分的記憶體得到、

堆外:taskmanager.memory.task.off-size,默認0,表示不使用堆外記憶體

網路記憶體:網路數據交換所使用的堆外記憶體大小,如網路數據交換緩衝區 

堆外:taskmanager.memory.network.fraction,默認0.1

   taskmanager.memory.network,min,默認64mb

   taskmanager.memory.network.max,默認1gb

flink記憶體*fraction,如果小於配置的min或大於配置的max,則使用min/max

管理記憶體:用於RocksDB State Backend 的本地記憶體和批的排序、哈希表、快取中間結果。

堆外:taskmanager.memory.managed.fraction,默認0.4

   taskmanager.memory.managed.size,默認none

如果size沒指定,則等於flink記憶體*fraction

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 實際案例

基於yarn模式,一般參數指定的是總進程記憶體,taskmanager.memory.process.size,

如果該大小為4G,每一塊記憶體得到大小如下:

①計算flink記憶體

jvm元空間256m

jvm執行開銷:4g*0.1=409.6,在[192.1g]之間,最終結果409.6m

flink記憶體=4g-256m-409.6m=3430.4m

②網路記憶體=3430.4*0.1=343.04,在[64m,1g]之間,最終結果343.04m

③託管記憶體=3430.4m*0.4=1372.16m

④框架記憶體,堆內和堆外都是128m

⑤Task堆內記憶體=3430.4m-128m-128m-343.04m-1372.16m=1459.2m    堆內記憶體是總記憶體減去所有其他的記憶體。在總大小不變的情況小想調大堆內記憶體,就把其他記憶體調小。

 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

提交程式,查看flink ui結果。和計算的幾乎一致

 

 

 

 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 JVM參數與記憶體

jvm Options:

-Xmx1664299798     

-Xms1664299798     jvm堆內記憶體大小(最大與最小)  約1587m=Task堆內+框架堆內

 

 -XX:MaxDirectMemorySize=493921243 jvm堆外記憶體大小    約471m=Task堆外+框架堆外+網路記憶體

 

-XX:MaxMetaspaceSize=268435456   jvm元空間大小,約256m 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

調優原則,根據程式運行時每塊記憶體的使用情況來調整。