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 版权声明:本文为博主原创文章,转载请附上博文连接!

相关文章
相关标签/搜索