spark垃圾回收(GC)

參考:北風網 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會消耗大量資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章