Spark On YARN記憶體和CPU分配

來源:互聯網
上載者:User

標籤:啟動參數   2.7   res   不能   iss   佔用   core   mini   efault   

本篇部落格參考:http://blog.cloudera.com/blog/2015/03/how-to-tune-your-apache-spark-jobs-part-2/ 

軟體版本:

CDH:5.7.2,JDK:1.7;

問題描述:在使用Spark On YARN時(無論是Client模式或者是Cluster模式,當然下面會有這種模式的對比區別),可以添加諸如:
--executor-memory 8G --executor-cores 5 --num-executors 20
等等這樣的參數,但是這個和我們平常理解的感覺有誤,或者說不直觀,怎麼說呢?比如一個6節點(NodeManager)的叢集,每個節點配置為:16 CPU核,64G記憶體,那麼一般很容易提交代碼的時候寫成如下配置:
--num-executors 6 --executor-cores 15 --executor-memory 63G
但是這樣配置後,你會發現,在8088連接埠的YARN監控上得到的不是你想得到的資源分派,那正確的配置應該是怎樣的呢?前備知識:1. YARN NodeManager資源NodeManager所在的機器如果是16核、64G,那麼設定如下參數(這兩個參數是NodeManager能分配的最大記憶體和最大cpu):
yarn.nodemanager.resource.memory-mbyarn.nodemanager.resource.cpu-vcores
最好是小一點,比如設定記憶體為63G,核心為15,因為需要分配一些資源給系統以及後台Hadoop進程。當然,如果每個機器是6核,6G記憶體,那可以分配到5核以及5.5G記憶體左右;在原文中,說CDH機器可以自動的分配,不過我看到CDH叢集設定這兩個參數只是其能最大的值,也就是機器自身的資源。比如我的6核,6G記憶體,其配置如下:
(當然,預設是8G記憶體,8核CPU的)2. Spark On YARN Client 和ClusterSpark提交任務首先由用戶端(CLient)產生一個Spark Driver,Spark Driver在YARN的NOdeManager中產生一個ApplicationMaster,ApplicationMaster向YARN Resourcemanager申請資源(這些資源就是NodeManager封裝的Container,其中包含記憶體和cpu),接著Spark Driver調度並運行任務;那麼Client和CLuster過程如下:
其中,左邊是CLient模式,右邊是Cluster模式,也就是說其實CLuster模式下,提交任務後,CLient可以離開了,而Client模式下,Client不可以離開;另外,不管CLient或CLuster模式下,ApplicationMaster都會佔用一個Container來運行;而Client模式下的Container預設有1G記憶體,1個cpu核,Cluster模式下則使用driver-memory和driver-cpu來指定;但是這裡有個問題,在Client模式下,這裡的預設配置:
是512M的,但是參考部落格裡面說CDH裡面這個預設是1G的(這裡應該是1G的,不然的話,後面實驗對應不到)3. Spark On YARN資源申請1. 使用者通過executor-memory設定記憶體;2. 經過spark.yarn.exeuctor.memoryOverhead的加持,申請的記憶體變為 executor-memory + max (384 , 0.1 * executor-memory) ;這裡的384 和0.1(原文中這個值是0.07,這個需要注意)是參考下面的參數來的:
3. NodeManager在向上申請資源的時候會經過參數:
yarn.scheduler.minimum-allocation-mb // defalut 1G yarn.scheduler.increment-allocation-mb // default 512M
的加持,向上取整為2中的倍數,並且最接近2中的數值。比如說--executor-memory是3G,那麼2中的值就是3G+ max(384 , 0.1 *3 *1024) = 3G + 384m ~ 3.5G ,所以NodeManager申請的資源應該就是3.5G(3584m),而不是3456m(3*1024+384)。
另外:executor-cores其實是設定並行的個數的,由於HDFS的bug,executor-cores建議設定為5或以下;實驗及如何設定資源分派:1. 問題解答:那麼,回到最開始的問題,6個節點(NodeManager),每個64G記憶體,16核如果要使用儘可能多的叢集資源,怎麼分配:1. 首先,去掉節點系統使用1G記憶體1核cpu,那麼還剩63G記憶體,15核cpu;2. 加入executor-cpus設定為5,也就是建議值的最大,那麼每個節點可以分配3個Container ,即 15 /5= 3 個Executor;3. 哪每個executor記憶體呢? 63/3 = 21G 記憶體,21G - max(384 ,0.1 *21G) = 18.9G ; 那麼executor-memory應該設定為多少呢?這個值應該是18.5G,為什麼是這個呢?a. 第一,這個值需要是512M的倍數;b,第二,xG + max(384m,0.1 * xG) < 21 G, 這個x 最大就是18.5G;說道這裡,需要說明一點,在參考的連結中參數0.1不是0.1,而是0.07,所以算的的executor-memory是19G,這個需要注意;4. 那有多少個executor呢? 有人說這還不好算:6個節點 ,每個節點3executor,所以一共是18個;這個不對;因為需要有一個container來部署ApplicationMaster,所以有個節點其資源就會減少,這也就是說在ApplicationMaster所在的節點上最多隻能有2個executor,所以最終的參數是:
--num-executors 17 --executor-cores 5 --executor-memory 18944m
因為這個參數不能識別小數點,所以不能寫成18.5G(注意這個值和原文中是不一樣的,如果0.1參數在CDH叢集中的預設值是0.07,那麼就是原文的答案);
2. 5節點,6核cpu,6G記憶體怎麼分配11. 去掉節點系統記憶體512M,1核cpu;還剩5核cpu,5.5G記憶體;2. 如果每個executor的executor-cpus設定為5,那麼也就是說每個節點有1個executor;3. 這樣子的話,executor-memory就應該設定為5G , 5G + max(384, 0.1 * 5G ) = 5.5G   ~ 5.5G ,這樣子分配剛剛好;4. executor就應該設定為4 ,因為其中一個NodeManager分配了ApplicationMaster,那麼其就不能產生一個executor了;啟動參數為:
spark-shell --master yarn  --deploy-mode client --executor-memory 5G --executor-cores 4 --num-executors 4
5. 驗證:a. 首先看資源分派:container個數5個?這個怎麼來的,明明申請了4個executor,每個executor對應一個container,那就是4個container,怎麼會多一個呢?其實這個就是啟動ApplicationMaster的container;cpu核有17個? 4*4 = 16 ,另外一個當然就是啟動ApplicationMaster的資源了;記憶體23552m ? 4 *5 *1024 = 20480,這不對呀,還差好多呢,那實際是怎麼計算的呢?實際的計算方式應該是:4* (5G + max(384m , 0.1 * 5G )) * 1024 + 1024 = 23552 ;   其中,最後一個加的就是啟動ApplicationMaster預設的1G記憶體;
b. 看日誌:

