如何管理Spark內存

關於spark的內存管理。

spark 1.6之前 使用StaticMemoryManager,叫legacy模式,默認是關閉的。

spark1.6開始,使用UnifiedMemoryManager。

1.6開始的內存結構:

如何管理Spark內存

spark內存結構

由上圖知道,內存由三部分組成。

1.Reserved Memory ,系統保留的內存,是硬編碼寫死的,spark 1.6 這個值是300MB.這300MB不算在spark使用的內存裡。

2.user Memory 是spark Memory分配之後保留的。根據你自己的需要使用這塊內存區域。 在spark 1.6中這塊內存的大小計算:

(“Java Heap” – “Reserved Memory”) * (1.0 – spark.memory.fraction) ,默認大小: (“Java Heap” – 300MB) * 0.25

spark完全不關心你在這個區域做了什麼和也不管是否達到了內存限制。如果超過內存限制會報OOM.

3.Spark Memory

這個區域是 spark管理的內存。 計算公式: (“Java Heap” – “Reserved Memory”) * spark.memory.fraction, spark 1.6 默認大小: (“Java Heap” – 300MB) * 0.75。

這個區域分成兩塊。Storage Memory和Execution Memory 這兩塊內存的邊界由 spark.memory.storageFraction指定,默認0.5.

這個邊界不是靜態的,會移動。

3.1.Storage Memory

cache數據, broadcast 變量的數據,unroll序列化數據的臨時空間。

內存計算:

“Spark Memory” * spark.memory.storageFraction = (“Java Heap” – “Reserved Memory”) * spark.memory.fraction * spark.memory.storageFraction.

默認:(“Java Heap” – 300MB) * 0.75 * 0.5 = (“Java Heap” – 300MB) * 0.375

3.2.Execution Memory: 存儲任務運行期間需要的對象。

邊界移動:Storage Memory 內數據可以被強制清除,但是Execution Memory內數據不能被強制清除。

二.executor.memoryOverhead

這塊內存是分配給每個executor的堆外內存。分配大小 :executorMemory * 0.10, with minimum of 384

英文描述:

The amount of off-heap memory (in megabytes) to be allocated per executor. This is memory that accounts for things like VM overheads, interned strings, other native overheads, etc. This tends to grow with the executor size (typically 6-10%).

MemoryOverhead是JVM進程中除Java堆以外佔用的空間大小,包括方法區(永久代)、Java虛擬機棧、本地方法棧、JVM進程本身所用的內存、直接內存(Direct Memory)等。通過spark.yarn.executor.memoryOverhead設置,單位MB。


分享到:


相關文章: