SparkSQL訪問Hive分區表啟動Job前耗時較長如何處理?
更新時間 2023-12-05 17:43:26
最近更新時間: 2023-12-05 17:43:26
分享文章
本章節主要介紹翼MapReduce組件Spark使用的常見問題。
問題說明
使用Spark SQL 訪問Hive 表的一個表分區,但是運行速度卻很慢。
分析樣例:
select** x,y from test where **x=1?(其中x是test表的?Partition?字段)
原因分析
按照spark 源碼邏輯,在解析邏輯計劃時候回去調用 getPartitionsByFilter方法 去hive中只提取 x=1 分區信息。
但是由于一些原因,導致getPartitionsByFilter 的謂詞下推失敗,從而去全表掃描所有test的分區信息,并返回。
例如,我們x字段是String類型,但是我們的SQL中不是 where x=’1’ ,而是where x=1 ,這就導致了謂詞下推失敗。
出現hive分區表謂詞下推失敗的情況,我們可以做如下處理:
- 我們需要去檢查sql中的寫法是否正確。
- 可以關閉SQL邏輯計劃解析過程中的謂詞下推邏輯。
處理步驟
關閉SQL邏輯計劃解析過程中的謂詞下推邏輯,具體是Spark SQL默認開啟基于分區統計信息的執行計劃優化,相當于自動執行Analyze Table(默認開啟的設置方法為spark.sql.statistics.fallBackToHdfs=true,可通過配置為false關閉)。
開啟后,SQL執行過程中會掃描表的分區統計信息,并作為執行計劃中的代價估算,例如對于代價評估中識別的小表,會廣播小表放在內存中廣播到各個節點上,進行join操作,大大節省shuffle時間。
此開關對于Join場景有較大的性能優化,但是會帶來 獲取分區表信息RPC請求 的增加。
在SparkSQL中設置以下參數后再運行:
set spark.sql.statistics.fallBackToHdfs=false;
或者在啟動之前使用--conf設置這個值為false:
--conf spark.sql.statistics.fallBackToHdfs=false