对于某些工作负载,可以通过在内存中缓存数据或打开一些实验性选项来提高性能。
在内存中缓存数据
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();