没有合适的资源?快使用搜索试试~ 我知道了~
Spark的作业开发调优.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 114 浏览量
2024-08-07
14:34:13
上传
评论
收藏 847KB PDF 举报
温馨提示
Spark的作业开发调优.pdf
资源推荐
资源详情
资源评论
![thumb](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![csv](https://img-home.csdnimg.cn/images/20210720083646.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![thumb](https://img-home.csdnimg.cn/images/20210720083646.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![csv](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/release/download_crawler_static/89620477/bg1.jpg)
1. 前言
2. 开发调优概述
3. 开发调优原则
3. 1. 避免创建重复的RDD
3. 1. 1. 一个简单的例子
3. 2. 尽可能复用同一个RDD
3. 2. 1. 一个简单的例子
3. 3. 对多次使用的RDD持久化
3. 3. 1. 对多次使用的RDD进行持久化的代码示例
3. 3. 2. Spark的持久化级别
3. 3. 3. 如何选择一种最合适的持久化策略
3. 4. 尽量避免使用Shuffle类算子
3. 4. 1. Broadcast与map进行join代码示例
3. 5. 使用Map-Side预聚合的Shuffle操作
3. 6. 使用高性能的算子
3. 6. 1. 使用reduceByKey/aggregateByKey替代groupByKey
3. 6. 2. 使用mapPartitions替代普通map
3. 6. 3. 使用foreachPartitions替代foreach
3. 6. 4. 使用filter之后进行coalesce操作
3. 6. 5. 使用repartitionAndSortWithinPartitions替代repartition与sort类操作
3. 7. 广播大变量
3. 7. 1. 广播大变量的代码示例
3. 8. 使用Kryo优化序列化性能
3. 9. 优化数据结构
3. 10. 融会贯通
4. 举例
1. 前言
在大数据计算领域,Spark 已经成为了越来越流行、越来越受欢迎的计算平台之一。Spark 的功能涵盖
了大数据领域的离线批处理、SQL 类处理、流式/实时计算、机器学习、图计算等各种不同类型的计算
操作,应用范围与前景非常广泛。在美团•大众点评,已经有很多同学在各种项目中尝试使用 Spark。大
多数同学(包括笔者在内),最初开始尝试使用 Spark 的原因很简单,主要就是为了让大数据计算作业
的执行速度更快、性能更高。
然而,通过 Spark 开发出高性能的大数据计算作业,并不是那么简单的。如果没有对 Spark 作业进行
合理的调优,Spark 作业的执行速度可能会很慢,这样就完全体现不出 Spark 作为一种快速大数据计算
引擎的优势来。因此,想要用好 Spark,就必须对其进行合理的性能优化。
Spark 的性能调优实际上是由很多部分组成的,不是调节几个参数就可以立竿见影提升作业性能的。我
们需要根据不同的业务场景以及数据情况,对 Spark 作业进行综合性的分析,然后进行多个方面的调节
和优化,才能获得最佳性能。
![](https://csdnimg.cn/release/download_crawler_static/89620477/bg2.jpg)
笔者根据之前的 Spark 作业开发经验以及实践积累,总结出了一套 Spark 作业的性能优化方案。整套
方案主要分为开发调优、资源调优、数据倾斜调优、shuffle调优几个部分。开发调优和资源调优是所有
Spark 作业都需要注意和遵循的一些基本原则,是高性能 Spark 作业的基础;数据倾斜调优,主要讲解
了一套完整的用来解决 Spark 作业数据倾斜的解决方案;shuffle 调优,面向的是对 Spark 的原理有较
深层次掌握和研究的同学,主要讲解了如何对 Spark 作业的 shuffle 运行过程以及细节进行调优。
本文作为 Spark 性能优化指南的基础篇,主要讲解开发调优以及资源调优。
2.
开发调优概述
Spark 性能优化的第一步,就是要在开发 Spark 作业的过程中注意和应用一些性能优化的基本原则。开
发调优,就是要让大家了解以下一些 Spark 基本开发原则,包括:RDD Lineage 设计、算子的合理使
用、特殊操作的优化等。在开发过程中,时时刻刻都应该注意以上原则,并将这些原则根据具体的业务
以及实际的应用场景,灵活地运用到自己的 Spark 作业中。
3. 开发调优原则
3.1. 避免创建重复的RDD
通常来说,我们在开发一个 Spark 作业时,首先是基于某个数据源(比如 Hive 表或 HDFS 文件)创建
一个初始的RDD;接着对这个 RDD 执行某个算子操作,然后得到下一个 RDD;以此类推,循环往复,
直到计算出最终我们需要的结果。在这个过程中,多个 RDD 会通过不同的算子操作(比如map、
reduce等)串起来,这个 “RDD串”,就是 RDD lineage,也就是 “RDD的血缘关系链”。
我们在开发过程中要注意:对于同一份数据,只应该创建一个 RDD,不能创建多个 RDD 来代表同一份
数据。
一些Spark初学者在刚开始开发 Spark 作业时,或者是有经验的工程师在开发 RDD lineage 极其冗长的
Spark 作业时,可能会忘了自己之前对于某一份数据已经创建过一个 RDD 了,从而导致对于同一份数
据,创建了多个 RDD。这就意味着,我们的 Spark 作业会进行多次重复计算来创建多个代表相同数据
的 RDD,进而增加了作业的性能开销。
3.1.1. 一个简单的例子
// 需要对名为“hello.txt”的HDFS文件进行一次map操作,再进行一次reduce操作。也就是说,需要对一
份数据执行两次算子操作。
// 错误的做法:对于同一份数据执行多次算子操作时,创建多个RDD。
// 这里执行了两次textFile方法,针对同一个HDFS文件,创建了两个RDD出来,然后分别对每个RDD都执
行了一个算子操作。
// 这种情况下,Spark需要从HDFS上两次加载hello.txt文件的内容,并创建两个单独的RDD;第二次加载
HDFS文件以及创建RDD的性能开销,很明显是白白浪费掉的。
val rdd1 = sc.textFile("hdfs://192.168.0.1:9000/hello.txt")
rdd1.map(...)
val rdd2 = sc.textFile("hdfs://192.168.0.1:9000/hello.txt")
rdd2.reduce(...)
// 正确的用法:对于一份数据执行多次算子操作时,只使用一个RDD。
![](https://csdnimg.cn/release/download_crawler_static/89620477/bg3.jpg)
3.2. 尽可能复用同一个RDD
除了要避免在开发过程中对一份完全相同的数据创建多个 RDD 之外,在对不同的数据执行算子操作时
还要尽可能地复用一个 RDD。比如说,有一个 RDD 的数据格式是 key-value 类型的,另一个是单
value 类型的,这两个 RDD 的 value 数据是完全一样的。那么此时我们可以只使用 key-value 类型的那
个 RDD,因为其中已经包含了另一个的数据。对于类似这种多个 RDD 的数据有重叠或者包含的情况,
我们应该尽量复用一个 RDD,这样可以尽可能地减少 RDD 的数量,从而尽可能减少算子执行的次数。
3.2.1. 一个简单的例子
// 这种写法很明显比上一种写法要好多了,因为我们对于同一份数据只创建了一个RDD,然后对这一个RDD执
行了多次算子操作。
// 但是要注意到这里为止优化还没有结束,由于rdd1被执行了两次算子操作,第二次执行reduce操作的时
候,还会再次从源头处重新计算一次rdd1的数据,因此还是会有重复计算的性能开销。
// 要彻底解决这个问题,必须结合“原则三:对多次使用的RDD进行持久化”,才能保证一个RDD被多次使用
时只被计算一次。
val rdd1 = sc.textFile("hdfs://192.168.0.1:9000/hello.txt")
rdd1.map(...)
rdd1.reduce(...)
// 错误的做法。
// 有一个<Long, String>格式的RDD,即rdd1。
// 接着由于业务需要,对rdd1执行了一个map操作,创建了一个rdd2,而rdd2中的数据仅仅是rdd1中的
value值而已,也就是说,rdd2是rdd1的子集。
JavaPairRDD<Long, String> rdd1 = ...
JavaRDD<String> rdd2 = rdd1.map(...)
// 分别对rdd1和rdd2执行了不同的算子操作。
rdd1.reduceByKey(...)
rdd2.map(...)
// 正确的做法。
// 上面这个case中,其实rdd1和rdd2的区别无非就是数据格式不同而已,rdd2的数据完全就是rdd1的子
集而已,却创建了两个rdd,并对两个rdd都执行了一次算子操作。
// 此时会因为对rdd1执行map算子来创建rdd2,而多执行一次算子操作,进而增加性能开销。
// 其实在这种情况下完全可以复用同一个RDD。
// 我们可以使用rdd1,既做reduceByKey操作,也做map操作。
// 在进行第二个map操作时,只使用每个数据的tuple._2,也就是rdd1中的value值,即可。
JavaPairRDD<Long, String> rdd1 = ...
rdd1.reduceByKey(...)
rdd1.map(tuple._2...)
// 第二种方式相较于第一种方式而言,很明显减少了一次rdd2的计算开销。
// 但是到这里为止,优化还没有结束,对rdd1我们还是执行了两次算子操作,rdd1实际上还是会被计算两
次。
// 因此还需要配合“原则三:对多次使用的RDD进行持久化”进行使用,才能保证一个RDD被多次使用时只被
计算一次。
剩余11页未读,继续阅读
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/65c02cef028d4c32a8f4dbbb84e42f92_gwc791224.jpg!1)
shandongwill
- 粉丝: 4900
- 资源: 668
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- a78059e333cf45f28200d900d5cfac26.pdf.pdf
- 全阶滑模无位置传感器控制仿真模型,有基本的反正切的,有锁相环的,有基本的开关函数,有饱和函数,sigmod函数,以及幂函数多种滑
- 万联证券:银行行业深度报告-《商业银行资本管理办法(征求意见稿)》解读(1).pdf
- 头豹:医药制造业-肠胃疾病用药.pdf
- 头豹:医美产业链系列之2022年中国肉毒素行业概览-爱美客、四环医药、兰州生物纷纷布局与玻尿酸并驾齐驱的掘金赛道(1).pdf
- 头豹:2023年中国按摩椅行业-乘“大健康”东风-需求爆发.pdf
- S7-200 组态王 组态王单容液位控制 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面
- 头豹:人工智能系列2022年中国声纹识别系统产业链分析(摘要版)(1).pdf
- 电子设计论文THB7128通用电子电路应用400例
- vue中使用富文本编辑器
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)