hive 針對不同的查詢進行了優化,優化可以通過配置進行控制,本文將介紹部分優化的策略以及優化控制選項。
列裁剪(column pruning)
在讀資料的時候,只讀取查詢中需要用到的列,而忽略其他列。例如,對於查詢:
select a,b from t where e < 10;其中,t 包含 5 個列 (a,b,c,d,e),列 c,d 將會被忽略,只會讀取a, b, e 列
這個選項預設為真: hive.optimize.cp = true
分割槽裁剪(partition pruning)
在查詢的過程中減少不必要的分割槽。例如,對於下列查詢:
select * from (select c1, count(1) from t group by c1) subq where subq.prtn = 100; select * from t1 join (select * from t2) subq on (t1.c1=subq.c2) where subq.prtn = 100;會在子查詢中就考慮 subq.prtn = 100 條件,從而減少讀入的分割槽數目。
此選項預設為真:hive.optimize.pruner=true
join
在使用寫有 join 操作的查詢語句時有一條原則:應該將條目少的表/子查詢放在 join 操作符的左邊。原因是在 join 操作的 reduce 階段,位於 join 操作符左邊的表的內容會被載入進記憶體,將條目少的表放在左邊,可以有效減少發生 oom 錯誤的機率。
對於一條語句中有多個 join 的情況,如果 join 的條件相同,比如查詢:
insert overwrite table pv_users select pv.pageid, u.age from page_view p join user u on (pv.userid = u.userid) join newuser x on (u.userid = x.userid);如果 join 的條件不相同,比如:
insert overwrite table pv_users select pv.pageid, u.age from page_view p join user u on (pv.userid = u.userid) join newuser x on (u.age = x.age);map-reduce 的任務數目和 join 操作的數目是對應的,上述查詢和以下查詢是等價的:
insert overwrite table tmptable select * from page_view p join user u on (pv.userid = u.userid); insert overwrite table pv_users select x.pageid, x.age from tmptable x join newuser y on (x.age = y.age);map join
join 操作在 map 階段完成,不再需要reduce,前提條件是需要的資料在 map 的過程中可以訪問到。比如查詢:
insert overwrite table pv_users select /*+ mapjoin(pv) */ pv.pageid, u.age from page_view pv join user u on (pv.userid = u.userid);可以在 map 階段完成 join,如圖所示:
相關的引數為:
group by
有資料傾斜的時候進行負載均衡
合併小檔案
檔案數目過多,會給 hdfs 帶來壓力,並且會影響處理效率,可以通過合併 map 和 reduce 的結果檔案來消除這樣的影響:
Hive 隨談(二) Hive 結構
hive 的結構如圖所示,主要分為以下幾個部分 使用者介面主要有三個 cli,client 和 wui。其中最常用的是 cli,cli 啟動的時候,會同時啟動乙個 hive 副本。client 是 hive 的客戶端,使用者連線至 hive server。在啟動 client 模式的時候,需要指出 ...
Hive 筆記五 hive的優化
本地模式 嚴格模式 jvm重用 並行執行 推測還行 合併小檔案 fetch模式 1.列裁剪和分割槽裁剪 列裁剪是在查詢時只讀取需要的列 分割槽裁剪就是只讀取需要的分割槽。2.sort by代替 order by 3.group by 代替count distinct 1 common join 普通...
Hive總結(五)hive日誌
日誌記錄了程式執行的過程,是一種查詢問題的利器。hive中的日誌分為兩種 1.系統日誌,記錄了hive的運 況,錯誤狀況。2.job 日誌,記錄了hive 中job的執行的歷史過程。系統日誌儲存在什麼地方呢 在hive conf hive log4j.properties 檔案中記錄了hive日誌的...