一.缓存
对于某些工作负载,可以通过在内存中缓存数据或打开某些实验选项来提高性能。
Spark SQL可以通过调用spark.catalog.cacheTable(“tableName”)或使用内存列式格式缓存表dataFrame.cache()。然后,Spark SQL将仅扫描所需的列,并将自动调整压缩以最大程度地减少内存使用和GC压力。可以调用spark.catalog.uncacheTable(“tableName”)从内存中删除表。
可以在SparkSession上使用setConf设置或SET key=value使用SQL 运行 命令来完成内存中缓存的配置。
-
spark.sql.inMemoryColumnarStorage.compressed
默认值:true
含义:设置为true时,Spark SQL将根据数据统计信息自动为每一列选择一个压缩编解码器。 -
spark.sql.inMemoryColumnarStorage.batchSize
默认值:10000
含义:控制用于列式缓存的批处理的大小。较大的批处理大小可以提高内存利用率和压缩率,但是在缓存数据时更容易出现OOM。
二.其他配置选项
以下选项也可以用于调整查询执行的性能。随着自动执行更多优化,这些选项可能会在将来的版本中被弃用。
三.Spark动态广播
当两个表进行链接时,广播提示spark表与另一个表或视图要广播的每个指定的表。当Spark确定连接方法时,即使统计数据高于配置,也首选广播哈希连接(即BHJ)spark.sql.autoBroadcastJoinThreshold。当指定了连接的两端时,Spark广播统计信息较少的一方。注意Spark不能保证始终选择BHJ,因为并非所有情况(例如完全外部联接)都支持BHJ。当选择广播嵌套循环联接时,我们仍然遵守提示。
import org.apache.spark.sql.functions.broadcast
broadcast(spark.table("src")).join(spark.table("records"), "key").show()