【场景】

  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. 基于 EntityFramework、Autofac 的 UnitOfWork 框架(一)

    之前公司项目参考 NopCommerce 开发了一套系统,但是不支持 UnitOfWork,最近想开发新的项目,所以就基于原有的基础上又添加 UnitOfWork 支持,由于目前正在逐步完善中,所以可 ...

  2. Extjs4.2 GridPanel中显示单选按钮

    效果:如上图. 代码:其中需要显示单选按钮的列 { dataIndex: 'FeeModel', text: '收費模式', flex: 1, align: 'left', radioValues: ...

  3. 利用kibana插件对Elasticsearch进行映射

    映射(mapping) 映射是创建索引的时候,可以预先定义字段的类型以及相关属性 Elasticsearch会根据JSON源数据的基础类型去猜测你想要的字段映射.将输入的数据变成可搜索的索引项.Map ...

  4. yum的一些命令使用方法

    yum 选项 参数 yum命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载RPM包并且安装 ...

  5. tensorflow 使用 4 非线性回归

    # 输入一个 x 会计算出 y 值 y 是预测值,如果与 真的 y 值(y_data)接近就成功了 import tensorflow as tf import numpy as np # py 的画 ...

  6. Angular 2项目的环境配置和项目搭建

    AngularJS2 发布于2016年9月份,它是基于ES6来开发的. AngularJS2 是一款开源JavaScript库,由Google维护,用来协助单一页面应用程序运行.AngularJS2 ...

  7. [HACK] docker runtime 挂载宿主机目录

    网上看到的很多所谓的挂载都是容器创建时期的挂载,而且参数都不清不楚,整理如下(--name别名自己加): docker run -v /src/path:/dest/path:rw ${IMAGE} ...

  8. Golang实现requests库

    Golang实现requests库 简单的封装下,方便使用,像python的requests库一样. Github地址 Github 支持 GET.POST.PUT.DELETE applicatio ...

  9. Java语法细节 - 可见性

    目录 JAVA访问和修饰符的关系一览表 JAVA访问和修饰符的关系一览表 Modifier Class Package Subclass World public Y Y Y Y protected ...

  10. AWS EC2实例Linux系统创建root用户并更改为root用户登录

    对于刚创建AWS EC2实例,或者经常使用AWS 实例的小伙伴们来说,刚创建的EC2实例是没有ROOT权限的,因此不能直接使用ROOT用户去登陆实例,也无法获取到root权限.一般情况下,EC2实例默 ...