大数据技术之Spark优化

embedded/2025/3/19 4:33:10/

第 1 章 Spark 性能调优

问:spark 优化

第一句:我们可以从性能,算子,shuffle 过程以及 jvm 四个方面展开优化。

1 常规性能调优

1.1 常规性能调优一:最优资源配置

Spark 性能调优的第一步,就是为任务分配更多的资源,在一定范围内,增加资源的分配与性能的提升是成正比的,实现了最优的资源配置后,在此基础上再考虑进行后面论述的性能调优策略。

资源的分配在使用脚本提交 Spark 任务时进行指定,标准的 Spark 任务提交脚本如下所示:

bin/spark-submit \
--class com.bigdata.spark.Analysis \
--master yarn
--deploy-mode cluster
--num-executors 80 \
--driver-memory 6g \
--executor-memory 6g \
--executor-核s 3 \
/usr/opt/modules/spark/jar/spark.jar \

结合项目,每一个任务都需要分配资源,这个时候可以适当说的少一些,对于比较大的指标,可以适当增加一些。知道什么是 driver 什么是executor。

可以进行分配的资源如表所示:

名称

说明

--num-executors

配置 Executor 的数量

--driver-memory

配置 Driver 内存( 影响不大)

--executor-memory

配置每个 Executor 的内存大小

--executor-核s

配置每个 Executor 的 CPU 核 数量

调节原则:尽量将任务分配的资源调节到可以使用的资源的最大限度。对于具体资源的分配,我们分别讨论 Spark 的两种Cluster 运行模式:

  • 第一种是 Spark Standalone 模式,你在提交任务前,一定知道或者可以从运维部门获取到你可以使用的资源情况,在编写 submit 脚本的时候,就根据可用的资源情况进行资源的分配,比如说集群有 15 台机器,每台机器为 8G 内存,2 个 CPU 核,那么就指定 15 个 Executor,每个 Executor 分配 8G 内存,2 个 CPU 核。
  • 第二种是 Spark Yarn 模式,由于 Yarn 使用资源队列进行资源的分配和调度,在编写submit 脚本的时候,就根据Spark 作业要提交到的资源队列,进行资源的分配,比如资源队列有 400G 内存,100 个 CPU 核,那么指定 50 个 Executor,每个 Executor 分配8G 内存,2 个 CPU 核。

对各项资源进行了调节后,得到的性能提升会有如下表现:

名称

解析

增加 Executor·个数

在资源允许的情况下,增加 Executor 的个数可以提高执行 task(任务) 的并行度。比如有 4 个Executor,每个 Executor 有 2 个 CPU 核,那么可以并行执行 8 个 task(任务),如果将 Executor 的个数增加到 8 个( 资源允许的情况下), 那么可以并行执行 16 个 task(任务), 此时的并行能力提升了一倍。

增加每个 Executor 的 CPU 核 个数

在资源允许的情况下,增加每个 Executor 的Cpu 核 个数, 可以提高执行 task(任务) 的并行度。比如有 4 个 Executor,每个 Executor 有 2 个CPU 核,那么可以并行执行 8 个 task(任务),如果将每个 Executor 的 CPU 核 个数增加到 4 个( 资源允许的情况下),那么可以并行执行 16个 task(任务), 此时的并行能力提升了一倍。

增加每个 Executor 的内存量

在资源允许的情况下,增加每个 Executor 的内存量以后, 对性能的提升有三点:

  1. 可以缓存更多的数据( 即对 RDD 进行 cache), 写入磁盘的数据相应减少, 甚至可以不写入磁盘, 减少了可能的磁盘 IO;
  1. 可以为 shuffle 操作提供更多内存,即有更多空间来存放 reduce 端拉取的数据,写入磁盘的数据相应减少,甚至可以不写入磁盘, 减少了可能的磁盘 IO;
  2. 可以为 task(任务) 的执行提供更多内存,在 task(任务) 的执行过程中可能创建很多对象,内存较小时会引发频繁的 GC, 增加内存后, 可以避免频繁的 GC, 提升整体性能。

补充:生产环境 Spark submit 脚本配置

bin/spark-submit \
--class com.bigdata.spark.WordCount \
--master yarn\
--deploy-mode cluster\
--num-executors 80 \
--driver-memory 6g \
--executor-memory 6g \
--executor-核s 3 \
--queue root.default \
--conf spark.yarn.executor.memoryOverhead=2048 \
--conf spark.核.connection.ack.wait.timeout=300 \
/usr/local/spark/spark.jar

参数配置参考值:

    • --num-executors:50~100
    • --driver-memory:1G~5G
    • --executor-memory:6G~10G
    • --executor-核s:3
    • --master:实际生产环境一定使用 yarn

1.2 常规性能调优二:RDD 优化

RDD 复用

在对RDD 进行算子时,要避免相同的算子和计算逻辑之下对RDD 进行重复的计算

对上图中的 RDD 计算架构进行修改, 得到如下图所示的优化结果:

RDD 持久化

在 Spark 中,当多次对同一个 RDD 执行算子操作时,每一次都会对这个 RDD 以之前的父 RDD 重新计算一次,这种情况是必须要避免的,对同一个 RDD 的重复计算是对资源的极大浪费,因此,必须对多次使用的 RDD 进行持久化,通过持久化将公共 RDD 的数据缓存到内存/磁盘中,之后对于公共RDD 的计算都会从内存/磁盘中直接获取 RDD 数据。对于RDD 的持久化,有两点需要说明:

  • RDD 的持久化是可以进行序列化的,当内存无法将 RDD 的数据完整的进行存放的时候,可以考虑使用序列化的方式减小数据体积,将数据完整存储在内存中。
  • 如果对于数据的可靠性要求很高,并且内存充足,可以使用副本机制,对 RDD 数据进行持久化。当持久化启用了复本机制时,对于持久化的每个数据单元都存储一个副本, 放在其他节点上面,由此实现数据的容错,一旦一个副本数据丢失,不需要重新计算,还可以使用另外一个副本。

