任務提交時的一些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
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
調優原則,根據程式執行時每塊記憶體的使用情況來調整。