Hive優化

原文鏈接:https://www.cnblogs.com/sandbank/p/6408762.html

本文主要參考文獻:

 

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. 本地模式

 

 

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