Flink內存優化


  在大數據領域,大多數開源框架(Hadoop、Spark、Storm)都是基於JVM運行,但是JVM的內存管理機制往往存在着諸多類似OutOfMemoryError的問題,主要是因為創建過多的對象實例而超過JVM的最大堆內存限制,卻沒有被有效回收掉,這就在很大程度上影響了系統的穩定性,尤其對於大數據應用,面對大量的數據對象產生,僅僅靠JVM所提供的的各種垃圾回收機制很難解決內存溢出的問題。在開源框架中有很多框架都實現了自己的內存管理,例如Apache Spark的Tungsten項目,在一定程度上減輕了框架對JVM垃圾回收機制的依賴,從而更好地使用JVM來處理大規模數據集。

  Flink也基於JVM實現了自己的內存管理,將JVM格局內存區分為Unmanned Heap、FLink Managed Heap、Network Buffers三個區域。在Flink內部對Flink Managed Heap進行管理,在啟動集群的過程中直接將堆內存初始化成Memory Pages Pool,也就是將內存全部以二進制數組的方式占用,形成虛擬內存使用空間。新創建的對象都是以序列化成二進制數據的方式存儲在內存頁面池中,當完成計算后數據對象Flink就會將Page置空,而不是通過JVM進行垃圾回收,保證數據對象的創建永遠不會超過JVM堆內存大小,也有效地避免了因為頻繁GC導致的系統穩定性問題。

JobManager配置

JobManager在Flink系統中主要承擔管理集群資源、接受任務、調度Task、收集任務狀態以及管理TaskManager的功能,JobManager本身並不直接參與數據的計算過程中,因此JobManager的內存配置項不是特別多,只要指定JobManager堆內存大小即可。

jobmanager.heap.size: 設定JobManager的堆內存大小,默認為1024MB。

TaskManager配置

TaskManager作為Flink集群中的工作節點,左右任務的計算邏輯均執行在TaskManager之上,因此對內存配置顯得尤為重要,可以通過以下參數配置對TaskManager進行優化和調整。

對應的官方文檔:https://ci.apache.org/projects/flink/flink-docs-master/ops/config.html

  • taskmanager.heap.size:設定TaskManager堆內存大小,默認值為1024M,如果在Yarn的集群中,TaskManager取決於Yarn分配給TaskManager Container的內存大小,且Yarn環境下一般會減掉一部分內存用於Container的容錯
  • taskmanager.jvm-exit-on-oom:設定TaskManager是否會因為JVM發生內存溢出而停止,默認為false,當TaskManager發生內存溢出時,也不會導致TaskManager停止。
  • taskmanage。memory.size:設定TaskManager內存大小,默認為0,如果不設定該值將會使用taskManager.memory.fraction作為內存分配依據。
  • taskmanager.memory.fraction:設定TaskManager堆中除Network Buffers內存后的內存分配比例。該內存主要用於TaskManager任務排序。緩存中間結果等操作。例如,如果設定為0.8,則代表TaskManager保留80%內存用於中間結果數據的緩存,剩下20%的內存用於創建用戶定義函數中的數據對象存儲。注意,該參數只有在taskmanager.manager.size不設定的情況下才生效。
  • taskmanager.memory.off-heap:設置是否開啟堆外內存供Managed Memory或者Network Buffer是使用。
  • taskmanager.memory.preallocate:設置是否在啟動TaskManager過程中直接分配TaskManager管理內存。
  • taskmanager.numberOfTaskSlots:每個TaskManager分配的slot的數量。

Flink的網絡緩存優化

  Flink將JVM堆內存切分為三個部分,其中一部門為Network Buffers內存。Network Buffers內存是Flink數據交互層的關鍵內存資源,主要目的是緩存分布式數據處理過程中的輸入數據。通常情況下,比較大的Network Buffers意味着更高的拓土量。如果系統出現"Insufficient number of network buffers"的錯誤,一般是因為Network Buffers配置過低導致,因此,在這種情況下,需要適當調整TaskManager上Network Buffers的內存大小,以使得系統能夠達到相對較高的吞吐量。

  目前Flink能夠調整Network Buffer內存大小的方式有兩種:一種是通過直接指定Network Buffers內存數量的方式,另外一種是通過配置內存比例的方式。

  •  設定Network Buffer內存數量(過時了)

  taskmanager.network.numberOfBuffers: 指定 Network 堆棧 Buffer 內存塊的數量。
  taskmanager.memory.segment-size.: 內存管理器和 Network 棧使用的內存 Buffer 大小, 默認為 32KB

  • 設定Network內存比例(推薦)

  taskmanager.network.memory.fraction: JVM 中用於 Network Buffers 的內存比例。

  taskmanager.network.memory.min: 最小的 Network Buffers 內存大小, 默認為 64MB。

  taskmanager.network.memory.max: 最大的 Network Buffers 內存大小, 默認 1GB。

  taskmanager.memory.segment-size: 內存管理器和 Network 棧使用的 Buffer 大小,默認為 32KB。


免責聲明!

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



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