【spark床头书系列】SparkSQL性能调优官网权威资料

SparkSQL性能调优官网权威资料点击这里也可看全文


对于某些工作负载,可以通过将数据缓存在内存中或打开一些实验选项来提高性能。

在内存中缓存数据

Spark SQL可以使用内存中的列式格式缓存表格,通过调用spark.catalog.cacheTable("tableName")dataFrame.cache()方法。然后,Spark SQL将只扫描所需的列,并自动调整压缩以最小化内存使用和GC压力。可以调用spark.catalog.uncacheTable("tableName")dataFrame.unpersist()方法将表格从内存中移除。

可以使用SparkSession的setConf方法或使用SQL运行SET key=value命令来配置内存中缓存的方式。

以下是可以进行内存中缓存的配置选项:

属性名称 默认值 含义 版本
spark.sql.inMemoryColumnarStorage.compressed true 当设置为true时,Spark SQL将根据数据的统计信息自动为每列选择压缩编解码器。 1.0.1
spark.sql.inMemoryColumnarStorage.batchSize 10000 控制列式缓存的批处理大小。较大的批处理大小可以提高内存利用率和压缩效果,但在缓存数据时可能会导致OOM。 1.1.1

其他配置选项

以下选项也可用于调优查询执行的性能。随着自动进行更多优化,这些选项可能在未来版本中被弃用。

属性名称 默认值 含义 版本
spark.sql.files.maxPartitionBytes 134217728 (128 MB) 读取文件时将打包到单个分区中的最大字节数。此配置仅在使用基于文件的数据源(如Parquet、JSON和ORC)时有效。 2.0.0
spark.sql.files.openCostInBytes 4194304 (4 MB) 打开一个文件的估计成本,以可以在同一时间内扫描的字节数来衡量。这在将多个文件放入一个分区时使用。建议过度估计,这样小文件所在的分区将比较大的文件所在的分区更快(优先调度)。此配置仅在使用基于文件的数据源(如Parquet、JSON和ORC)时有效。 2.0.0
spark.sql.files.minPartitionNum 默认并行度 建议的(不保证)最小拆分文件分区数。如果未设置,默认值为spark.sql.leafNodeDefaultParallelism。此配置仅在使用基于文件的数据源(如Parquet、JSON和ORC)时有效。 3.1.0
spark.sql.files.maxPartitionNum None 建议的(不保证)最大拆分文件分区数。如果设置了此值,当初始分区数超过此值时,Spark将重新调整每个分区的大小,使初始分区数接近此值。此配置仅在使用基于文件的数据源(如Parquet、JSON和ORC)时有效。 3.5.0
spark.sql.broadcastTimeout 300 广播连接中广播等待时间的超时时间(以秒为单位)。 1.3.0
spark.sql.autoBroadcastJoinThreshold 10485760 (10 MB) 在执行连接操作时,配置表格的最大大小(字节数),当其小于此值时,将广播到所有的工作节点上。通过将此值设置为-1,可以禁用广播。注意,目前仅支持对运行了ANALYZE TABLE <tableName> COMPUTE STATISTICS noscan命令的Hive Metastore表进行统计。 1.1.0
spark.sql.shuffle.partitions 200 配置用于连接或聚合操作时要使用的分区数。 1.1.0
spark.sql.sources.parallelPartitionDiscovery.threshold 32 配置启用并行列出作业输入路径的阈值。如果输入路径的数量大于此阈值,则Spark将使用Spark分布式作业列出文件。否则,将回退到顺序列出。此配置仅在使用基于文件的数据源(如Parquet、ORC和JSON)时有效。 1.5.0
spark.sql.sources.parallelPartitionDiscovery.parallelism 10000 配置作业输入路径的最大并行列出数。如果输入路径的数量大于此值,则将其限制为此值。此配置仅在使用基于文件的数据源(如Parquet、ORC和JSON)时有效。 2.1.1

SQL查询的连接策略Hints提示

连接策略提示,即BROADCAST、MERGE、SHUFFLE_HASH和SHUFFLE_REPLICATE_NL,指示Spark在连接两个关系时使用指定的策略。例如,当在表格‘t1’上使用BROADCAST提示时,Spark优先选择广播连接(根据是否存在任何等值连接键,可能是广播哈希连接或广播嵌套循环连接),即使统计数据建议表格‘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查询的合并提示

合并提示允许Spark SQL用户控制输出文件的数量,类似于Dataset API中的coalesce、repartition和repartitionByRange方法,它们可用于性能调优和减少输出文件的数量。合并提示只有一个参数,即分区数。

SELECT /*+ COALESCE(3) */ * FROM t;
SELECT /*+ REPARTITION(3) */ * FROM
  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值