你们公司的 rdd 持久化使用的哪种方案?九种选两种

RDD 尽可能早的 filter 操作

获取到初始 RDD 后,应该考虑尽早地过滤掉不需要的数据,进而减少对内存的占用, 从而提升 Spark 作业的运行效率。

1.3 常规性能调优三:并行度调节

Spark 作业中的并行度指各个 stage(阶段) 的 task(任务) 的数量。

如果并行度设置不合理而导致并行度过低,会导致资源的极大浪费,例如,20 个Executor,每个Executor 分配 3 个CPU 核,而 Spark 作业有 40 个 task(任务),这样每个 Executor 分配到的 task(任务) 个数是 2 个,这就使得每个 Executor 有一个CPU 核 空闲,导致资源的浪费。

理想的并行度设置,应该是让并行度与资源相匹配,简单来说就是在资源允许的前提下, 并行度要设置的尽可能大,达到可以充分利用集群资源。合理的设置并行度,可以提升整个Spark 作业的性能和运行速度。

一个Job由多个Stage构成,每个Stage都会转换成为一个 TaskSet【Task集合】集合,每个TaskSet中可以包含多个Task。

read --> map -->flatmap--reduceByKey-->foreach 等

整体是一个 job,分为两个 stage, (read-->map-->flatmap) 这是一个,剩余是另一个,因为遇到了 shuffle 算子。

read-->map-->flatmap 假如并行度是 3,有 3 个 task 任务,

剩余部分是另外的 task 任务,将来这些 task 任务会在 executor 中运行。你的 executor 有可能有好多个,每一个又有好多核数。

并行度如果不设置,是多少呢?默认官方说是 200 个,不要和 flink 的并行度混淆。

Spark 官方推荐,task(任务) 数量应该设置为 Spark 作业总CPU 核 数量的 2~3 倍。之所以没有推荐task(任务) 数量与CPU 核 总数相等,是因为 task(任务) 的执行时间不同,有的task(任务) 执行速度快而有的 task(任务) 执行速度慢,如果 task(任务) 数量与CPU 核 总数相等,那么执行快的 task(任务) 执行完成后,会出现 CPU 核 空闲的情况。如果 task(任务) 数量设置为CPU 核 总数的 2~3 倍,那么一个task(任务) 执行完毕后,CPU 核


http://www.ppmy.cn/embedded/173762.html

相关文章

蓝桥杯备考:01背包+dfs---》搭配购买

我们可以把搭配的那些云当作一个一个的连通块,然后把这些连通快当成每个物体 比如,本题就是两个连通块 当我们做好连通块儿的时候,我们分析一下01背包 step1 分析状态表示 f[i][j]表示 从1到i个物品选出价格不超过j的最大价值 step2:推导状…

uniapp中使用webview并与原页面通信

uniapp中使用webview并与原页面通信 1.接收数据 主要使用message与onPostMessage接收原页面数据&#xff0c;且两个方法只能在APP中使用&#xff0c;其他平台均不支持。 <web-view style"z-index: 1;" :src"webViewUrlappview" onPostMessage"h…

StarRocks SQL使用与MySql的差异及规范注意事项

StarRocks为OLAP列存数据库&#xff0c;擅长复杂分析查询&#xff0c;需显式定义分区/分桶键&#xff1b;MySQL为OLTP行存数据库&#xff0c;适合事务处理。SQL差异&#xff1a;StarRocks支持批量写入&#xff08;避免单行INSERT&#xff09;、物化视图优化&#xff0c;禁用LIM…

R语言的安全编码

R语言的安全编码实践 引言 在数据科学和统计分析的快速发展中&#xff0c;R语言成为了一种广泛使用的工具。虽然R语言为数据分析提供了强大的功能&#xff0c;但在编写R代码时&#xff0c;安全性常常被忽视。安全编码不仅关乎软件的稳定性和可靠性&#xff0c;还涉及到数据隐…

unreal engine5 mation warping使用,敌人受击后面向攻击者

UE5系列文章目录 文章目录 UE5系列文章目录前言一、Motion Warping是什么&#xff1f;二、使用步骤 前言 unreal engine5 mation warping使用&#xff0c;敌人受击后面向攻击者 一、Motion Warping是什么&#xff1f; 在Unreal Engine 5中&#xff0c;**Motion Warping&…

python-websocket压力测试

一.websocket简介及安装 使用pip命令安装websocket库&#xff1a;pip install websocket-client websocket.WebSocketApp 是对 websocket.WebSocket 的封装&#xff0c;支持自动定时发送 PING 帧&#xff0c;支持事件驱动方式的数据帧接收&#xff0c;可用于长期的 WebSocket…

Webpack优化前端性能

Webpack优化前端性能☆☆ 涵盖了代码分割、懒加载、压缩、缓存优化、Tree Shaking、图片优化、CDN使用等多个方面。 Webpack优化前端性能详解(2025综合实践版) Webpack作为现代前端工程化的核心工具,其优化能力直接影响项目的首屏速度、交互流畅度和用户体验。以下从代码维…

SpringMVC——表现层数据封装、异常处理器

目录 数据封装协议 为什么要进行数据封装 实现数据封装 测试 异常处理器 实现异常处理器 项目异常处理 实现处理不同的异常 数据封装协议 为什么要进行数据封装 当接口响应格式不一致时&#xff1a; 前端需要为不同接口编写多种解析逻辑 错误处理逻辑难以统一 接口文…