Spark SQL常用配置及性能优化

46 篇文章 3 订阅
3 篇文章 0 订阅
本文介绍了SparkSQL的内存缓存、SQL查询策略提示、合并提示、自适应查询执行(AQE)及其功能,如合并Shuffle分区、转换排序合并联接以及优化倾斜连接。通过这些技术,用户可以提升查询性能,处理数据倾斜问题,并动态调整执行计划。
摘要由CSDN通过智能技术生成

一.在内存中缓存数据

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配置时,此选项才生效。
在这里插入图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值