【场景】

  Spark提交作业job的时候要指定该job可以使用的CPU、内存等资源参数,生产环境中,任务资源分配不足会导致该job执行中断、失败等问题,所以对Spark的job资源参数分配调优非常重要。

  spark提交作业,yarn-cluster模式示例:

  ./bin/spark-submit\

  --class com.ww.rdd.wordcount \

  --master yarn \

  --deploy-mode cluster \ 
  --executor-memory 4G \
  --num-executors 50 \

  --driver-memory 1G \

  --conf spark.default.parallelism=1000 \

  --conf spark.memory.fraction=0.75 \

  --conf spark.memory.storageFraction=0.5 \

  /home/spark/wordcount.jar \
  1000  #入参

【参数】

num-executors

  参数说明:该参数用于设置每个Spark作业总共要用多少个Executor进程来执行。例如Driver向YARN集群管理器申请资源时,YARN集群管理器会尽可能按照该配置在集群的各个worker节点上启动相应数量的Executor进程。这个参数非常重要,如果不设置的话,Spark默认只启动少量的Executor进程,意味着该Spark作业并行度不足,如果作业计算多、数据很大,会导致运行速度非常慢甚至资源不足,异常中断,无法完成等。

  调优建议num-executors设置太少或太多的Executor进程都不好。设置的太少,无法充分利用集群资源;设置的太多的话,大部分队列可能无法给予充分的资源。生产环境摸索的经验是每个Spark作业的运行一般设置50~100个左右的Executor进程比较合适。

executor-memory

  参数说明:该参数用于设置每个Executor进程的内存。Executor内存的大小,很多时候直接决定了Spark作业的性能,而且跟常见的JVM OOM异常,也有直接的关系。

  调优建议:如果内存资源充足的前提下,一般每个job给每个Executor进程的内存设置4G~8G较为合适,供参考。具体的设置还得根据Spark集群可以占用的内存资源总量来定。num-executors * executor-memory,是本Spark作业申请到的内存资源量,这个值是不能超过Spark集群可以占用的内存资源总量的。

executor-cores

  参数说明:该参数用于设置每个Executor进程的CPU cores数量。这个参数决定了每个Executor进程并行执行task线程的能力。因为每个CPU core同一时间只能执行一个task线程,因此每个Executor进程的CPU cores数量越多,越能够快速地并行执行完分配给自己的所有task线程。

  调优建议:如果CPU核数资源充足的前提下,一般每个job给每个Executor的CPU core数量设置为2~4个较为合适,供参考。具体的设置还得根据Spark集群可以占用的CPU core数量资源总量来定。num-executors * executor-cores,是本Spark作业申请到的CPU core数量,这个值是不能超过Spark集群可以占用的CPU core数量资源总量的。

driver-memory

  参数说明:该参数用于设置Driver进程的内存。

  调优建议Driver的内存通常来说不设置,或者设置1G左右应该就够了。唯一需要注意的一点是,如果需要使用collect算子将RDD的数据全部拉取到Driver上进行处理,那么必须确保Driver的内存足够大,否则会出现OOM内存溢出的问题。

spark.default.parallelism

  参数说明该参数用于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会直接影响Spark作业性能。

  调优建议如果不设置这个参数,会导致Spark自己根据底层HDFS的block数量来设置task的数量,默认是一个HDFS block对应一个task。通常来说,Spark默认设置的数量是偏少的(比如就几十个task),如果task数量偏少的话,就会导致你前面设置好的Executor的参数都前功尽弃。试想一下,无论Executor进程有多少个,内存和CPU资源分配有多充足,但是task只有1个或者10个,那么90%的Executor进程可能根本就没有task执行,也就是白白浪费了宝贵的内存和CPU资源!因此Spark官网建议的设置原则是,设置该参数为num-executors * executor-cores的2~3倍较为合适,例如,Executor的总CPU core数量为300个,那么设置1000个task是可以的,此时可以充分地利用Spark集群的资源,也就是说,1个cpu core并发跑2~3个task是较为合适的。

spark.memory.fractionspark.memory.storageFraction

  参数说明和调优建议:参见我的另外一篇文章  【Spark调优】内存模型与参数调优

  下一篇:【Spark调优】Broadcast广播变量

  上一篇:【Spark调优】Kryo序列化

