flink記憶體模型詳解與案例

肥仔佳文豬發表於2022-03-31

任務提交時的一些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 

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

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

 

相關文章