spark on yarn 資源調度(cdh爲例)

1、CPU配置:

    ApplicationMaster 虛擬 CPU內核

node

 yarn.app.mapreduce.am.resource.cpu-vcores   


   ApplicationMaster佔用的cpu內核數(Gateway--資源管理 )

  //通常設置1個核,若是想啓動時候快一點能夠多設置核數,但它無論資源分配,因此只要保證任務執行過程當中不掛就能夠了

   容器虛擬 CPU內核mysql

yarn.nodemanager.resource.cpu-vcores

//單 個NodeManager 最大能分配的cpu核數 (NodeManager --資源管理 )   

由於全部該機器上的全部進程須要資源都向nodemanager申請資源,因此nodemanager設置爲機器 最大能分配的核數,除非該機器上還有別的進程須要運行,且不是經過yarn進行資源調度。

 結論:當前 nodemanager申請的 ApplicationMaster數總和小於nodemanager最大cpu內核數

 
Yarn 集羣參數調優

  2、內存配置:

 container容器內存web

yarn.nodemanager.resource.memory-mb    

//單個NodeManager能分配的最大內存(NodeManager --資源管理)

//Memory Total = 單個NodeManager內存 * 節點數

 結論:提交任務佔用內存Memory Used小於Memory Total

 Map 任務內存

sql

 mapreduce.map.memory.mb


//爲做業的每一個 Map 任務分配的物理內存量  (Gateway--資源管理 )   

     結論:map或reduce的內存需求不大於appmaster的內存需求

    

   最大容器內存shell

yarn.scheduler.maximum-allocation-mb

 //單個任務可申請最大內存 (ResourceManager--資源管理 )

 

Yarn 集羣參數調優(以CDH集羣爲例)

  3、同一個Map或者Reduce並行執行:

  Map 任務推理執行(若是一個map任務執行特別慢,yarn會在其餘機器上啓動一個如出一轍的map任務,yarn會看誰先執行完成,而後把其餘一個任務關掉)

express

mapreduce.map.speculative       //Gateway

   Reduce 任務推理執行

緩存

mapreduce.reduce.speculative    //Gateway    


  4、spark加日誌查看(舊版本)

   編輯 spark-defaults.conf

 bash

 spark.yarn.historyServer.address=http://hostname:18088/

 

  5、JVM重用

    啓用 Ubertask優化:

app

 mapreduce.job.ubertask.enable | (默認false)     //true則表示啓用jvm重用(Gateway--性能 )


資源參數調優
  瞭解完了Spark做業運行的基本原理以後,對資源相關的參數就容易理解了。所謂的Spark資源參數調優,其實主要就是對Spark運行過程當中各個使用資源的地方,經過調節各類參數,來優化資源使用的效率,從而提高Spark做業的執行性能。如下參數就是Spark中主要的資源參數,每一個參數都對應着做業運行原理中的某個部分,咱們同時也給出了一個調優的參考值。
 
num-executors


  參數說明:該參數用於設置Spark做業總共要用多少個Executor進程來執行。Driver在向YARN集羣管理器申請資源時,YARN集羣管理器會盡量按照你的設置來在集羣的各個工做節點上,啓動相應數量的Executor進程。這個參數很是之重要,若是不設置的話,默認只會給你啓動少許的Executor進程,此時你的Spark做業的運行速度是很是慢的。

  參數調優建議:每一個Spark做業的運行通常設置50~100個左右的Executor進程比較合適,設置太少或太多的Executor進程都很差。設置的太少,沒法充分利用集羣資源;設置的太多的話,大部分隊列可能沒法給予充分的資源。
 
