一步一个脚印,一天一道面试题
近期工作时有用到 Spark 2 升级 Spark 3,解决问题的情况。
任务原本是运行 4 小时后报错,升级到 Spark 3
后,任务运行 1 小时,并且运行成功。
平时用 Spark 3 用的也多,就当记录一下。
Spark 3 升级特点
一、自适应优化查询 Adaptive Query Execution
Spark
计算时,会根据不同的情况启用不同的方法。
比如在针对 join
操作时,默认使用 SortMergeJoin
,而如果是大表 join 小表,则使用 BroadcastHashJoin
效果更好。
在 Spark 2 中,获取数据源等信息少,往往不能根据实际情况使用最好的计算方法。
而 Spark 3
中,能 动态获取执行信息,进而根据实际情况使用最好的计算方法,这会明显提升运行速度。
二、谓词下推 Predicate PushDown
谓词下推是数据查询的重要优化。其重要原理是在一层层的处理中,把谓词下推到更低层,更早的做数据过滤,能明显提高程序执行效率。
谓词: Where
里的各种条件:大于 >,小于 <,等于 =,between 等过滤语句,就叫谓词。
下推: 把对应谓词(各种过滤条件)放到更低的层级,提早过滤。
下面举例说明:
1.将谓词下推至数据源
select a.col1, b.col2 from a
join b
on a.id = b.id
where a.col1 = 'something'
1.如果是 Parquet
这样的列式存储文件格式,会直接在文件中过滤再读入到 Spark 中,而不是先读入到 Spark,再过滤
2.先where
过滤问题后,再进行join
过滤,而不是先join
,再where
过滤。
提早的进行过滤,减少数据量,就能提高程序的运行效率。
比如我们使用 Spark
数据量大时容易遇到 shuffle
时的报错,想想如果在 shuffle
前就能减少一部分数据量,是不是会好许多呢?
三、一点自己的零碎总结
1.用 Spark 3 就是会比 Spark 2 快很多,研究下来,就是 Spark 3 自动做的优化多了很多。
2.由于第一点,我们不会需要那么多加大资源才能解决的报错,节省了一些宝贵的集群资源。
3.升级对更多使用 Spark SQL
的程序来说,代码改动量很小。
我是近未来,祝你变得更强!