參考:北風網 Spark 2.0從入門到精通
垃圾回收器(Garbage Collect GC):尋找內存中哪些對象已不再使用,然後就清理掉這些對象,騰出空間用於創建其它新對象。
GC的影響:
1.GC對性能的影響在於,如果內存中數據量比較大時,會頻繁造成內存空間不足,此時gc頻繁發生,而gc發生是有性能消耗的。
2.如果要回收的數據量特別大,gc的過程也會比較慢
3.gc過程中會讓task工作線程停止,讓gc線程獨立運行,這就直接導致了task執行的停止,從而降低了spark的性能。
所以,頻繁發生gc會使spark性能大幅下降,可通過worker日誌文件或4040UI界面進行GC的監控。
----------------------------------------
Executor的內存主要用於兩個方面:
1.用於緩存RDD (cache操作);
2.分配給task,在task執行過程中創建對象。
默認情況下,Executor的內存有60%劃分給了RDD緩存,40%分配給task,存放運行期間創建的對象。這種默認情況可能會導致task用於運行期間創建對象的內存偏小了。當創建的對象把40%的內存空間用完,就會產生垃圾回收(GC),把不再被使用的對象清除出內存。所以說,如果給task分配的內存過低,會導致GC頻繁發生,從而導致task工作線程頻繁停止,降低了spark計算效率。
優化方法:SparkConf().set("spark.storage.memoryFraction","比例"),此處的比例爲RDD緩存的內存分配比例,rdd的持久化也可通過序列化來降低內存的佔用。
--------------------------------------------------
分配給task的內存細化
分配給task的內存空間被劃分成了兩塊:
1.老年代(存放長時間存活的對象)
2.新生代(存放短時間存活的對象)
新生代接着被劃分爲三塊區域:
1.Eden
2.Survivor1
3.Survivor2
新創建的對象都是被存放在Eden和Survivor1區域,Survivor2作爲備用。Eden區域滿了之後,就會觸發Mirror gc(小垃圾回收),會回收新生代中不再被使用的對象,此時Eden和Survivor1中仍存活的對象被移入到Survivor2中。移動完之後,Survivor1和Survivor2角色互換,如此反覆。
如果一個對象在對此的Mirror gc中存活下來,則將其移入老年代。在特殊情況下,如果備用Survivor滿了,則在Mirro gc後將新的存活對象直接移入到老年代,所以老年代仍有可能有存活時間較短的對象,當老年代也滿了會觸發full gc操作,回收老年代的對象,full gc會消耗大量資源。