executor-memory


  參數說明:該參數用於設置每一個Executor進程的內存。Executor內存的大小,不少時候直接決定了Spark做業的性能,並且跟常見的JVM OOM異常,也有直接的關聯。

  參數調優建議:每一個Executor進程的內存設置4G~8G較爲合適。可是這只是一個參考值,具體的設置仍是得根據不一樣部門的資源隊列來定。能夠看看本身團隊的資源隊列的最大內存限制是多少,num-executors乘以executor-memory,就表明了你的Spark做業申請到的總內存量(也就是全部Executor進程的內存總和),這個量是不能超過隊列的最大內存量的。此外,若是你是跟團隊裏其餘人共享這個資源隊列,那麼申請的總內存量最好不要超過資源隊列最大總內存的1/3~1/2,避免你本身的Spark做業佔用了隊列全部的資源,致使別的同窗的做業沒法運行。
 
executor-cores


  參數說明:該參數用於設置每一個Executor進程的CPU core數量。這個參數決定了每一個Executor進程並行執行task線程的能力。由於每一個CPU core同一時間只能執行一個task線程,所以每一個Executor進程的CPU core數量越多,越可以快速地執行完分配給本身的全部task線程。

  參數調優建議:Executor的CPU core數量設置爲2~4個較爲合適。一樣得根據不一樣部門的資源隊列來定,能夠看看本身的資源隊列的最大CPU core限制是多少,再依據設置的Executor數量,來決定每一個Executor進程能夠分配到幾個CPU core。一樣建議,若是是跟他人共享這個隊列,那麼num-executors * executor-cores不要超過隊列總CPU core的1/3~1/2左右比較合適,也是避免影響其餘同窗的做業運行。
 
driver-memory


  參數說明:該參數用於設置Driver進程的內存。

  參數調優建議:Driver的內存一般來講不設置,或者設置1G左右應該就夠了。惟一須要注意的一點是,若是須要使用collect算子將RDD的數據所有拉取到Driver上進行處理,那麼必須確保Driver的內存足夠大,不然會出現OOM內存溢出的問題。
 jvm

spark.default.parallelism

  參數說明:該參數用於設置每一個stage的默認task數量。這個參數極爲重要,若是不設置可能會直接影響你的Spark做業性能。

  參數調優建議:Spark做業的默認task數量爲500~1000個較爲合適。不少同窗常犯的一個錯誤就是不去設置這個參數,那麼此時就會致使Spark本身根據底層HDFS的block數量來設置task的數量,默認是一個HDFS block對應一個task。一般來講,Spark默認設置的數量是偏少的(好比就幾十個task),若是task數量偏少的話,就會致使你前面設置好的Executor的參數都前功盡棄。試想一下,不管你的Executor進程有多少個,內存和CPU有多大,可是task只有1個或者10個,那麼90%的Executor進程可能根本就沒有task執行,也就是白白浪費了資源!所以Spark官網建議的設置原則是,設置該參數爲num-executors * executor-cores的2~3倍較爲合適,好比Executor的總CPU core數量爲300個,那麼設置1000個task是能夠的,此時能夠充分地利用Spark集羣的資源。
 

spark.storage.memoryFraction


  參數說明:該參數用於設置RDD持久化數據在Executor內存中能佔的比例,默認是0.6。也就是說,默認Executor 60%的內存,能夠用來保存持久化的RDD數據。根據你選擇的不一樣的持久化策略,若是內存不夠時,可能數據就不會持久化,或者數據會寫入磁盤。

  參數調優建議:若是Spark做業中,有較多的RDD持久化操做,該參數的值能夠適當提升一些,保證持久化的數據可以容納在內存中。避免內存不夠緩存全部的數據,致使數據只能寫入磁盤中,下降了性能。可是若是Spark做業中的shuffle類操做比較多,而持久化操做比較少,那麼這個參數的值適當下降一些比較合適。此外,若是發現做業因爲頻繁的gc致使運行緩慢(經過spark web ui能夠觀察到做業的gc耗時),意味着task執行用戶代碼的內存不夠用,那麼一樣建議調低這個參數的值。
 

