Spark性能优化指南——初级篇

一. Spark作业原理

我们使用spark-submit提交一个Spark作业之后,这个作业就会启动一个对应的Driver进程。该进程是向集群管理器(Yarn,K8s)申请运行Spark作业需要使用的资源,这里的资源指的就是Executor进程。
YARN集群管理器会根据我们为Spark作业设置的资源参数,在各个工作节点上,启动一定数量的Executor进程,每个Executor进程都占有一定数量的内存和CPU core。
在申请到了作业执行所需的资源之后,Driver进程就会开始调度和执行我们编写的作业代码了。
Driver进程会将我们编写的Spark作业代码分拆为多个stage,每个stage执行一部分代码片段,并为每个stage创建一批task,然后将这些task分配到各个Executor进程中执行。
task是最小的计算单元,负责执行一模一样的计算逻辑(也就是我们自己编写的某个代码片段),只是每个task处理的数据不同而已。
一个stage的所有task都执行完毕之后,会在各个节点本地的磁盘文件中写入计算中间结果,然后Driver就会调度运行下一个stage。
下一个stage的task的输入数据就是上一个stage输出的中间结果。如此循环往复,直到将我们自己编写的代码逻辑全部执行完,并且计算完所有的数据,得到我们想要的结果为止。
Spark是根据shuffle类算子来进行stage的划分。如果我们的代码中执行了某个shuffle类算子(比如reduceByKey、join等),那么就会在该算子处,划分出一个stage界限来。
可以大致理解为,shuffle算子执行之前的代码会被划分为一个stage,shuffle算子执行以及之后的代码会被划分为下一个stage。
 
因此一个stage刚开始执行的时候,它的每个task可能都会从上一个stage的task所在的节点,去通过网络传输拉取需要自己处理的所有key,然后对拉取到的所有相同的key使用我们自己编写的算子函数执行聚合操作(比如reduceByKey()算子接收的函数)。这个过程就是shuffle。
当我们在代码中执行了cache/persist等持久化操作时,根据我们选择的持久化级别的不同,每个task计算出来的数据也会保存到Executor进程的内存或者所在节点的磁盘文件中。
 
因此Executor的内存主要分为三块:
第一块是让task执行我们自己编写的代码时使用,默认是占Executor总内存的20%;
第二块是让task通过shuffle过程拉取了上一个stage的task的输出后,进行聚合等操作时使用,默认也是占Executor总内存的20%;
第三块是让RDD持久化时使用,默认占Executor总内存的60%。
 
task的执行速度是跟每个Executor进程的CPU core数量有直接关系的。一个CPU core同一时间只能执行一个线程。而每个Executor进程上分配到的多个task,都是以每个task一条线程的方式,多线程并发运行的。
如果CPU core数量比较充足,而且分配到的task数量比较合理,那么通常来说,可以比较快速和高效地执行完这些task线程。
 

二.核心调优参数

num-executors:

该参数用于设置Spark作业总共要用多少个Executor进程来执行。Driver在向YARN集群管理器申请资源时,YARN集群管理器会尽可能按照你的设置来在集群的各个工作节点上,启动相应数量的Executor进程。这个参数非常之重要,如果不设置的话,默认只会给你启动少量的Executor进程,此时你的Spark作业的运行速度是非常慢的。(建议50~100个左右的Executor进程)
 

executor-memory:

该参数用于设置每个Executor进程的内存。Executor内存的大小,很多时候直接决定了Spark作业的性能,而且跟常见的JVM OOM异常,也有直接的关联。(根据作业大小不同,建议设置4G~8G,num-executors乘以executor-memory,是不能超过队列的最大内存量的)
 

executor-cores:

该参数用于设置每个Executor进程的CPU core数量。这个参数决定了每个Executor进程并行执行task线程的能力。因为每个CPU core同一时间只能执行一个task线程,因此每个Executor进程的CPU core数量越多,越能够快速地执行完分配给自己的所有task线程。(建议设置为2~4个,且num-executors * executor-cores不要超过队列总CPU core的1/3~1/2)
 

driver-memory:

该参数用于设置Driver进程的内存(建议设置512M到1G)。
 

spark.default.parallelism:

该参数用于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会直接影响你的Spark作业性能。(建议为50~500左右,缺省情况下Spark自己根据底层HDFS的block数量来设置task的数量,默认是一个HDFS block对应一个task。Spark官网建议设置该参数为num-executors * executor-cores的2~3倍较为合适)
 

spark.storage.memoryFraction:

该参数用于设置RDD持久化数据在Executor内存中能占的比例,默认是0.6(原则上是尽可能保证数据能够全部在内存中,但如果发现作业发生频繁的GC,就该考虑是否调小)
 

spark.shuffle.memoryFraction:

