本文主要參考文獻:
- 《Hive編程指南》
- 數據分析利器之hive優化十大原則
- 優化一:hive.auto.convert.join
1. limit 調整以語句快速出結果
很多情況下,Limit語句還是需要執行整個查詢語句,然後再返回部分結果。有一個配置屬性可以開啓,用於對數據源進行抽樣,從而避免執行整個查詢語句。
- hive.limit.optimize.enable=true --- 開啓對數據源進行採樣的功能
- hive.limit.row.max.size --- 設置最小的採樣容量
- hive.limit.optimize.limit.file --- 設置最大的採樣樣本數
缺點:有可能部分數據永遠不會被處理到
2. Join優化
(1)使用相同的連接鍵
當對3個或者更多個表進行join連接時,如果每個on子句都使用相同的連接鍵的話,那麼只會產生一個MapReduce job。
(2)使得表從小到大join 或者 用語句標記最大表
- Hive假定查詢中最後的一個表是大表。在對每行Join時它會將其它表緩存起來,然後掃描最後那個表進行計算。因此需要保證連接查詢中的表的大小是從左到右依次增加的。
- 或者直接標記最大表:/*streamtable(table_name) */
(3)若有小表可以載入內存,可以執行map-side Join
如果所有表中只有一張表是小表,那麼可以在最大的表通過mapper的時候將小表完全放到內存中。Hive可以在map端執行連接過程(稱爲map-side JOIN),因爲Hive可以和內存中的小表進行逐一匹配,從而省略掉常規連接操作所需要的reduce過程。
- Hive v0.7版本之前:/*+ MAPJOIN(table_name) */
- Hive v0.7版本及之後:
--(廢棄了以上標記方式,但以上標記方式仍然有效。 )
--是否自動轉換爲mapjoin
hive.auto.convert.JOIN=true
--小表的最大文件大小,默認爲25000000,即25M
set hive.mapjoin.smalltable.filesize = 25000000;
--是否將多個mapjoin合併爲一個
set hive.auto.convert.join.noconditionaltask = true;
--多個mapjoin轉換爲1個時,所有小表的文件大小總和的最大值。
set hive.auto.convert.join.noconditionaltask.size = 10000000;
(4)儘量儘早地過濾數據
減少每個階段的數據量,對於分區表要加分區,同時只選擇需要使用到的字段。
3. 本地模式