Published

Mon 14 December 2015

←Home

Apache Spark 環境變數調整

目前使用 Apache Spark 的心得是:Spark真的很棒,處理計算時間快得沒話說。但是他許多預設的參數並不適用於實際的機群,或者可以執行得更快一些,值得再做進一步的調整。這篇整理了我這一學期做實驗的操作心得:哪些環境變數該調,又該怎麼調。如果你有不同的見解或其他推薦的參數和調整方向,還請不吝惜指教批評。

怎麼改

可以透過修改 $spark_dir/conf/spark-defaults.conf 達成。

spark.serializer

Spark 預設使用 Java 的 ObjectOutputStream framework 處理物件的序列化(serialize)。不過官網建議使用另一套 KryoSerializer,效能處理的速度會比較快。

spark.serializer org.apache.spark.serializer.KryoSerializer

spark.driver.memory

Spark 的 driver 所先預留的記憶體其實很少,如果有用到 collectAsMap ,driver會把分散在各個 worker 的資料蒐集回 driver 形成物件。如果 driver 記憶體不夠大,collectAsMap又形成過大的物件,會導致記憶體不足 (out of memory) 的錯誤,造成整個工作失敗。

e.g. spark.driver.memory 55047m

spark.locality.wait

Spark 的 worker 處理任務的時候,會優先處理同一台機器上的任務。如果有 worker 忙不過來,且又有 worker 又處於空閑狀態,他就會搜羅別台 worker 的任務來做,來幫其他worker做外包。

但是有些任務不適合外包,因為他原本所預定處理的數據量太大,一外包任務就還得傳輸這些數據,反而增加處理時間。還不如等一下,讓那個原本忙不過來的 worker 來處理自身的任務還比較快。

spark.locality.wait 這個參數定義要等多久,才會把一個任務外包給其他的worker。如果設定很大的數值,就幾乎強迫是由同一台 worker 處理他自己的任務。

e.g. spark.locality.wait 3000000

Go Top