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 

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

調優原則,根據程序運行時每塊內存的使用情況來調整。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM