目录
5.解决 YARN-CLIENT 模式导致的网卡流量激增问题
6.解决 YARN-CLUSTER 模式的 JVM 栈内存溢出无法执行问题
一、Spark3.0 AQE
Spark 在 3.0 版本推出了 AQE(Adaptive Query Execution),即自适应查询执行
AQE 是Spark SQL 的一种动态优化机制,在运行时,每当 Shuffle Map 阶段执行完毕,AQE 都会结合这个阶段的统计信息,基于既定的规则对原始查询语句的运行时优化。
1.动态合并分区
在 Spark 中运行查询处理非常大的数据时,shuffle 通常会对查询性能产生非常重要的影响。shuffle 是非常昂贵的操作,因为它需要进行网络传输移动数据,以便下游进行计算。
我们希望每个分区被均匀使用,但是分区数量多少一般很难控制,因此需要动态合并分区。
- 如果分区太少,则每个分区的数据量可能会很大,处理这些数据量非常大的分区,可能需要将数据溢写到磁盘(例如,排序和聚合),降低了查询。
- 如果分区太多,则每个分区的数据量大小可能很小,读取大量小的网络数据块,这也会导致 I/O 效率低而降低了查询速度。拥有大量的 task(一个分区一个 task)也会给Spark 任务计划程序带来更多负担。
为了解决这个问题,我们可以在任务开始时先设置较多的 shuffle 分区个数,然后在运行时通过查看 shuffle 文件统计信息将相邻的小分区合并成更大的分区