一.在内存中缓存数据
Spark SQL可以通过调用spark.catalog.cacheTable(“tableName”)或使用dataFrame.cache()内存列式格式缓存表。然后,Spark SQL将仅扫描所需的列,并将自动调整压缩以最大程度地减少内存使用和GC压力。可以调用spark.catalog.uncacheTable(“tableName”)从内存中删除表或dataFrame.unCache()取消缓存。
可以在SparkSession上使用setConf方法或使用SQL运行SET key=value 命令来完成内存中缓存的配置。
中文翻译
以下选项也可以用于调整查询执行的性能。随着自动执行更多优化,这些选项可能会在将来的版本中被弃用。
二.加入针对SQL查询的策略提示
连接策略提示,即BROADCAST,MERGE,SHUFFLE_HASH和SHUFFLE_REPLICATE_NL,指导spark与其他关系结合时,他们使用暗示策略上的每个特定关系。例如,当BROADCAST在表’t1’上使用提示时,Spark将优先考虑以’t1’作为构建侧的广播联接(广播哈希联接或广播嵌套循环联接,取决于是否有任何等联接键)。即使统计信息建议的表’t1’的大小在配置spark.sql.autoBroadcastJoinThreshold之上。
当在连接的两侧指定了不同的连接策略提示时,Spark会优先使用BROADCAST提示而不是MERGE、 SHUFFLE_HASH或SHUFFLE_REPLICATE_NL 提示。当使用BROADCAST提示或SHUFFLE_HASH提示指定双方时,Spark将根据联接类型和关系的大小选择构建方。
备注:由于特定策略可能不支持所有联接类型,因此不能保证Spark将选择提示中指定的联接策略。
spark.table("src").join(spark.table("records").hint("broadcast"), "key").show()
三.SQL查询的合并提示
Coalesce提示使Spark SQL用户可以在Dataset API中使用coalesce、repartition或repartitionByRange控制输出文件的数量,它们可以用于性能调整和减少输出文件的数量。“COALESCE”提示仅具有分区号作为参数。“ REPARTITION”提示具有分区号和列名【可选参数】作为参数。“ REPARTITION_BY_RANGE”提示必须具有列名,并且分区号是可选的。
SELECT /*+ COALESCE(3) */ * FROM t
SELECT /*+ REPARTITION(3) */ * FROM t
SELECT /*+ REPARTITION(c) */ * FROM t
SELECT /*+ REPARTITION(3, c) */ * FROM t
SELECT /*+ REPARTITION_BY_RANGE(c) */ * FROM t
SELECT /*+ REPARTITION_BY_RANGE(3, c) */ * FROM t
四.自适应查询执行
自适应查询执行(AQE)是Spark SQL中的一种优化技术,它利用运行时统计信息来选择最有效的查询执行计划。默认情况下禁用AQE。Spark SQL可以使用配置spark.sql.adaptive.enabled来控制是否打开/关闭它。从Spark 3.0开始,AQE具有三个主要功能,包括合并后混洗分区,将排序合并联接转换为广播联接以及倾斜联接优化。
五.合并Shuffle分区
当spark.sql.adaptive.enabled和spark.sql.adaptive.coalescePartitions.enabled配置均为true时,此功能将根据地图输出统计信息合并后混洗分区。此功能简化了在运行查询时对混洗分区号的调整。您无需设置适当的随机播放分区号即可适合您的数据集。一旦通过spark.sql.adaptive.coalescePartitions.initialPartitionNum配置设置了足够大的初始shuffle分区数量,Spark便可以在运行时选择正确的shuffle分区编号。
六.将排序合并联接转换为广播联接
当任何联接端的运行时统计信息小于广播哈希联接阈值时,AQE会将排序合并联接转换为广播哈希联接。这不像首先计划广播哈希连接那样有效,但是比继续进行排序合并连接要好,因为我们可以保存两个连接端的排序,并在本地读取随机文件以节省网络流量【当spark.sql.adaptive.localShuffleReader.enabled为true】。
七.优化倾斜连接
数据偏斜会严重降低联接查询的性能。此功能通过将倾斜的任务拆分(按需复制)为大小大致相等的任务来动态处理排序合并联接中的倾斜。同时启用spark.sql.adaptive.enabled和spark.sql.adaptive.skewJoin.enabled配置时,此选项才生效。