對於某些工作負載,可以通過在內存中緩存數據或打開一些實驗選項來提高性能。
在內存中緩存數據
Spark SQL可以通過調用spark.catalog.cacheTable("tableName")或者使用內存中的列式格式來緩存表dataFrame.cache()。然後,Spark SQL將僅掃描所需的列,並自動調整壓縮以最小化內存使用和GC壓力。我們可以調用spark.catalog.uncacheTable("tableName")從內存中刪除表。
可以使用SparkSession SQL setConf上的方法或通過SET key=value使用SQL運行命令來完成內存中緩存的配置。
屬性名稱 | 默認 | 含義 |
spark.sql.inMemoryColumnarStorage.compressed | true | 設置爲true時,Spark SQL將根據數據統計信息自動爲每列選擇壓縮編解碼器 |
spark.sql.inMemoryColumnarStorage.batchSize | 10000 | 控制柱狀緩存的批次大小。較大的批處理大小可以提高內存利用率和壓縮比,但在緩存數據時存在OOM風險。 |
其他配置選項
以下選項也可用於調整查詢執行的性能。由於更多優化會自動執行,因此在將來的版本中可能會啓用這些選項,但至少2.3.0版本還在使用。一起來看看吧:
屬性名稱 | 默認 | 含義 |
spark.sql.files.maxPartitionBytes | 134217728(128MB) | 讀取文件時打包到單個分區的最大字節數。 |
spark.sql.files.openCostInBytes | 4194304(4MB) | 可以在同一時間掃描通過字節數測量大的打開文件的估計成本。將多個文件放入分區時使用。過度估計會更好,那麼帶有小文件的分區將比具有更多大文件的分區(首先安排的分區)更快。 |
spark.sql.broadcastTimeout | 300 | 廣播連接中廣播等待時間的超時(以秒爲單位) |
spark.sql.autoBroadcastJoinThreshold | 10485760(10MB) | 配置在執行連接時將廣播到所有工作節點的表最大值(以字節爲單位)。通過將此值設置爲-1,可以禁用廣播。注意,目前只有ANALYZE TABLE<tableName> COMPUTE STATISTICS noscan運行該命令的Hive Metastore表支持統計信息。 |
spark.sql.shuffle.partitions | 200 | 配置在爲連接或聚合洗牌數據時要使用的分區數。 |
SQL查詢的廣播提示
當與其他表或視圖聯合時,BROADCAS會提示引導Spark廣播每個指定的表。當Spark確定連接方式時,廣播散列連接(即BHJ)是首選,即使統計數據高於配置spark.sql.autoBroadcastJoinThreashold。指定連接的兩端時,Spark會廣播具有較低統計信息的那一方。注意Spark並不保證始終選擇BHJ,因爲並非所有情況(例如:全外連接)都支持BHJ。當選擇廣播嵌套循環連接時,我們仍尊重引導。
import static org.apache.spark.sql.functions.broadcast;
broadcast(spark.table("src")).join(spark.table("records"), "key").show();