spark.shuffle.memoryFraction


  參數說明:該參數用於設置shuffle過程當中一個task拉取到上個stage的task的輸出後,進行聚合操做時可以使用的Executor內存的比例,默認是0.2。也就是說,Executor默認只有20%的內存用來進行該操做。shuffle操做在進行聚合時,若是發現使用的內存超出了這個20%的限制,那麼多餘的數據就會溢寫到磁盤文件中去,此時就會極大地下降性能。

  參數調優建議:若是Spark做業中的RDD持久化操做較少,shuffle操做較多時,建議下降持久化操做的內存佔比,提升shuffle操做的內存佔比比例,避免shuffle過程當中數據過多時內存不夠用,必須溢寫到磁盤上,下降了性能。此外,若是發現做業因爲頻繁的gc致使運行緩慢,意味着task執行用戶代碼的內存不夠用,那麼一樣建議調低這個參數的值
資源參數的調優,沒有一個固定的值,須要同窗們根據本身的實際狀況(包括Spark做業中的shuffle操做數量、RDD持久化操做數量以及spark web ui中顯示的做業gc狀況),同時參考本篇文章中給出的原理以及調優建議,合理地設置上述參數。

 

Executor的內存主要分爲三塊:第一塊是讓task執行咱們本身編寫的代碼時使用,默認是佔Executor總內存的20%;第二塊是讓task經過shuffle過程拉取了上一個stage的task的輸出後,進行聚合等操做時使用,默認也是佔Executor總內存的20%;第三塊是讓RDD持久化時使用,默認佔Executor總內存的60%。



提交spark :

#!/bin/bash
source /etc/profile
export LANG=zh_CN.UTF-8


year=`date -d "yesterday" +%Y`
month=`date -d "yesterday" +%m`
day=`date -d "yesterday" +%d`


SPARK_MASTER=spark://10.110.79.2:7077
SPARK_DEPLOY="--master yarn --deploy-mode cluster"
#SPARK_RESOURCE="--executor-memory 45G --executor-cores 4"
SPARK_RESOURCE="--num-executors 4"
SCRIPT_PATH="/opt/shell/log"
LOG_PATH="/app/log"
cluster1="hdfs://logcluster2"
jarname=/opt/shell/log/lib/leagsoft-1.0-SNAPSHOT-jar-with-dependencies.jar
inputDir=/leagsoft
outputMysqlDir=/model/leagsoft_user/mysql
outputESDir=/model/leagsoft_user/es
LOG_FILE="${LOG_PATH}/module/leagsoft/user/log_2hdfs_`date +%Y%m%d`"


echo "#spark leagsoftUserInfo2hdfsAndES `date '+%Y-%m-%d %H:%M:%S'`" >> ${LOG_FILE}


hadoop fs -test -e "${inputDir}/${year}/${month}/${day}"
if [ $? -eq 0 ] ; then


spark-submit ${SPARK_DEPLOY}  ${SPARK_RESOURCE} \
--queue infrastructure \
--executor-memory 10G \
--executor-cores 2  \             
--class  com.express.sf.leagsoft.leagsoft_user \
--conf spark.default.parallelism=16 \
--conf spark.shuffle.consolidateFiles=true \
--conf "spark.es.nodes=10.110.77.48" \
--conf "spark.es.port=9200" \
--conf "spark.es.index.auto.create=true" \
--conf "spark.es.batch.size.entries=50000" \
--conf spark.kryoserializer.buffer.max=64mb \
--conf spark.kryoserializer.buffer=256 \
 "${jarname}" \
${cluster1}${inputDir}/$year/$month/$day  ${cluster1}${outputESDir}/$year/$month/$day ${cluster1}${outputMysqlDir}/$year/$month/$day


ret=$?
fi

echo "#結束 `date '+%Y-%m-%d %H:%M:%S'`" >> ${LOG_FILE}
exit $ret



注意,有些參數是和運行模式有關係的,好比  total-executor-cores  只對standalone和Mesos模式起做用,對cluster模式不起做用

參數解釋

--queue infrastructure \

 

提交到yarn 上使用的資源隊列,默認是default,這裏使用infrastructure ,資源對列在hadoop中設置,詳見http://blog.csdn.net/cottonduke/article/details/60576545--------------------- 做者:YiRan_Zhao 來源:CSDN 原文:https://blog.csdn.net/yiran_zhao/article/details/81089248 版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索