日常工作使用spark處理業務問題中不可避免的都會碰到需要對spark的效能進行調優的情況,這裡就介紹一下對spark的效能調優。
1. 調節記憶體分配
因為在spark中堆記憶體被劃分為兩塊,一塊是給rdd的cache和persist操作rdd資料快取使用的,另一塊是給spark運算元函式使用的,函式中自己存放的物件.在預設情況下,分配給cache記憶體佔比為0.6,但是有些cache時候並不需要這麼大記憶體空間,反而task運算元中建立的物件有很多,這個時候就會發生spark運算元函式使用的空間不夠用,而rdd的cache空間有部分是處於乙個浪費的狀態,這個時候就會導致頻繁的full gc,而full gc在執行的時候其他程序是無法執行的,但是spark給我提供一種方法,就是通過修改引數來改變cache的記憶體分配,可以通過修改cache的記憶體佔比,來給spark運算元函式提供更大的記憶體資源佔比。
如果說cache的記憶體資源不夠用,我們可以使用persist將部分rdd快取資料存到磁碟當中,這樣就可以降低gc的頻率,從而提高效能我們可以通過 spark.stage.memoryfunction來調節cache的記憶體佔比。
2. 調節executor堆外記憶體
調節堆外記憶體,在某些情況下,spark程式處理的資料量非常大,上億級別的時候,executor的堆外記憶體可能會存在記憶體溢位的情況,後續的stage的task執行的時候就會導致程式報錯,比如說shuffle output file not found,memory output這樣的錯誤,因為後續的task在執行的時候會從executor中拉去shuffle output file檔案,但是這個時候executor已經掛掉了,這樣就會導致程式崩潰,任務執行失敗。
而在spark中我們可以通過spark.yarn.memeoryoverhead設定引數來調節executor的堆外記憶體,比如調節為2g,4g,通常這個引數調節後,是可以避免jvm oom的問題,這樣就可以將spark的效能提高。
3. 調節連線時間
executor首先會從本地的blockmanager中拉取資料,如果本地的block manager中沒有資料則會遠端連線其他節點上的executor獲取資料,但是有的時候task中的物件太大,太多這樣就會導致jvm頻繁的溢位,而jvm頻繁溢位就會發生gc,我們都知道在jvm發生gc的時候,其他的工作執行緒都是停止的狀態,在這個時候需要獲取資料的這個executor就無法連線到另乙個已經停止的executor,發生這種情況時,也會不斷的嘗試連線,預設是60秒,如果超過60秒還連線不上,程式就會報錯。
在spark中我們可以通過調節spark.core.ack.wait.timeout設定這個連線時間,將時間調節較大之後,通常可以避免偶爾出現的檔案拉去不到,檔案丟失的一些錯誤。
spark 效能調優
核心調優引數如下 num executors executor memory executor cores driver memory spark.default.parallelizm spark.storage.memoryfraction spark.shuffle.memoryfractio...
Spark效能調優 JVM調優
通過一張圖讓你明白以下四個問題 1.jvm gc機制,堆記憶體的組成 2.spark的調優為什麼會和jvm的調優會有關聯?因為scala也是基於jvm執行的語言 3.spark中oom產生的原因 4.如何在jvm這個層面上來對spark進行調優 補充 spark程式執行時 jvm堆記憶體分配比例 r...
七 Spark效能調優 Shuffle 調優
目錄 一 調節 map 端緩衝區大小 二 調節 reduce 端拉取資料緩衝區大小 三 調節 reduce 端拉取資料重試次數 四 調節 reduce 端拉取資料等待間隔 五 調節 sortshuffle 排序操作閾值 val conf new sparkconf set spark.shuffle...