一、前述
Spark中資源排程是一個非常核心的模組,尤其對於我們提交引數來說,需要具體到某些配置,所以提交配置的引數於原始碼一一對應,掌握此節對於Spark在任務執行過程中的資源分配會更上一層樓。由於原始碼部分太多本節只抽取關鍵部分和結論闡述,更多的偏於應用。
二、具體細節
1、Spark-Submit提交引數
Options:
- --master
MASTER_URL, 可以是spark://host:port, mesos://host:port, yarn, yarn-cluster,yarn-client, local
- --deploy-mode
DEPLOY_MODE, Driver程式執行的地方,client或者cluster,預設是client。
- --class
CLASS_NAME, 主類名稱,含包名
- --jars
逗號分隔的本地JARS, Driver和executor依賴的第三方jar包(Driver是把運算元中的邏輯傳送到executor中去執行,所以如果邏輯需要依賴第三方jar包 比如oreacl的包時 這裡用--jars新增)
- --files
用逗號隔開的檔案列表,會放置在每個executor工作目錄中
- --conf
spark的配置屬性
- --driver-memory
Driver程式使用記憶體大小(例如:1000M,5G),預設1024M
- --executor-memory
每個executor記憶體大小(如:1000M,2G),預設1G
Spark standalone with cluster deploy mode only:
- --driver-cores
Driver程式的使用core個數(預設為1),僅限於Spark standalone模式
Spark standalone or Mesos with cluster deploy mode only:
- --supervise
失敗後是否重啟Driver,僅限於Spark alone或者Mesos模式
Spark standalone and Mesos only:
- --total-executor-cores
executor使用的總核數,僅限於SparkStandalone、Spark on Mesos模式
Spark standalone and YARN only:
- --executor-cores
每個executor使用的core數,Spark on Yarn預設為1,standalone預設為worker上所有可用的core。
YARN-only:
- --driver-cores
driver使用的core,僅在cluster模式下,預設為1。
- --queue
QUEUE_NAME 指定資源佇列的名稱,預設:default
- --num-executors
一共啟動的executor數量,預設是2個。
2、資源排程原始碼分析
- 資源請求簡單圖
- 資源排程Master路徑:
路徑:spark-1.6.0/core/src/main/scala/org.apache.spark/deploy/Master/Master.scala
- 提交應用程式,submit的路徑:
路徑:spark-1.6.0/core/src/main/scala/org.apache.spark/ deploy/SparkSubmit.scala
- 總結:
- Executor在叢集中分散啟動,有利於task計算的資料本地化。
- 預設情況下(提交任務的時候沒有設定--executor-cores選項),每一個Worker為當前的Application啟動一個Executor,這個Executor會使用這個Worker的所有的cores和1G記憶體。
- 如果想在Worker上啟動多個Executor,提交Application的時候要加--executor-cores這個選項。
- 預設情況下沒有設定--total-executor-cores,一個Application會使用Spark叢集中所有的cores。設定多少個用多少。
- 結論演示
叢集中總資源如下:
使用Spark-submit提交任務演示。也可以使用spark-shell
2.1、預設情況每個worker為當前的Application啟動一個Executor,這個Executor使用叢集中所有的cores和1G記憶體。
./spark-submit --master spark://node01:7077 --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 10000
2.2、在workr上啟動多個Executor,設定--executor-cores引數指定每個executor使用的core數量。
./spark-submit --master spark://node01:7077 --executor-cores 1 --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 10
2.3、記憶體不足的情況下啟動core的情況。Spark啟動是不僅看core配置引數,也要看配置的core的記憶體是否夠用。
./spark-submit --master spark://node01:7077 --executor-cores 1 --executor-memory 3g --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 10000
可見並沒有啟動起來,因為記憶體不夠。。。
./spark-submit --master spark://node01:7077 --executor-cores 1 --executor-memory 2g --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 10000
2.4、--total-executor-cores叢集中共使用多少cores
注意:一個程式不能讓叢集多個節點共同啟動。
./spark-submit --master spark://node01:7077 --executor-cores 1 --executor-memory 2g --total-executor-cores 3 --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 10000
./spark-submit --master spark://node01:7077 --executor-cores 1 --executor-memory 1g --total-executor-cores 3 --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 200
./spark-submit --master spark://node01:7077 --executor-cores 1 --executor-memory 2g --total-executor-cores 3 --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 200
注意:生產環境中一定要加上資源的配置 因為Spark是粗粒度排程資源框架,不指定的話,預設會消耗所有的cores!!!!
3 、任務排程原始碼分析
- Action運算元開始分析
任務排程可以從一個Action類運算元開始。因為Action類運算元會觸發一個job的執行。
- 劃分stage,以taskSet形式提交任務
DAGScheduler 類中getMessingParentStages()方法是切割job劃分stage。可以結合以下這張圖來分析: