任務提交時的一些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
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
調優原則,根據程序運行時每塊內存的使用情況來調整。