SparkSQL性能優化

一、設置Shuffle過程中的並行度

設置參數:SQLContext.setConf("spark.sql.shuffle.prititions",xxx);

 

二、設置合理的數據類型

在Hive數據倉庫建設過程中,合理設置數據類型,比如能設置爲IINT的,就不要設置成BIGINT,減少數據類型導致的不必要的內存開銷。

 

三、明確列名

編寫SQL是,儘量給出明確的列明,比如select name from students。不要寫成select * from students。

 

四、並行處理查詢結果

對SparkSQL查詢的結果,如果數據量比較大,比如超過了1000條,不要一次性collect()到Driver再處理。使用foreach()算子,並行處理查詢結果。

 

五、緩存表

對於一條SQL語句中可能多次使用到的表,可以對其進行緩存,使用SQLContext.cacheTable(tableName),或者DataFrame.cache()即可。SparkSQL會用內存列存儲的格式進行表的緩存。然後SparkSQL就可以僅僅掃描需要使用的列,並且自動優化壓縮,來最小化內存使用和GC開銷。SQLContext.uncacheTable(tableName)可以將表從緩存中移除。用SQLContext.setConf(),設置spark.sql.inMemoryColumnarStorage.batchSize參數(默認10000),可以配置列存儲的單位。

 

六、廣播join表

spark.sql.autoBroadcastJoinTreshold,默認10485760(10MB)。再內存夠用的情況下,減小其大小,可以將join中的較小的表廣播出去,而不用進行網絡數據輸出。注意:大小不超過設置值的表,都會被廣播出去。

 

七、鎢絲計劃

spark.sql.tungsten.enabled,默認是true,自動管理內存。

 

通常情況下,使用第四條——並行處理查詢結果。緩存表和廣播join表,效果也還可不錯。

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