spark-submit提交参数说明以及与yarn-site.xml中参数的相互约束关系+spark运行架构图解(持续更新中)
因為大型公司都有使用spark/hadoop的官方配置,不太需要個人工程師關心,
這個博客用來給予自己搭建或者小公司使用集群時使用
先復習下yarn-site.xml中幾個參數的含義[3]:
| yarn-site.xml | yarn.nodemanager.resource.memory-mb | 8192 MB | = containers * RAM-per-container |
| yarn-site.xml | yarn.scheduler.minimum-allocation-mb | 1024MB | = RAM-per-container |
| yarn-site.xml | yarn.scheduler.maximum-allocation-mb | 8192 MB | = containers * RAM-per-container |
?
表格來自[1],增加一列用來記錄約束關系(表中加粗的行都是在啟動spark-shell或者spark-submit是需要注意的約束關系,約束關系必須全部滿足,否則啟動后必定報錯,甚至連啟動都會啟動不了)
| 參數名 | 參數說明 | 默認取值[15] | 與配置文件yarn-site.xml中的參數約束關系(含依據 Reference) |
| --master | ?master 的地址,提交任務到哪里執行,例如 spark://host:port,? yarn,? local | spark://master:6066 | ?無 |
| --deploy-mode | ?在本地 (client) 啟動 driver 或在 cluster 上啟動,默認是 client | client | 無 |
| --class | ?應用程序的主類,僅針對 java 或 scala 應用 | 無 | 無 |
| --name | ?應用程序的名稱 | 無 | 無 |
| --jars | ?用逗號分隔的本地 jar 包,設置后,這些 jar 將包含在 driver 和 executor 的 classpath 下 | CLASSPATH | 無 |
| --packages | ?包含在driver 和executor 的 classpath 中的 jar 的 maven 坐標 | 無 | 無 |
| --exclude-packages | ?為了避免沖突 而指定不包含的 package | 無 | 無 |
| --repositories | ?遠程 repository | 無 | 無 |
| --conf?PROP=VALUE | ?指定 spark 配置屬性的值, ?例如 -conf?spark.executor.extraJavaOptions="-XX:MaxPermSize=256m" | 無 | 無 |
| --properties-file | ?加載的配置文件,默認為 conf/spark-defaults.conf | 無 | 無 |
| --driver-memory | ?Driver內存 spark-defaults.conf中是: spark.driver.memory | 1G | 無 |
| --driver-java-options | ?傳給 driver 的額外的 Java 選項 | 無 | 無 |
| --driver-library-path | ?傳給 driver 的額外的庫路徑 | 無 | 無 |
| --driver-class-path | ?傳給 driver 的額外的類路徑 | 無 | 無 |
| --driver-cores | ?Driver 的核數,默認是1。在 yarn 或者 standalone 下使用 ? spark-defaults.conf中的變量是 spark.driver.cores | 1 | 無 |
| --executor-memory | ?每個 executor 的內存,默認是1G spark-defaults.conf中的變量是 spark.executor.memory | 1G | executor-memory ≤ yarn.scheduler.minimum-allocation-mb≤yarn.scheduler.maximum-allocation-mb(一個container的最大值)≤yarn.nodemanager.resource.memory-mb[5] ------------------------------------------------------------------ executor-memory*num_executors<yarn.nodemanager.resource.memory-mb*node總數量 ? |
| --total-executor-cores | ?所有 executor 總共的核數。僅僅在 mesos 或者 standalone 下使用(根據[4],這個參數是集群中所有被用作executor的core的數量) ? ? spark-defaults.conf中的變量是 spark.executor.cores | 1 in YARN mode, all the available cores on the worker in standalone and Mesos coarse-grained modes. | num-executors * executor-cores<總cpu核數[6] |
| --num-executors | ?啟動的 executor 數量(cluster中總數量[11])。默認為2。在 yarn 下使用 | 2 | num-executors * executor-cores<總cpu核數[6] |
| --executor-cores | ?每個 executor 的核數。在yarn或者standalone下使用 ? ? spark-defaults.conf中的變量是 spark.executor.cores | 1 | 命令行executor-cores<配置文件yarn.scheduler.maximum-allocation-vcores[2] |
?
如果懶得關心表格中的一些約束關系,可以直接參考[7]
yarn.nodemanager.resource.memory-mb那這個我的精確理解是:
針對yarn提交到目標集群的application,整個集群中,每個nodemanager可分配的內存上限
這里的內存上限指的是系統占用、同事占用后剩下的單機內存的上限
?
如何為每臺機子分配cores呢?
根據[8]中的一個例子:
spark-submit \ --num-executors 10 \ --master spark://master:7077 --driver-memory 4G --executor-memory 2G \ --deploy-mode client \ --executor-cores 2 \ --total-executor-cores 8 \ /opt/app/Application.jar HelloWorld假設有4臺機子,node1剩余8個core,其他三臺剩余3個core
- 此時會遍歷每個Worker,第一輪遍歷后,每個Worker否符合啟動一個executor(根據命令中的executor-cores,每個executor占用兩個cpu core),這是已經分配了8個core,每臺Worker都運行了一個executor(即占用兩個cpu core)。
- 然后繼續遍歷可用資源,進行下一輪分配,只有node1可以符合啟動executor,于是最后兩個core分配到node1上。最后達到了標準的--total-executor-cores 8。
另外[5]還提到了pyspark對資源的分配原理
網上常說的yarn隊列指的就是scheduler
?
[6]num-executors乘以executor-memory,就代表了你的Spark作業申請到的總內存量(也就是所有Executor進程的內存總和),這個量是不能超過隊列的最大內存量的。
?
[9]講解了yarn.scheduler.maximum-allocation-mb和yarn.nodemanager.resource.memory-mb的區別
這個鏈接中的意思是:
yarn.scheduler.maximum-allocation-mb:分配給container的資源上限
yarn.nodemanager.resource.memory-mb:多個container的總資源上限
?
?
[10]提到了關于兩種不同模式的消耗資源的更為準確的計算方式
- yarn-client 模式的資源計算
節點資源類型資源量(結果使用上面的例子計算得到) master core 1 mem driver-memroy = 4G worker core num-executors * executor-cores = 4 mem num-executors * executor-memory = 4G - 作業主程序(Driver 程序)會在 master 節點上執行。按照作業配置將分配 4G(由 —driver-memroy 指定)的內存給它(當然實際上可能沒有用到)。
- 會在 worker 節點上起 2 個(由 —num-executors 指定)executor,每一個 executor 最大能分配 2G(由 —executor-memory 指定)的內存,并最大支持 2 個(由--executor-cores 指定)task 的并發執行。
- yarn-cluster 模式的資源計算
節點資源類型資源量(結果使用上面的例子計算得到) master - 一個很小的 client 程序,負責同步 job 信息,占用很小。 worker core num-executors * executor-cores+spark.driver.cores = 5 mem num-executors * executor-memory + driver-memroy = 8g
?
?
[12]任務的并行度由分區數(Partitions)決定,一個Stage有多少分區,就會有多少Task。每個Task默認占用一個Core,一個Executor上的所有core共享Executor上的內存,一次并行運行的Task數等于num_executor*executor_cores,如果分區數超過該值,則需要運行多個輪次,一般來說建議運行3~5輪較為合適,否則考慮增加num_executor或executor_cores。
下面是spark應用時序圖
?
yarn-client模式[13](這張圖可能不夠準確,因為slaves文件中中如果寫入master,那么master中也可以存在 executor)
?
yarn-cluster模式[13]
?
#--------------------------------------------關于scheduler隊列-------------------------------------------------------------------
這個東西和django+celery的郵件系統案例了類似,都是多開一個進程,然后主題把任務甩鍋給隊列。
#-----------------------------------------如何運用這些約束關系呢?(舉例)------------------------------------------------------------------------------
①yarn.scheduler.maximum-allocation-mb(一個container的最大值)≤yarn.nodemanager.resource.memory-mb
當這個關系被違反的時候,會發生現象[16]
②executor-cores<yarn.scheduler.maximum-allocation-vcores
當這個關系被違反的時候,會發生報錯[17]
?
Reference:
[1]spark-submit 提交任務及參數說明
[2]Yarn application has already ended! It might have been killed or unable to launch application master
[3]YARN的Memory和CPU調優配置詳解
[4]Spark遇到的問題
[5]spark程序與參數的關系
[6]spark 指定相關的參數配置 num-executor executor-memory executor-cores
[7]YARN的Memory和CPU調優配置詳解
[8]Spark遇到的問題
[9]Difference between `yarn.scheduler.maximum-allocation-mb` and `yarn.nodemanager.resource.memory-mb`?
[10]Spark-Submit 參數設置說明
[11]Distribution of Executors, Cores and Memory for a Spark Application running in Yarn
[12]Spark Scheduler內部原理剖析
[13]spark集群的任務提交執行流程
[14]How to deal with executor memory and driver memory in Spark?
[15]Spark Configuration-官方文檔
[16]Spark集群啟動正常,但是提交任務后只有一個節點(slave/worker)參與集群計算
[17]Yarn application has already ended! It might have been killed or unable to launch application master
總結
以上是生活随笔為你收集整理的spark-submit提交参数说明以及与yarn-site.xml中参数的相互约束关系+spark运行架构图解(持续更新中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 泡腐竹多久能泡好 怎么泡腐竹快一点
- 下一篇: 开发源码商城系统的作用