我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

原文来我的公众号: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过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能)

 

Randy 微信扫描二维码,关注我的公众号 我的个人网站:http://www.itrensheng.com/

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

原文来我的公众号:Spark性能优化指南——初级篇一. Spark作业原理我们使用spark-submit提交一个Spark作业之后,这个作业就会启动一个对应的Driver进程。该进程是向集群管理器(Yarn,K8s)申请运行Spark作业需要使用的资源,这里
Spark性能优化指南——初级篇
2021-09-09

ASP.NET Core 性能优化指南

ASP.NET Core的性能优化是一个持续的过程,需要不断地对应用程序进行监控、分析和调整。

一篇全面而且透彻的RabbitMQ性能优化指南

这篇文章,我们将会对ack底层的delivery tag机制进行更加深入的分析,让大家理解的更加透彻一些。

PHP 性能优化:数据库优化指南

PHP 性能优化:数据库优化指南数据库的性能对 PHP 应用程序的整体性能至关重要。通过实施以下最佳实践,可以显著优化数据库性能:1. 索引优化创建必要的索引以加速查询。确保索引列包含 SELECT 查询中最常用的列。使用组合索引以
PHP 性能优化:数据库优化指南
2024-05-11

PHP 函数性能优化指南

为了优化 php 函数性能,建议:避免不必要的函数调用。缓存函数调用结果。利用 php 内置扩展。避免传递大数组,可考虑使用引用参数或 json 字符串。通过应用这些最佳实践,可以显著提高函数调用的速度,从而提升应用程序的整体性能。PHP
PHP 函数性能优化指南
2024-04-11

性能优化指南:性能优化的一般性原则与方法

【本文转自博客园 作者:xybaby 原文链接:https://www.cnblogs.com/xybaby/p/9055734.html】作为一个程序员,性能优化是常有的事情,不管是桌面应用还是web应用,不管是前端还是后端,不管是单点应
2023-06-05

前端性能优化 — 保姆级 Performance 工具使用指南

说到前端性能,就少不了性能分析的利器 —— Performance ;我想各位前端小伙伴,在使用 Chrome 浏览器 DevTool 时或多或少都有留意到这个面板吧?

数据库查询性能优化指南

数据库查询性能优化一直是程序员绕不开的话题,当我们遇到业务刷新报表缓慢或者查询获取结果延迟太大,可以采用提问法来思考如何进行优化。

PHP 性能优化:服务器配置指南

通过优化服务器配置可以提升 php 应用程序性能,具体措施包括:1. 启用 opcache 以缓存编译过的脚本字节码;2. 优化 php-fpm 设置以提高资源利用率并减少延迟;3. 启用输出压缩以降低带宽消耗;4. 使用缓存以减少对数据库
PHP 性能优化:服务器配置指南
2024-05-10

Web页面全链路性能优化指南

本文会对web页面的全链路进行完整的讲解并针对每一步找到能做的性能优化点,本文的目标是极致的性能优化。
web优化性能2024-12-02

优化云性能:云性能测试及其优势的深入指南

本文解释了云性能测试的类型、不同形式、好处、好处和常用工具。

PHP 应用程序性能优化之数据库优化指南

PHP 应用程序性能优化之数据库优化指南前言数据库是 PHP 应用程序的重要组成部分,它的性能直接影响应用程序的整体性能。优化数据库可以显著提高应用程序的速度和响应能力。本文将提供详细的指南,帮助您优化 PHP 应用程序中数据库的性能。
PHP 应用程序性能优化之数据库优化指南
2024-05-01

PHP Web应用程序的性能优化指南

为了提高php web应用程序的性能,可以使用以下优化技巧:使用对象/页面缓存存储经常访问的数据,避免数据库检索。优化数据库查询、选择合适的数据库类型以及减少http请求。优化php设置、使用加速器以及实现负载平衡。使用性能分析工具、启用日
PHP Web应用程序的性能优化指南
2024-05-09

PHP 微服务容器化性能调优指南

为优化容器化 php 微服务性能,执行以下步骤:镜像优化:使用多阶段构建、移交 php 可执行文件和启用 opcache。资源分配:调整内存和 cpu 限制,以防止资源不足。网络优化:启用 host 网络和 http/2,以提高通信效率。应
PHP 微服务容器化性能调优指南
2024-05-08

PHP电商系统开发指南性能优化

在 php 电商系统中,性能优化至关重要,可通过以下技术提升性能:使用缓存,如 psr-16 兼容的适配器,以减少数据库查询和页面加载时间。优化数据库查询,如使用索引、条件索引和限制性子句,以提高查询效率。减少不必要的 http 请求,如合
PHP电商系统开发指南性能优化
2024-05-21

编程热搜

目录