Spark三種屬性配置方式詳細說明
隨著Spark專案的逐漸成熟, 越來越多的可配置引數被新增到Spark中來。在Spark中提供了三個地方用於配置:
1、Spark properties:這個可以控制應用程式的絕大部分屬性。並且可以通過 SparkConf物件或者Java 系統屬性進行設定;
2、環境變數(Environment variables):這個可以分別對每臺機器進行相應的設定,比如IP。這個可以在每臺機器的$SPARK_HOME/ conf/spark-env.sh指令碼中進行設定;
3、日誌:所有的日誌相關的屬性可以在log4j.properties檔案中進行設定。
下面對這三種屬性設定進行詳細的說明。
一、Spark properties
Spark properties可以控制應用程式的絕大部分屬性,並且可以分別在每個應用上進行設定。這些屬性可以直接在SparkConf物件上設定,該物件可以傳遞給SparkContext。SparkConf物件允許你去設定一些通用的屬性(比如master URL、應用的名稱等),這些屬性可以傳遞給set()方法的任意key-value對。如下:
1 |
val
conf =
new
SparkConf() |
2 |
.setMaster( "local" ) |
3 |
.setAppName( "CountingSheep" ) |
4 |
.set( "spark.executor.memory" , "1g" ) |
5 |
val
sc =
new
SparkContext(conf) |
動態載入Spark屬性
在一些場景中,你可能想避免在程式碼中將SparkConf物件的屬性進行設死;比如,你可能想在不同的master上面或者不同記憶體容量執行你的應用程式。這就需要你執行程式的時候進行設定,Spark允許你建立一個空的conf物件,如下:
1 |
val
sc =
new
SparkContext( new
SparkConf()) |
然後你可以在執行的時候通過命令列進行一些屬性的配置:
1 |
./bin/spark-submit
--name "My
app" |
2 |
--master
local[ 4 ] |
3 |
--conf
spark.shuffle.spill = false |
4 |
--conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails |
5 |
-XX:+PrintGCTimeStamps" |
6 |
myApp.jar |
Spark shell和 spark-submit工具支援兩種方式來動態載入配置屬性。第一種是命令列方式,比如--master;spark-submit工具可以通過--conf標記接收任何的Spark屬性。執行 ./bin/spark-submit --help將會顯示全部的選項。
./bin/spark-submit工具也會從 conf/spark-defaults.conf配置檔案中讀取配置選項。 在conf/spark-defaults.conf配置檔案中,每行是key-value對,中間可以是用空格進行分割,也可以直接用等號進行分割。如下:
1 |
spark.master
spark : //iteblog.com:7077 |
2 |
spark.executor.memory 512 m |
3 |
spark.eventLog.enabled true |
4 |
spark.serializer
org.apache.spark.serializer.KryoSerializer |
每個值將作為一個flags傳遞到應用中並個SparkConf物件中相應的屬性進行合併。通過SparkConf 物件配置的屬性優先順序最高;其次是對spark-submit 或 spark-shell通過flags配置;最後是spark-defaults.conf檔案中的配置。
哪裡可以檢視配置好的Spark屬性
在應用程式對應的WEB UI(http://<driver>:4040)上的Environment標籤下面將會顯示出該應用程式的所有Spark配置選項。在你想確定你的配置是否正確的情況下是非常有用的。需要注意的是,只有顯示通過spark-defaults.conf 或SparkConf 進行配置的屬性才會在那個頁面顯示。其他所有沒有顯示的屬性,你可以認為這些屬性的值為預設的。
二、環境變數
有很大一部分的Spark設定可以通過環境變數來進行設定。這些環境變數設定在conf/spark-env.sh 指令碼檔案中(如果你是windows系統,那麼這個檔名稱是conf/spark-env.cmd)。在 Standalone 和 Mesos模式下,這個檔案可以設定一些和機器相關的資訊(比如hostname)。
需要注意,在剛剛安裝的Spark中conf/spark-env.sh檔案是不存在的。但是你可以通過複製conf/spark-env.sh.template檔案來建立,你的確保這個複製之後的檔案是可執行的。
下面的屬性是可以在conf/spark-env.sh檔案中配置
JAVA_HOME Java的安裝目錄
PYSPARK_PYTHON Python binary executable to use for PySpark.
SPARK_LOCAL_IP IP address of the machine to bind to.
SPARK_PUBLIC_DNS Hostname your Spark program will advertise to other machines.
對於 standalone 模式的叢集除了上面的屬性可以配置外,還有很多的屬性可以配置,具體我就不說了,自己看文件去。
三、日誌配置
Spark用log4j來記錄日誌。你可以通過配置log4j.properties來設定不同日誌的級別、存放位置等。這個檔案預設也是不存在的,你可以通過複製log4j.properties.template檔案來得到。
在後期文章中,我將逐個的介紹Spark中各個引數的含義。歡迎大家關注。
關於應用程式相關的屬性設定解釋:《Spark配置屬性詳解(1)》