【Spark调优】提交job资源参数调优的更多相关文章

  1. spark 资源参数调优

    资源参数调优 了解完了Spark作业运行的基本原理之后,对资源相关的参数就容易理解了.所谓的Spark资源参数调优,其实主要就是对Spark运行过程中各个使用资源的地方,通过调节各种参数,来优化资源使 ...

  2. 【Spark篇】---Spark中内存管理和Shuffle参数调优

    一.前述 Spark内存管理 Spark执行应用程序时,Spark集群会启动Driver和Executor两种JVM进程,Driver负责创建SparkContext上下文,提交任务,task的分发等 ...

  3. hive 调优(二)参数调优汇总

    在hive调优(一) 中说了一些常见的调优,但是觉得参数涉及不多,补充如下 1.设置合理solt数 mapred.tasktracker.map.tasks.maximum 每个tasktracker ...

  4. 【深度学习篇】--神经网络中的调优一,超参数调优和Early_Stopping

    一.前述 调优对于模型训练速度,准确率方面至关重要,所以本文对神经网络中的调优做一个总结. 二.神经网络超参数调优 1.适当调整隐藏层数对于许多问题,你可以开始只用一个隐藏层,就可以获得不错的结果,比 ...

  5. spark submit参数调优

    在开发完Spark作业之后,就该为作业配置合适的资源了.Spark的资源参数,基本都可以在spark-submit命令中作为参数设置.很多Spark初学者,通常不知道该设置哪些必要的参数,以及如何设置 ...

  6. Spark Shuffle原理、Shuffle操作问题解决和参数调优

    摘要: 1 shuffle原理 1.1 mapreduce的shuffle原理 1.1.1 map task端操作 1.1.2 reduce task端操作 1.2 spark现在的SortShuff ...

  7. 1,Spark参数调优

    Spark调优 目录 Spark调优 一.代码规范 1.1 避免创建重复RDD 1.2 尽量复用同一个RDD 1.3 多次使用的RDD要持久化 1.4 使用高性能算子 1.5 好习惯 二.参数调优 资 ...

  8. spark参数调优

    摘要 1.num-executors 2.executor-memory 3.executor-cores 4.driver-memory 5.spark.default.parallelism 6. ...

  9. [Spark性能调优] 第一章:性能调优的本质、Spark资源使用原理和调优要点分析

    本課主題 大数据性能调优的本质 Spark 性能调优要点分析 Spark 资源使用原理流程 Spark 资源调优最佳实战 Spark 更高性能的算子 引言 我们谈大数据性能调优,到底在谈什么,它的本质 ...

随机推荐

  1. C#中的 隐式与显式接口实现

    在C#中,正常情况下使用接口的实现使用的是 隐式接口实现. public interface IParent1 { void Medthod(); } public class Child : IPa ...

  2. DDD - 概述 - 聚合 - 限界上下文 (四)

    最重要的一句话 DDD的所有有相关理论中,只有一句是至关重要的,但是也是最容易被忽略和最难做到的,抛弃传统的设计方式(思路)的思想,这句话起了决定性的作用,但是99%的人都忽略了或者在开始无法正视或理 ...

  3. 机器A定时发文件给机器B-FTP实现

    机器A发文件的虚拟机 机器B收文件的虚拟机 机器A: 确认linux安装了ftp包,能启用ftp命令 定时器使用的是crontab 定时器设置步骤: 1.进入root用户 2.service cron ...

  4. 重新拾取:TFS2017钉钉机器人源代码签入通知

    http://www.cnblogs.com/79039535/p/9316791.html 现在很多公司办公都使用钉钉打卡签到,于是鉴于公司也使用钉钉就打算用钉钉来做一个源代码签入通知. 首先先去打 ...

  5. day22.面向对象初识

    1.面向对象引入 先来创建一个小游戏:人狗大战 # 定义一个狗 def Gog(name,blood,aggr,kind): dog = { 'name':name, 'blood':blood, ' ...

  6. Codeforces 581F Zublicanes and Mumocrates 树形dp

    Zublicanes and Mumocrates dp[ i ][ j ][ k ] 表示 以 i 为根的子树, 占领 i 的 是 j 并且第一个人占了 i 子树的 k 个叶子节点的最小值. 然后随 ...

  7. symfony小练习-表白墙

    过上一个博客系统以及对官方示例程序的基本学习,目前对symfony的各个组件有了一定的学习,学校布置了一个表白墙任务,这里就这个任务的完成进行记录 ...........2019.3.20.22.31 ...

  8. avue的小白之路

    经过几天的看实例,我稍稍了解到了avue,写这个博客主要是最近学习avue的一个总结.. avue是基于vue与element ui的一个框架,强烈建议等了解这其中道理在学习avue会事半功倍:这是我 ...

  9. Annotation(注解)

    注解相当于一种标记,在程序中加入注解就相当于为程序打上某种标记,没有加,则表示没有任何标记,以后,javac编译器.开发工具和其它程序可以通过反射来了解你的类及各种元素上有无何种标记,看你的程序有什么 ...

  10. springboot添加多数据源连接池并配置Mybatis

    springboot添加多数据源连接池并配置Mybatis 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9190226.html May 12, 2018  ...