目录
Apache Spark - Adaptive Query Execution/AQE
3. AQE - Small Reduce Partition
4. AQE – Skewed Reduce Partition
Apache Spark - Adaptive Query Execution/AQE
1. AQE–History
-
自适应查询
-
Adaptive/AQE/AE
下面先来讲一下 Apache Spark Adaptive Query Execution 的一些历史, AQE 在不管是 Spark 开源代码里面还是在技术博客里面出现的频率越来越高,我们一般会用 AQE 这种缩写去简称它。
-
Spark 2.X
AQE 在Spark 2.X版本其实就已经有了一定的雏形。但是整个框架是非常 Hack 的,并且存在很多 Bug,它提供的功能就是可以合并一些小的分区。除此之外也没有别的功能,设计非常简单。
-
Spark 3.0
到 Spark 3.0的这个开发阶段,Intel 提出了一个基于 AQE 的新框架。在这个框架下我们可以做非常多事情,主要围绕两部分:
①对于 Shuffle Reader 阶段的各种优化
包括我们现在可以想到的一些Join 倾斜优化、 Local Shuffle Reader 的优化。这些优化在现在这个框架里都非常简单,只需要添加一些规则就可以支持。
②通过优化执行计划来进一步去优化 SQL 性能
比如我们以前见到的广播 Join,在 AQE 这个特性里面可以在运行时动态地将我们的 Join 转化成广播 Join 来跑。这一层面提高了 SQL 的性能。
-
Spark 3.1
Spark 3.1时代,网易开始进入并参与到了 AQE 特性的优化和增强。到目前为止,大概有40多个 Patch 已经合入了 Apache Spark 的社区。
网易内部默认打开了 AQE 特性并且效果非常好,相比于原来的Spark2.x 版本,几乎每个在TPC-DS性能测试下,几乎有 100% 的性能提升。
-
Spark 3.2
Spark 3.2才把 AQE 特性默认开启我相信在未来即将发布的 Spark 版本里面, AQE 会发挥更多更重要的作用,也还会有更多的特性的引入进来。
2. AQE–Shuffle
-
Small Reduce Partition
-
Skewed Reduce Partition
下面来讲一下 AQE 整个的一个设计,它解决了什么问题?以及它是如何解决的?
-
我们看一个非常简单的一张 Shuffle 图:
左边部分:是 Shuffle 的 Map 阶段,也就是负责写 Shuffle 数据的这一个 Stage
右边部分:是负责 Read Shuffle 数据的 Stage
中间部分:是 Spark Shuffle Block
可以看到,这是个非常简单的 Demo,它的数据已经出现了非常小的一些分区,实际在 Reduce 分区里面只有3个分区是有数据的,剩下197个是空的。我们知道这200个分区是 Spark 默认的分区配置,也就是我们经常会调整的 SQL Shuffle Partition 的配置。
-
这个 Shuffle 其实已经引入2个问题:
①假设我们期望每个分区只处理两条数据,Task5 分区已经出现了数据倾斜。
②剩下的分区都是小分区,或者是根本没有数据的分区,无效分区,这些分区在 Spark 整个调度层面会造成非常严重的 Task 资源浪费。
-
AQE 的诞生就是为了解决这些问题
3. AQE - Small Reduce Partition
-
Coalesce Shuffle Partition
我们先来看一下第一个问题,Small Reduce Partition , 也就是 Reduce 分区处理的数据量很小。在 Spark 的 AQE 的框架里面,这个特性的规则就是 Coalesce Shuffle Partition。Shuffle Partition 其实是和 Reduce Partition 等价的,在 Spark 代码里面这个特性规则就命名