Spark 性能调优--资源调优

资源调优

在开发完Spark作业之后,就该为作业配置合适的资源了。Spark的资源参数,基本都可以在spark-submit命令中作为参数设置

Spark作业基本运行原理

Spark作业基本运行原理
  1. spark-submit提交一个Spark作业之后,这个作业就会启动一个对应的Driver进程
  2. 根据你使用的部署模式(deploy-mode:client/cluster)不同,Driver进程可能在本地启动,也可能在集群中某个工作节点上启动
  3. Driver进程本身会根据我们设置的参数,占有一定数量的内存和CPU Core
  4. Driver进程要做的第一件事情,就是向集群管理器(可以是Spark Standalone集群,也可以是YARN)申请运行Spark作业需要使用的资源。资源指的就是Executor进程。在各个工作节点上,启动一定数量的Executor进程,每个Executor进程都占有一定数量的内存和CPU Core
  5. 在申请到了作业执行所需的资源之后,Driver进程就会开始调度和执行我们编写的作业代码了
  6. Driver进程会将我们编写的Spark作业代码分拆为多个Stage,每个Stage执行一部分代码片段,并为每个Stage创建一批Task,然后将这些Task分配到各个Executor进程中执行
  7. Task是最小的计算单元,负责执行一模一样的计算逻辑(也就是我们编写的某个代码片段),只是每个Task处理的数据不同而已。一个Stage的所有Task都执行完毕之后,会在各个节点本地的磁盘文件中写入计算中间结果,然后Driver就会调度运行下一个Stage。下一个Stage的Task的输入数据就是上一个Stage输出的中间结果
  8. Spark是根据Shuffle类算子来进行Stage的划分,Shuffle算子执行之前的代码会被划分为一个Stage

Executor的内存主要分为三块
- 第一块是让task执行我们自己编写的代码时使用,默认是占Executor总内存的20%
- 第二块是让Task通过Shuffle过程拉取了上一个Stage的Task的输出后,进行聚合等操作时使用,默认也是占Executor总内存的20%
- 第三块是让RDD持久化时使用,默认占Executor总内存的60%
参考Spark内存架构

Task的执行速度是跟每个Executor进程的CPU Core数量有直接关系的。一个CPU Core同一时间只能执行一个线程。而每个Executor进程上分配到的多个Task,都是以每个Task一条线程的方式,多线程并发运行的。如果CPU Core数量比较充足,而且分配到的Task数量比较合理,那么通常来说,可以比较快速和高效地执行完这些Task线程


资源参数调优

num-executors
设置Spark作业总共要用多少个Executor进程来执行
Driver在向YARN集群管理器申请资源时,YARN集群管理器会尽可能按照你的设置来在集群的各个工作节点上,启动相应数量的Executor进程

每个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

executor-cores
设置每个Executor进程的CPU core数量
决定了每个Executor进程并行执行task线程的能力

数量设置为2~4个较为合适,依据资源队列的最大CPU Core限制是多少,再依据设置的Executor数量,来决定每个Executor进程可以分配到几个CPU Core

driver-memory
设置Driver进程的内存
Driver的内存通常来说不设置,或者设置1G左右应该就够了

如果需要使用 collect 算子将RDD的数据全部拉取到Driver上进行处理,那么必须确保Driver的内存足够大,否则会出现OOM内存溢出的问题

spark.default.parallelism
设置每个stage的默认task数量
不去设置这个参数,那么Spark根据底层HDFS的block数量来设置task的数量,默认是一个HDFS block对应一个task,通常来说,Spark默认设置的数量是偏少的

设置该参数为num-executors * executor-cores的2~3倍较为合适
如果task数量偏少的话,Executor进程可能根本就没有task执行,也就是白白浪费了资源

spark.storage.memoryFraction
设置RDD持久化数据在Executor内存中能占的比例,默认是0.6
根据你选择的不同的持久化策略,如果内存不够时,可能数据就不会持久化,或者数据会写入磁盘

如果Spark作业中,有较多的RDD持久化操作,该参数的值可以适当提高一些
如果Spark作业中的Shuffle类操作比较多,而持久化操作比较少,那么这个参数的值适当降低一些比较合适
如果发现作业由于频繁的GC导致运行缓慢(通过Spark WebUI可以观察到作业的GC耗时),意味着Task执行用户代码的内存不够用,那么同样建议调低这个参数的值

spark.shuffle.memoryFraction
设置Shuffle过程中一个task拉取到上个Stage的Task的输出后,进行聚合操作时能够使用的Executor内存的比例,默认是0.2
Shuffle操作在进行聚合时,如果发现使用的内存超出了这个20%的限制,那么多余的数据就会溢写到磁盘文件中去,此时就会极大地降低性能

如果Spark作业中的RDD持久化操作较少,Shuffle操作较多时,建议降低持久化操作的内存占比,提高Shuffle操作的内存占比比例
如果发现作业由于频繁的GC导致运行缓慢,意味着Task执行用户代码的内存不够用,那么同样建议调低这个参数的值



示例

#args : 
/usr/local/spark/bin/spark-submit --class Process \
--master yarn-cluster \
--name Process \
--queue fetech \
--num-executors 20 \
--driver-memory 5g \
--executor-memory 4g \
--executor-cores 2 \
--conf spark.default.parallelism=500 \
--conf spark.storage.memoryFraction=0.5 \
/process.jar $1 $2 $3 $4
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,783评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,396评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,834评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,036评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,035评论 5 362
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,242评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,727评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,376评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,415评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,463评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,140评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,734评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,809评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,028评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,521评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,119评论 2 341

推荐阅读更多精彩内容

  • 调优之前是将功能实现...然后算法优化,设计优化,再是spark调优!,需得一步一步来,不得直接越过,直接调优! ...
    终生学习丶阅读 5,464评论 0 12
  • 场景 数据倾斜解决方案与shuffle类性能调优 分析 数据倾斜 有的时候,我们可能会遇到大数据计算中一个最棘手的...
    过江小卒阅读 3,409评论 0 9
  • 1 前言 在大数据计算领域,Spark已经成为了越来越流行、越来越受欢迎的计算平台之一。Spark的功能涵盖了大数...
    wisfern阅读 2,433评论 3 39
  • Spark的性能调优实际上是由很多部分组成的,不是调节几个参数就可以立竿见影提升作业性能的。我们需要根据不同的业务...
    东皇Amrzs阅读 1,616评论 0 17
  • 1 数据倾斜调优 1.1 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spar...
    wisfern阅读 2,930评论 0 23