在學習和使用Spark過程中,簡單瞭解下Spark如何在不同計算間分配資源,總的來說可以分爲如下兩個角度去分析(請路過高手指正):
1> 每個Spark應用被分配到獨立的進程(Executor)集上,Cluster Manager負責在不同的Spark應用間調度資源。
2> 對於每個Spark應用的進程集內(一個SparkContext實例內),Spark通過 Fair Scheduler來調度資源。
針對1>,
最簡單的是靜態分配資源;基於集羣模式的不同,分配策略稍有區別:
Standalone:
--- 提交的應用遵循FIFO順序執行(每個應用默認試圖使用所有可能的結點--slave nodes)
--- 應用程序中可以限制可使用的Slave node數目(通過spark.cores.max或 spark.deploy.defaultCores)
--- 應用程序也可以限制每個executor的內存使用(spark.executor.memory)
YARN:
--- 可限制Spark應用的executor數目(--num-executor)
--- 可限制每個executor可使用的CPU及內存資源 (--executor-cores 和 --executor-memory)
Mesos:
--- 指定使用粗粒度模型 (spark.mesos.coarse設爲true,表示資源靜態分配)
-- 限制每個應用可使用的最大CPU資源 (spare.cores.max)
-- 限制每個executor的memory使用 (spark.executor.memory)
--- 也可指定細粒度模型,但僅針對CPU Cores(動態分配CPU資源,當應用不忙時可暫時釋放CPU給其他應用。Memory仍然靜態分配)
動態調度資源目前在YARN上支持,默認是disable的;未來版本會在standalone上支持。(暫時不詳細介紹該部分)
針對2>--Spark應用內的資源調度:
--- 默認模式是FIFO,先被執行的Job可使用所有資源,如果先執行的Job通過資源限制並不使用所有資源,則後續的Job也可以開始運行;
--- Spark應用中可以通過代碼設置採用Fair Scheduler, 簡單講這就是一種round robin模式,Job不論提交順序,都會被輪詢執行。