PySpark | Spark3新特性 | Spark核心概念


传送门:


一、Spark Shuffle

  在Shuffle过程中,提供数据的称之为Map端(Shuffle Write) 。接收数据的 称之为 Reduce端(Shuffle Read)。在Spark的两个阶段中,总是前一个阶段产生一批Map提供数据,下一阶段产生一批Reduce接收数据。
  Spark 提供2种Shuffle管理器:

  • HashShuffleManager:基于Hash分组进行Shuffle
  • SortShuffleManager:基于排序进行Shuffle

SortShuffleManager可以看做是HashShuffleManager的增强,在Shuffle阶段中,以最少的文件的产出来完成数据的相互交流。

1. HashShuffleManager

在这里插入图片描述
在这里插入图片描述

基本和未优化的一致,不同点在于:

  1. 在一个Executor内, 不同Task是共享Buffer缓冲区
  2. 这样减少了缓冲区乃至写入磁盘文件的数量, 提高性能

2. SortShuffleManager

  SortShuffleManager的运行机制主要分成两种,一种是普通运行机制,另一种是bypass运行机制。
在这里插入图片描述
在这里插入图片描述
bypass运行机制的触发条件如下:

  1. shuffle map task数量小于spark.shuffle.sort.bypassMergeThreshold=200参数的值。
  2. 不是聚合类的shuffle算子(比如reduceByKey)。

同普通机制基本类同,区别在于,写入磁盘临时文件的时候不会在内存中进行排序,而是直接写,最终合并为一个task一个最终文件。所以和普通模式IDE区别在于:

  1. 磁盘写机制不同;
  2. 不会进行排序。也就是说,启用该机制的最大好处在于,shuffle write过程中,不需要进行数据的排序操作,也就节省掉了这部分的性能开销。

3. 总结

  1. SortShuffle对比HashShuffle可以减少很多的磁盘文件,以节省网络IO的开销
  2. SortShuffle主要是对磁盘文件进行合并来进行文件数量的减少,同时两类Shuffle都需要经过内存缓冲区溢写磁盘的场景。所以可以得知,尽管Spark是内存迭代计算框架,但是内存迭代主要在窄依赖中。 在宽依赖(Shuffle)中磁盘交互还是一个无可避免的情况。 所以,我们要尽量减少Shuffle的出现,不要进行无意义的Shuffle计算。

二、Spark3.0新特性

1. Adaptive Query Execution 自适应查询(SparkSQL)

  由于缺乏或者不准确的数据统计信息(元数据)和对成本的错误估算(执行计划调度)导致生成的初始执行计划不理想。在Spark3.x版本提供Adaptive Query Execution自适应查询技术,通过在”运行时”对查询执行计划进行优化,允许Planner在运行时执行可选计划,这些可选计划将会基于运行时数据统计进行动态优化,从而提高性能。
Adaptive Query Execution(AQE)主要提供了三个自适应优化:

  • 动态合并 Shuffle Partitions
    可以动态调整shuffle分区的数量。用户可以在开始时设置相对较多的shuffle分区数,AQE会在运行时将相邻的小分区合并为较大的分区。
    在这里插入图片描述
  • 动态调整Join策略
    此优化可以在一定程度上避免由于缺少统计信息或者错误估计大小(当然也可能两种情况同时存在),而导致执行计划性能不佳的情况。这种自适应优化可以在运行时sort merge join转换成broadcast hash join,从而进一步提升性能。
    在这里插入图片描述
  • 动态优化倾斜Join(Skew Joins)
    skew joins可能导致负载的极端不平衡,并严重降低性能。在AQE从shuffle文件统计信息中检测到任何倾斜后,它可以将倾斜的分区分割成更小的分区,并将它们与另一侧的相应分区连接起来。这种优化可以并行化倾斜处理,获得更好的整体性能。
    在这里插入图片描述
    触发条件:
  1. 分区大小 > spark.sql.adaptive.skewJoin.skewedPartitionFactor (default=10) * “median partition size(中位数分区大小)”
  2. 分区大小 > spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes (default = 256MB)

AQE 总结:

  1. AQE的开启通过: spark.sql.adaptive.enabled 设置为true开启
  2. AQE是自动化优化机制, 无需我们设置复杂的参数调整, 开启AQE符合条件即可自动化应用AQE优化
  3. AQE带来了极大的SparkSQL性能提升

2. Dynamic Partition Pruning 动态分区裁剪(SparkSQL)

  当优化器在编译时无法识别可跳过的分区时,可以使用"动态分区裁剪",即基于运行时推断的信息来进一步进行分区裁剪。这在星型模型中很常见,星型模型是由一个或多个并且引用了任意数量的维度表的事实表组成。在这种连接操作中,我们可以通过识别维度表过滤之后的分区来裁剪从事实表中读取的分区。在一个TPC-DS基准测试中,102个查
询中有60个查询获得2到18倍的速度提升。

3. 增强的Python API: PySpark和Koalas

  下面是Koalas的入门演示。

3.1 Koalas DataFrame构建
>>> import pandas as pd
>>> import numpy as np
>>> import dataabricks.koalas as ks

# 构建Pandas的DatetimeIndex
>>> dates = pd.date_range(
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幼稚的人呐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值