看日誌其實這個過程就更加清晰了;首先,可以看到4個container;其次記憶體是5632m = (5G + 0.1 *5G )* 1024。
3. 5節點,6核cpu,6G記憶體怎麼分配2除了2中的分配方式,有沒有其他分配方式呢?如果每個executor-cpus是1呢?1. executor-cpus=1 ; 那麼每個節點就可以分5個executor;2. 所以每個節點可以分 5.5G/ 5 = 1.1G ,所以最大隻能1.1G,記憶體,而且NodeManager申請的資源只能是512M的整數倍,所以最大是1024M,那麼executor-memory + max( 384, 0.1 * executor-memory) = 1024M ,那麼executor-memory就等於640;3. 有多少個executor呢? 4 * 5 = 20 ,運行ApplicationMaster節點的有多少個呢,去掉ApplicationMaster的資源1G記憶體,1cpu還剩4.5G記憶體,4cpu核,申請4個executor是可以的,所以一共就有 4* 5 + 4 = 24個container;參數:
spark-shell --master yarn  --deploy-mode client --executor-memory 640m --executor-cores 2 --num-executors 24 

4. 驗證:



4. 5節點,6核cpu,6G記憶體怎麼分配3除了2、3中的分配方式,有沒有其他分配方式呢?如果每個executor-cpus是2呢?1. executor-cpus=2 ; 那麼每個節點就可以分2個executor(5/2 ~ 2 ,只能往低約等於);2. 所以每個節點可以分 5.5G/ 2 = 2.75G ,所以最大隻能2.75G,記憶體,而且NodeManager申請的資源只能是512M的整數倍,所以最大是2.5G,那麼executor-memory + max( 384, 0.1 * executor-memory) ~ 2.5G ,那麼executor-memory就等於2176;3. 有多少個executor呢? 4 * 2 = 8 ,運行ApplicationMaster節點的有多少個呢,去掉ApplicationMaster的資源1G記憶體,1cpu還剩4.5G記憶體,4cpu核,只能申請1個executor是可以的,所以一共就有 4* 2 + 1 = 9個container;參數:
spark-shell --master yarn  --deploy-mode client --executor-memory 2176m --executor-cores 2 --num-executors 9

4. 驗證:



5. 5節點,6核cpu,6G記憶體怎麼分配4但是,如果上一個分配中的第2中分配的記憶體是executor-memory + max( 384, 0.1 * executor-memory) ~ 2G, 那麼executor-memory= 1664m;這個時候有多少個container呢?運行ApplicationMaster的這時就可以運行2個executor了,所以一共有10個executor;參數:
spark-shell --master yarn  --deploy-mode client --executor-memory 1664m --executor-cores 2 --num-executors 10
驗證:

總結:1. Spark On YARN資源分派沒有Spark StandAlone的那麼明確,過程有點複雜;2. 國外的文章參考價值還是蠻大的,畢竟很多技術都是從國外傳過來的,google以後都不能用了,咋辦?

分享,成長,快樂

腳踏實地,專註

轉載請註明blog地址:http://blog.csdn.NET/fansy1990




Spark On YARN記憶體和CPU分配

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.