Hive 隨談(五) Hive 優化

2021-06-16 10:10:43 字數 1818 閱讀 5050

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日誌的...