前言
Join和Aggregation操作都可能引起Shuffle,所以这类问题一般具有相似的症状和解决办法。
主要症状
- Join stage可能一直在运行,它可能包含一个或者多个task。
- 该Join stage前后的stage看起来一切正常。
可能的解决方法
-
许多Join可以被手动或自动)优化到其他类型的连接。
-
尝试不同的连接顺序也许可以发现较快连接组合,特别是当其中一些连接过滤掉大量数据, 先做那些。
-
对数据集进行分区对于减少群集中的数据移动非常有用,尤其是在多个连接操作中将使用相同的数据集时。 可以尝试join前的不同分区组合, 但这会引起shuffle。
-
Join操作缓慢也可能是由于数据偏差造成的。 可以调整Spark应用程序和/或增加executor的大小等。
-
在Join操作之前使用SELECT等操作过滤选出需要处理的数据,避免处理无关的数据。 Spark的查询优化器将自动为结构化API执行此操作。
-
-确保数据中的空值被正确表示(使用Spark的null概念)而不是像”“或”EMPTY“那样的默认值。 Spark通常会尽可能优化,在作业早期跳过空值,但对于其他自定义的占位符值,并没有这样的优化机制
-
有时,如果Spark不知道有关输入DataFrame或表的任何统计信息,则Spark无法正确规划广播(broadcast)连接。 如果你知道要join中的一个表很小,则可以尝试强制广播