Spark每日半小時(27)——Spark SQL性能調優

對於某些工作負載,可以通過在內存中緩存數據或打開一些實驗選項來提高性能。

在內存中緩存數據

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();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章