Spark性能调优实战
吴磊
FreeWheel机器学习团队负责人
新⼈⾸单¥59.9
1316 人已学习
课程目录
已更新 20 讲 / 共 32 讲
0/4登录后,你可以任选4讲全文学习。
课前必学 (3讲)
开篇词 | Spark性能调优,你该掌握这些“套路”
免费
01 | 性能调优的必要性:Spark本身就很快,为啥还需要我调优?
02 | 性能调优的本质:调优的手段五花八门,该从哪里入手?
原理篇 (5讲)
03 | RDD:为什么你必须要理解弹性分布式数据集?
04 | DAG与流水线:到底啥叫“内存计算”?
05 | 调度系统:“数据不动代码动”到底是什么意思?
06 | 存储系统:空间换时间,还是时间换空间?
07 | 内存管理基础:Spark如何高效利用有限的内存空间?
通用性能调优篇 (12讲)
08 | 应用开发三原则:如何拓展自己的开发边界?
09 | 调优一筹莫展,配置项速查手册让你事半功倍!(上)
10 |调优一筹莫展,配置项速查手册让你事半功倍!(下)
11 | Shuffle的工作原理:为什么说Shuffle是一时无两的性能杀手?
12 | 广播变量(一):克制Shuffle,如何一招制胜!
13 | 广播变量(二):有哪些途径让Spark SQL选择Broadcast Joins?
14 | CPU视角:如何高效地利用CPU?
15 | 内存视角(一):如何最大化内存的使用效率?
16 | 内存视角(二):如何有效避免Cache滥用?
17 | 内存视角(三):OOM都是谁的锅?怎么破?
18 | 磁盘视角:如果内存无限大,磁盘还有用武之地吗?
19 | 网络视角:如何有效降低网络开销?
Spark性能调优实战
15
15
1.0x
00:00/00:00
登录|注册

19 | 网络视角:如何有效降低网络开销?

吴磊 2021-04-26
你好,我是吴磊。
在平衡不同硬件资源的时候,相比 CPU、内存、磁盘,网络开销无疑是最拖后腿的那一个,这一点在处理延迟上表现得非常明显。
下图就是不同硬件资源的处理延迟对比结果,我们可以看到最小的处理单位是纳秒。你可能对纳秒没什么概念,所以为了方便对比,我把纳秒等比放大到秒。这样,其他硬件资源的处理延迟也会跟着放大。最后一对比我们会发现,网络延迟是以天为单位的!
不同硬件资源处理延迟对比
因此,要想维持硬件资源之间的平衡,尽可能地降低网络开销是我们在性能调优中必须要做的。今天这一讲,我就按照数据进入系统的时间顺序,也就是数据读取、数据处理和数据传输的顺序,带你去分析和总结数据生命周期的不同阶段有效降低网络开销的方法。

数据读写

对于绝大多数应用来说,第一步操作都是从分布式文件系统读取数据源。Spark 支持的数据源种类非常丰富,涉及的存储格式和存储系统可以说是五花八门。
存储格式与存储系统
这么多存储格式和外部存储系统交叉在一起又会有无数种组合,并且每一种组合都有它的应用场景。那么,我们该怎么判断网络开销会出现在哪些场景下呢?其实,不管是什么文件格式,也不管是哪种存储系统,访问数据源是否会引入网络开销,取决于任务与数据的本地性关系,也就是任务的本地性级别,它一共有 4 种:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Spark性能调优实战》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥59.9
立即订阅
登录 后留言

精选留言(3)

  • kingcall
    DataFrame 要想实现map 端预聚合只能靠优化器自己了吧比较抽象层次比较高了,灵活度就降低了,但是RDD 的话还是可以自己实现实现的,虽然reduceBykey可以预聚合,但是在这个例子中不合适,不能替换collect_list,对于RDD 我们呢可以使用aggregateByKey
        def localDistinct(set: Set[String], b: String): mutable.Set[String] = {
          set.add(b)
          set
        }
        def combineDistinct(set1: Set[String], set2: Set[String]): mutable.Set[String] = {
          set1 ++ set2
        }
        rdd.map(o => (o.id, o.name)).aggregateByKey(Set[String]())(localDistinct, combineDistinct).foreach(println(_))
    2021-04-27
    1
  • Jay
    文中提到“'RDD API使用频率越来越低”。
    公司一直还用的是Rdd, 我也一直没学过spark sql。是否有必要切到spark sql呢?

    作者回复: 推荐用Spark SQL哈~ Spark SQL内置了很多优化机制(Catalyst、Tungsten),这个我们在20-23这4讲会详细展开。

    2021-04-27
  • zxk
    问题一: reduceBykey 可以在 map 端预聚合
    问题二:在 map 端聚合的场景,比如求某个 key 的数量,求和等,业务方面来看凡是预聚合不影响正确性的都可以先在 map 端做聚合
    问题三: 在读取数据源阶段,可以尽可能将 executor 落在数据同节点上,实现node local,再次就是同个机架下,实现 rack local。数据Shuffle时,可以考虑使用Broadcast代替,或者先在 map 端预聚合减少数据量,以及只传输时用到的字段。

    作者回复: 答得挺好~ 不过有个细节有疑问。

    问题二:“预聚合不影响正确性的”,我能想到的是“依赖排序的聚合计算”,比如分位数(不同百分位、中位数等等)的计算,你指的是这种操作吗?

    2021-04-26
收起评论
3
返回
顶部