1. 程式人生 > >Spark調優 JVM調優

Spark調優 JVM調優

1. 為什麼要進行JVM調優?為什麼要進行垃圾回收?

這裡寫圖片描述

Spark是由Scala寫的,而Java和Scala都是執行在JVM上的。而一個executor就是一個JVM程序。

我們會把executor分成兩份,老年代和新生代,比例可能會不一樣。新生代會分成三份。

這裡寫圖片描述

Spark作業開始執行,會不斷的產生物件,物件會首先進入Eden區,然後如果Eden區儲存滿了,物件就會進入survivor1區,如果Eden和survivor1區都滿了,就會發生minor GC,h會在新生代裡面發生垃圾回收,,把不需要的物件回收。假設4,7,8都是無用的物件會被清除,而5,6是沒被GC掉的,就會被放到9中。如果左邊都不夠用了,就會把survivor中的放入老年代裡。如果一個物件,在新生代,多次minor GC 還是沒有被回收,那麼說明這個物件是長時間存活的物件,那麼就會把這些物件移動到老年代裡。如果一直這麼移動,如果老年代也存不下物件,那麼就會發生full GC,full GC非常耗費資源。

不正常的情況。如果Eden區不夠大,那麼很可能出現大量的資料頻繁進入survivor區,那麼會平凡的進入老年代,full GC就會很頻繁的發生,會導致Spark工作現場停止,直接影響Spark作業的執行。

如果Eden區比較小,會很快滿,然後survivor也會變滿,最後老年代會有很多存活時間短的物件,導致full GC.

這裡寫圖片描述

2.基礎調優思路

垃圾回收的效能開銷,是跟記憶體中的物件的數量成正比的。
1. 對於垃圾回收的效能問題,首先要做的就是,使用高效的資料結構。
2. 持久化RDD時,使用序列化的持久化級別,而且使用Kyro序列化類庫,這樣partition就只是一個物件,一個位元組陣列
3. 給Eden區域分配更大的空間,使用-Xmn即可,通常建議給Eden區域,預計大小的4/3

如果使用的是HDFS檔案,那麼很好估計Eden區域的大小,如果每個executor有4個task,然後每個hdfs壓縮塊解壓縮後大小是3倍,此外每個hdfs塊的大小是64M,那麼Eden區域的預計大小就是:4*3*64M,然後通過-Xmn引數,將Eden區域的大小設定為4*3*64*3/4

3.大資料啟動的JVM程序

hadoop
    hdfs
        NameNode
        datenode
    YARN
        ResourceManager
        NodeManager
Hbase
    Hmaster
    HRegionserver
Spark
    Master
    Worker

都是Java虛擬機器服務程序(JVM)

4.CDH版本的Spark預設優化

這些引數是多次試驗後得到的資料,注意這個是虛擬機器的,實際需要修改。

-Xms1073741824 -Xmx1073741824
-XX:+UseParNewGC    -XX:+useConcMarkSweepGC -XX:-CMSConcurrentMTEnabled
-XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled
-XX:OnOutOfMemoryError=/usr/lib64/cmf/service/common/killparent.sh

解釋

-Xmx:最大堆的大小 (生產環境-Xmx會設定大點)
-Xms : 初始堆大小
-XX:+UseConcMarkSweepGC 該標誌首先啟用CMS收集器,預設HotSpot JVM是的是並行收集器。
-XXUseParNewGC:當使用CMS收集器時,該標誌啟用年輕代使用多多執行緒並行執行垃圾回收。
-XX:+CMSConcurrentMTEnabled 該標誌被啟用時,併發的CMS階段將以多執行緒執行(因此,多個GC會與所有的應用程式並行工作)該標誌已經預設開如果順序執行更好,這取決於所使用的硬體。多執行緒執行可以通過-XX:CMSConcurrentMTEnabled禁用。
-XX:+CMSParllelRemarkEnabled:降低標記停頓

+號是開啟  -是關閉

CMSInitiatingOccupancyFraction:使用cms作為垃圾回收使用70%後開始CMS收集

當我們的年老代記憶體佔用70%,就進行垃圾回收。

-XX:+CMSConcurrentMTEnabed:當該標誌被啟動時,併發和CMS階段將以多執行緒執行(因此,多個GC執行緒會與所有的應用程式並行工作)。該標誌已經預設開啟,如果順序執行更好,這取決於所使用的的硬體,多執行緒執行可以通過-XX:-CMSConcurremntMTEnabled禁用。
-XX:+CMSParallelRemarkEnabled:降低標記停頓