轉自:http://hadoop1989.com/2015/10/08/Spark-Configuration/
一、Spark參數設置
Spark配置參數,一共有三種方法,
1、 在程序中,直接設置參數,例如:
val conf = new SparkConf() .setMaster("local[2]") .setAppName("CountingSheep") .set("spark.executor.memory", "1g") val sc = new SparkContext(conf)
2、動態加載參數
首先在程序中,創建一個空的conf,
val sc = new SparkContext(new SparkConf())
運行時,動態配置參數
./bin/spark-submit --name "My app" --master local[4] --conf spark.shuffle.spill=false --conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" myApp.jar
3、配置文件
通過修改conf/spark-defaults.conf文件,也可以進行參數配置,例如
spark.master spark://5.6.7.8:7077 spark.executor.memory 512m spark.eventLog.enabled true spark.serializer org.apache.spark.serializer.KryoSerializer
如果同一個參數,在上面三處都進行了配置,那么Spark讀取的優先級是:
程序中的SparkConf變量 > 動態參數 > 配置文件
二、查看Spark參數設置
在應用的web UI 界面中,”Environment”標簽頁列出了所有的Spark屬性

只有顯式在spark-defaults.conf 、 SparkConf、動態加載中設置的屬性才顯示,其它的配置屬性將使用缺省值。
三、Spark參數分類
Spark中可配置參數很多,在Spark1.2的文檔中,將參數分為13類:
-
Application Properties
該類參數對spark app 屬性進行配置,如app的名稱、master地址、executor、driver使用的內存大小等。
-
Runtime Environment
spark作業運行時的環境變量設置,如JVM、ClassPath、LibraryPath等
-
Shuffle Behavior
shuffle處理過程中的參數配置
-
Spark UI
設置Web監控界面的相關參數,如URL端口號等。
-
Compression and Serialization
Spark作業中壓縮和序列化相關參數,如rdd分區是否壓縮,IO壓縮編碼等。
-
Execution Behavior
Spark作業執行過程中的相關參數,如記錄元數據(stages、task生成)的保留時間等。
-
Networking
網絡方面的配置,如diver的主機地址和端口號
-
Scheduling
spark作業調度相關配置,如task的內核數,task的最大重試次數,任務調度模式等。
-
Dynamic allocation
動態分配相關參數,需要使用yarn模式使用
-
Security
spark安全方面的配置,如是否啟用內部身份驗證,Spark webUI訪問用戶的列表等。
-
Spark Streaming
Streaming相關配置,如receiver接收數據合並成數據塊的時間間隔
-
Environment Variables
通過修改conf/spark-env.sh文件,更改環境變量配置,如JAVA_HOME、SPARK_MASTER_PORT等。
-
Configuring Logging
Spark使用log4j來進行日志管理,日志方面的配置,可在log4j.properties文件中進行修改。
每組具體有哪些參數、默認值、及其含義,詳見:http://spark.apache.org/docs/1.2.1/configuration.html
四、Spark性能相關參數
1、spark.shuffle.manager
用來配置所使用的Shuffle Manager,默認值為sort,可選的參數:
- hash(org.apache.spark.shuffle.sort.HashShuffleManager)
- sort(org.apache.spark.shuffle.sort.SortShuffleManager)
HashShuffleManager,控制Shuffle的過程中寫數據時不做排序操作,只是將數據根據Hash的結果,將各個Reduce分區的數據寫到各自的磁盤文件中。如果文件數量特別巨大,對文件讀寫的性能會帶來比較大的影響,此外由於同時打開的文件句柄數量眾多,序列化,以及壓縮等操作需要分配的臨時內存空間也可能會迅速膨脹到無法接受的地步,對內存的使用和GC帶來很大的壓力,在Executor內存比較小的情況下尤為突出,例如Spark on Yarn模式。
SortShuffleManager,在寫入分區數據的時候,首先會根據實際情況對數據采用不同的方式進行排序操作,底線是至少按照Reduce分區Partition進行排序,這樣來至於同一個Map任務Shuffle到不同的Reduce分區中去的所有數據都可以寫入到同一個外部磁盤文件中去,用簡單的Offset標志不同Reduce分區的數據在這個文件中的偏移量。這樣一個Map任務就只需要生成一個shuffle文件,從而避免了上述HashShuffleManager可能遇到的文件數量巨大的問題。
對於不需要進行排序的Shuffle操作來說,如repartition等,如果文件數量不是特別巨大,HashShuffleManager面臨的內存問題不大,而SortShuffleManager需要額外的根據Partition進行排序,顯然HashShuffleManager的效率會更高。
而對於本來就需要在Map端進行排序的Shuffle操作來說,如ReduceByKey等,使用HashShuffleManager雖然在寫數據時不排序,但在其它的步驟中仍然需要排序,而SortShuffleManager則可以將寫數據和排序兩個工作合並在一起執行,因此即使不考慮HashShuffleManager的內存使用問題,SortShuffleManager依舊可能更快。
在實際開發過程中,我們的作業大多都會涉及ReduceByKey操作,目前該參數設置為sort,是比較合理的。在沒有涉及到ReduceByKey操作,且文件數量不是特別巨大的情況下,可以嘗試使用hash操作。
2、spark.local.dir
Spark用於寫中間數據,如RDD Cache,Shuffle,Spill等數據的位置,默認值為/tmp,該參數可以配置多個路徑(用逗號分隔)到多個磁盤上增加整體IO帶寬。
Spark是通過對文件名采用hash算法分布到多個路徑下的目錄中去,如果你的存儲設備有快有慢,比如SSD+HDD混合使用,那么你可以通過在SSD上配置更多的目錄路徑來增大它被Spark使用的比例,從而更好地利用SSD的IO帶寬能力。當然這只是一種變通的方法,終極解決方案還是應該像目前HDFS的實現方向一樣,讓Spark能夠感知具體的存儲設備類型,針對性的使用。
需要注意的是,在Spark 1.0 以后,SPARK_LOCAL_DIRS (Standalone, Mesos) or LOCAL_DIRS (YARN)參數會覆蓋這個配置。比如Spark On YARN的時候,Spark Executor的本地路徑依賴於Yarn的配置,而不取決於這個參數。
目前我們對於該參數並未設置,使用的是默認值/tmp,建議進行配置,減輕對根目錄磁盤的負載壓力,增加整體IO帶寬。
3、spark.serializer
默認為org.apache.spark.serializer.JavaSerializer, 可選org.apache.spark.serializer.KryoSerializer
序列化對於spark應用的性能來說,還是有很大影響的,在特定的數據格式的情況下,KryoSerializer的性能可以達到JavaSerializer的10倍以上,當然放到整個Spark程序中來考量,比重就沒有那么大了,但是以Wordcount為例,通常也很容易達到30%以上的性能提升。而對於一些Int之類的基本類型數據,性能的提升就幾乎可以忽略了。KryoSerializer依賴Twitter的Chill庫來實現,相對於JavaSerializer,主要的問題在於不是所有的Java Serializable對象都能支持。
目前我們配置的值是org.apache.spark.serializer.KryoSerializer,無須更改。
4、spark.rdd.compress
在RDD Cache的過程中,RDD數據在序列化之后是否進一步進行壓縮再儲存到內存或磁盤上。當然是為了進一步減小Cache數據的尺寸,該值需要配合StorageLevel參數來使用,對於Cache在磁盤上而言,大小沒有太大關系,主要是考慮Disk的IO帶寬。而對於Cache在內存中,那主要就是考慮尺寸的影響,是否能夠Cache更多的數據,是否能減小Cache數據對GC造成的壓力等。
該值默認為false,目前我們配置的為true。本質上該參數是通過CPU消耗的時間來節約空間。
5、spark.scheduler.mode
多個spark app之間的調度策略,默認值為FIFO,誰先申請和獲得資源,誰就占用資源直到完成。可選值為FAIR,公平調度。在Yarn模式下,則多個Spark應用間的調度策略由Yarn自己的策略配置文件所決定。
由於目前我們Spark任務較多,配置的參數中,使用FAIR模式進行調度,是合理的。
