Spark SQL之性能优化

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

在内存中缓存数据

Spark SQL可以通过调用Spark .catalog. cachetable(“tableName”)或dataFrame.cache()来使用内存中的柱状格式缓存表。然后Spark SQL将只扫描所需的列,并自动调优压缩,以最小化内存使用和GC压力。可以调用spark.catalog. unachetable(“tableName”)从内存中删除表。
可以使用SparkSession上的setConf方法或使用SQL运行SET key=value命令来配置内存缓存。

属性名称 默认值 含义
spark.sql.inMemoryColumnarStorage.compressed true 当设置为true时,Spark SQL将根据数据的统计信息自动为每一列选择压缩编解码器。
spark.sql.inMemoryColumnarStorage.batchSize 10000 控制列缓存的批大小。更大的批处理大小可以提高内存利用率和压缩,但是在缓存数据时存在oom风险。

其他配置选项

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

属性名称 默认值 含义
spark.sql.files.maxPartitionBytes 134217728 (128 MB) 读取文件时装入单个分区的最大字节数。
spark.sql.files.openCostInBytes 4194304 (4 MB) 打开一个文件的估计成本,以字节数衡量,可以在同一时间扫描。这是在将多个文件放入一个分区时使用的。最好高估它,那么带有小文件的分区将比带有大文件的分区(首先是调度的)更快。
spark.sql.broadcastTimeout 300 以秒为单位的广播连接中广播等待的超时时间
spark.sql.autoBroadcastJoinThreshold 10485760 (10 MB) 配置执行联接时将广播到所有工作节点的表的最大字节大小。通过将此值设置为-1,可以禁用广播。注意,目前统计数据只支持Hive Metastore表,其中命令ANALYZE TABLE COMPUTE statistics noscan已经运行。
spark.sql.shuffle.partitions 200 配置在为连接或聚合洗牌数据时要使用的分区数。

用于SQL查询的广播提示

当将每个指定的表与另一个表或视图连接时,BROADCAST提示引导Spark广播它们。当Spark决定连接方法时,广播散列连接(即,BHJ),即使统计数据高于配置spark.sq . autobroadcastjointhreshold。当指定连接的两边时,Spark广播统计信息较低的一方。注意Spark并不保证总是选择BHJ,因为并非所有情况(例如完全外部连接)都支持BHJ。在选择broadcast嵌套循环连接时,我们仍然遵循提示。
Scala代码:

import org.apache.spark.sql.functions.broadcast
broadcast(spark.table("src")).join(spark.table("records"), "key").show()

Java代码:

import static org.apache.spark.sql.functions.broadcast;
broadcast(spark.table("src")).join(spark.table("records"), "key").show();

猜你喜欢

转载自blog.csdn.net/Thomson617/article/details/87880886