天天看點

|NO.Z.00104|——————————|BigDataEnd|——|Hadoop&Spark.V02|

一、靜态記憶體管理

### --- 靜态記憶體管理
### --- 靜态記憶體架構

~~~     Spark 2.0 以前版本采用靜态記憶體管理機制。存儲記憶體、
~~~     執行記憶體和其他記憶體的大小在 Spark 應用程式運作期間均為固定的,
~~~     但使用者可以應用程式啟動前進行配置,堆内記憶體的配置設定如下圖所示:      
|NO.Z.00104|——————————|BigDataEnd|——|Hadoop&Spark.V02|
### --- 靜态記憶體管理

~~~     可用的存儲記憶體 = systemMaxMemory * spark.storage.memoryFraction * spark.storage.safetyFraction
~~~     可用的執行記憶體 = systemMaxMemory * spark.shuffle.memoryFraction *
~~~     spark.shuffle.safetyFractionsystemMaxMemory 為目前 JVM 堆内記憶體的大小
~~~     這個預留的保險區域僅僅是一種邏輯上的規劃,
~~~     在具體使用時 Spark 并沒有差別對待,和”其它記憶體”一樣交給了 JVM去管理。
~~~     堆外記憶體配置設定較為簡單,隻有存儲記憶體和執行記憶體。
~~~     可用的執行記憶體和存儲記憶體占用的空間大小直接由參數spark.memory.storageFraction 決定。
~~~     由于堆外記憶體占用的空間可以被精确計算,無需再設定保險區域。      
### --- 靜态記憶體管理

~~~     靜态記憶體管理機制實作起來較為簡單,但如果使用者不熟悉 Spark 的存儲機制,
~~~     或沒有根據具體的資料規模和計算任務或做相應的配置,
~~~     很容易造成”一半海水,一半火焰”的局面,即存儲記憶體和執行記憶體中的一方剩餘大量的空間,
~~~     而另一方卻早早被占滿,不得不淘汰或移出舊的内容以存儲新的内容。
~~~     由于新的記憶體管理機制的出現,這種方式目前已經很少有開發者使用,
~~~     出于相容舊版本的應用程式的目的,Spark 仍然保留了它的實作。      
|NO.Z.00104|——————————|BigDataEnd|——|Hadoop&Spark.V02|

二、統一記憶體管理

### --- 統一記憶體管理
### --- 統一記憶體管理的堆外記憶體結構如下圖所示:

~~~     Spark 2.0 之後引入統一記憶體管理機制,
~~~     與靜态記憶體管理的差別在于存儲記憶體和執行記憶體共享同一塊空間,
~~~     可以動态占用對方的空閑區域,統一記憶體管理的堆内記憶體結構如下圖所示:      
|NO.Z.00104|——————————|BigDataEnd|——|Hadoop&Spark.V02|
|NO.Z.00104|——————————|BigDataEnd|——|Hadoop&Spark.V02|
### --- 其中最重要的優化在于動态占用機制,其規則如下:
### --- 統一記憶體管理執行過程

~~~     設定基本的存儲記憶體和執行記憶體區域(spark.storage.storageFraction 參數),
~~~     該設定确定了雙方各自擁有的空間的範圍
~~~     雙方的空間都不足時,則存儲到硬碟;若己方空間不足而對方空餘時,
~~~     可借用對方的空間;(存儲空間不足指不足以放下一個完整的 Block)
~~~     執行記憶體的空間被對方占用後,可讓對方将占用的部分轉存到硬碟,然後”歸還”借用的空間
~~~     存儲記憶體的空間被對方占用後,無法讓對方”歸還”,
~~~     因為需要考慮 Shuffle 過程中的很多因素,實作起來較為複雜      
|NO.Z.00104|——————————|BigDataEnd|——|Hadoop&Spark.V02|
### --- 統一記憶體管理執行過程

~~~     在執行過程中:執行記憶體的優先級 > 存儲記憶體的優先級(了解)
~~~     憑借統一記憶體管理機制,Spark 在一定程度上提高了堆内和堆外記憶體資源的使用率,
~~~     降低了開發者維護 Spark 記憶體的難度,但并不意味着開發者可以高枕無憂。
~~~     如果存儲記憶體的空間太大或者說緩存的資料過多,反而會導緻頻繁的全量垃圾回收,
~~~     降低任務執行時的性能,因為緩存的 RDD 資料通常都是長期駐留記憶體的。
~~~     是以要想充分發揮 Spark 的性能,
~~~     需要開發者進一步了解存儲記憶體和執行記憶體各自的管理方式和實作原理。      

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart

繼續閱讀