该参数用于设置shuffle过程中一个task拉取到上个stage的task的输出后,进行聚合操作时能够使用的Executor内存的比例,默认是0.2。也就是说,Executor默认只有20%的内存用来进行该操作。shuffle操作在进行聚合时,如果发现使用的内存超出了这个20%的限制,那么多余的数据就会溢写到磁盘文件中去,此时就会极大地降低性能。(shuffle操作较多时,建议降低持久化操作的内存占比,提高shuffle操作的内存占比比例,避免shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能)
(0)

相关推荐

  • Spark调优指南

    Spark相关问题Spark比MR快的原因?1) Spark的计算结果可以放入内存,支持基于内存的迭代,MR不支持.2) Spark有DAG有向无环图,可以实现pipeline的计算模式.3) 资源调 ...

  • Spark的两种核心Shuffle详解(建议收藏)

    在 MapReduce 框架中, Shuffle 阶段是连接 Map 与 Reduce 之间的桥梁, Map 阶段通过 Shuffle 过程将数据输出到 Reduce 阶段中.由于 Shuffle 涉 ...

  • 【大数据哔哔集20210108】Spark Shuffle 和 Hadoop Shuffle有什么异同?

    Shuffle的本意是洗牌.混洗的意思,把一组有规则的数据尽量打乱成无规则的数据.而在MapReduce中,Shuffle更像是洗牌的逆过程,指的是将map端的无规则输出按指定的规则"打乱& ...

  • 大数据开发之Spark 基础入门学习

    集群相关 Cluster Manager指的是在集群上获取资源的外部服务,为每个spark application在集群中调度和分配资源的组件,目前有三种类型: Standalone:Spark 原生 ...

  • SparkShuffle机制

    在早期版本的Spark中,shuffle过程没有磁盘读写操作,是纯内存操作,后来发现效率较低,且极易引发OOME,较新版本的Shuffle操作都加入了磁盘读写进行了改进. 1.未经优化的HashShu ...

  • Spark架构与运行流程

    Spark架构与运行流程

  • 提高win10电脑性能终极指南,19种优化技巧,招招致胜

    Windows 10操作系统虽然功能强大,但使用久了,由于许多因素(包括但不限于兼容性问题.错误.病毒或其他形式的恶意软件),导致计算机性能会降低,甚至是硬件故障.出现这样的问题,并不一定意味着需要更 ...

  • 网站前端性能优化终极指南

    image.png 性能黄金法则:80- 90%的终端用户响应时间花在下载前端,即页面上的所有组件:img.stylesheets.scripts等 1.缩小HTML.CSS和JavaScript 减 ...

  • 外汇交易初级篇——谨以此文献给准备踏入外汇交易的朋友

    大家好,我回来了. 之前休息了一段时间,文章也是一直没有更新,只更新一些基础的做单想法和操盘思路. 这段时间有很多人私信问我一些外汇的相关问题,都是一些刚入行的基础问题,正好今天有空所以借着这篇文章普 ...

  • 干货:C 的性能优化

    前言 性能优化不管是从方法论还是从实践上都有很多东西,从 C++ 语言本身入手,介绍一些性能优化的方法,希望能做到简洁实用. 实例1 在开始本文的内容之前,让我们看段小程序: // 获取一个整数对应1 ...

  • Android 性能优化必知必会 · Android Performance

    做了这么久性能相关的工作,也接触了不少模块,说实话要做好性能这一块,真心不容易.为什么这么说? 是因为需要接触的知识实在是太多了, Android 是一个整体,牵一发而动全身,不是说只懂一个模块就可以 ...

  • 【干货】Python和ArcGIS自动化制图完全指南 总集篇

    前言:<Python和ArcGIS自动化制图完全指南>该系列包括前言共五章,内容多且详细.总集篇带大家快速梳理掌握各章节的要点,同时解答之前收集到的一些问题...<前言篇> 查 ...

  • 建筑结构如何做成本优化,这篇文章全讲清了

    如同雕塑的骨架,建筑的骨架就是我们常说的结构部分,结构的安全是首要的,在保证安全的前提下,消费者不会为更多的结构投入买单. 这也就是为什么从来没听哪家房企在售楼时宣传"我们产品的钢筋含量高& ...

  • Python和ArcGIS自动化制图完全指南 总集篇

    前言:<Python和ArcGIS自动化制图完全指南>该系列包括前言共五章,内容多且详细.总集篇带大家快速梳理掌握各章节的要点,同时解答之前收集到的一些问题...<前言篇> 查 ...

  • 浅谈面向客户端的性能优化

    有朋友通过<智能音箱场景下的性能优化>一文找到了我,既然智能音箱的性能优化相当于一个超集,那么对其的一个子集--客户端系统如何进行性能优化呢? 反正隔离在家,不妨对客户端的性能优化梳理一下 ...