1、前述node
Spark中資源調度是一個很是核心的模塊,尤爲對於咱們提交參數來講,須要具體到某些配置,因此提交配置的參數於源碼一一對應,掌握此節對於Spark在任務執行過程當中的資源分配會更上一層樓。因爲源碼部分太多本節只抽取關鍵部分和結論闡述,更多的偏於應用。shell
2、具體細節apache
一、Spark-Submit提交參數框架
Options:oop
MASTER_URL, 能夠是spark://host:port, mesos://host:port, yarn, yarn-cluster,yarn-client, local源碼分析
DEPLOY_MODE, Driver程序運行的地方,client或者cluster,默認是client。spa
CLASS_NAME, 主類名稱,含包名scala
逗號分隔的本地JARS, Driver和executor依賴的第三方jar包(Driver是把算子中的邏輯發送到executor中去執行,因此若是邏輯須要依賴第三方jar包 好比oreacl的包時 這裏用--jars添加)隊列
用逗號隔開的文件列表,會放置在每一個executor工做目錄中進程
spark的配置屬性
Driver程序使用內存大小(例如:1000M,5G),默認1024M
每一個executor內存大小(如:1000M,2G),默認1G
Spark standalone with cluster deploy mode only:
Driver程序的使用core個數(默認爲1),僅限於Spark standalone模式
Spark standalone or Mesos with cluster deploy mode only:
失敗後是否重啓Driver,僅限於Spark alone或者Mesos模式
Spark standalone and Mesos only:
executor使用的總核數,僅限於SparkStandalone、Spark on Mesos模式
Spark standalone and YARN only:
每一個executor使用的core數,Spark on Yarn默認爲1,standalone默認爲worker上全部可用的core。
YARN-only:
driver使用的core,僅在cluster模式下,默認爲1。
QUEUE_NAME 指定資源隊列的名稱,默認:default
一共啓動的executor數量,默認是2個。
二、資源調度源碼分析
路徑:spark-1.6.0/core/src/main/scala/org.apache.spark/deploy/Master/Master.scala
路徑:spark-1.6.0/core/src/main/scala/org.apache.spark/ deploy/SparkSubmit.scala
集羣中總資源以下:
使用Spark-submit提交任務演示。也可使用spark-shell
2.一、默認狀況每一個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.二、在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.三、內存不足的狀況下啓動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.四、--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類算子會觸發一個job的執行。
DAGScheduler 類中getMessingParentStages()方法是切割job劃分stage。能夠結合如下這張圖來分析: