hive 優化超全

2021-09-19 04:34:15 字數 3418 閱讀 5582

select僅查詢本表字段

where僅對本表字段做條件過濾

explain 顯示執行計畫

explain [extended] query

hive執行方式:

本地模式 將資料抓取到本地 計算

集群模式 計算向資料移動 主要耗費時間是 提交任務 和 yarn 資源管理

本地模式

開啟本地模式:

set hive.exec.mode.local.auto=true; 測試可以用

注意:hive.exec.mode.local.auto.inputbytes.max預設值為128m

表示載入檔案的最大值,若大於該配置仍會以集群方式來執行!

通過設定以下引數開啟並行模式:

set hive.exec.parallel=true;

注意:hive.exec.parallel.thread.number

(一次sql計算中允許並行執行的job個數的最大值)

通過設定以下引數開啟嚴格模式:

—防止使用者誤操作

set hive.mapred.mode=strict;

(預設為:nonstrict非嚴格模式)

查詢限制:

1、對於分割槽表,必須新增where對於分割槽欄位的條件過濾; 優化查詢

2、order by語句必須包含limit輸出限制; 這樣就使得效能不會耗費太多

3、限制執行笛卡爾積的查詢。

1、order by - 對於查詢結果做全排序,只允許有乙個reduce處理

(當資料量較大時,應慎用。嚴格模式下,必須結合limit來使用)

2、sort by - 對於單個reduce的資料進行排序

distribute by - 分割槽排序,經常和sort by結合使用(distribute by+sort by 相當於 全排序)

3、cluster by - 相當於 sort by + distribute by

(cluster by不能通過asc、desc的方式指定排序規則;

可通過 distribute by column sort by column asc|desc 的方式)

join計算時,將小表(驅動表)放在join的左邊

map join:在map端完成join

優先將小表載入到記憶體裡 不至於 太耗費記憶體

小表放左邊

兩種實現方式:

1、sql方式,在sql語句中新增mapjoin標記(mapjoin hint)

語法:select /*+ mapjoin(smalltable) */ smalltable.key, bigtable.value

from smalltable join bigtable on smalltable.key = bigtable.key;

2、開啟自動的mapjoin 自動檢查

split map shuffle reduce

shuffle是非常耗費資源的 所以 join 最好咋split map完成

怎麼實現?

小表載入到記憶體中 大表一行一行的讀取 如果有相同的 map就直接輸出 這樣就完成了

通過修改以下配置啟用自動的mapjoin:

set hive.auto.convert.join = true;

(該引數為true時,hive自動對左邊的表統計量,如果是小表就加入記憶體,即對小表使用map join)

相關配置引數:

hive.mapjoin.smalltable.filesize;

(大表小表判斷的閾值,如果表的大小小於該值則會被載入到記憶體中執行)

hive.ignore.mapjoin.hint;

(預設值:true;是否忽略mapjoin hint 即mapjoin標記)

hive.auto.convert.join.noconditionaltask;

(預設值:true;將普通的join轉化為普通的mapjoin時,是否將多個mapjoin轉化為乙個mapjoin)

hive.auto.convert.join.noconditionaltask.size;

(將多個mapjoin轉化為乙個mapjoin時,其表的最大值)

通過設定以下引數開啟在map端的聚合:

set hive.map.aggr=true;

相關配置引數:

1、hive.groupby.mapaggr.checkinterval:

map端group by執行聚合時處理的多少行資料(預設:100000) 可以設定合理數字

2、hive.map.aggr.hash.min.reduction:

進行聚合的最小比例(預先對100000條資料做聚合,若聚合之後的資料量/100000的值大於該配置0.5,則不會聚合 )

3、hive.map.aggr.hash.percentmemory:

map端聚合使用的記憶體的最大值

4、hive.map.aggr.hash.force.flush.memory.threshold:

map端做聚合操作是hash表的最大可用內容,大於該值則會觸發flush

5、hive.groupby.skewindata

是否對groupby產生的資料傾斜做優化,預設為false

解決資料傾斜問題 實現思路:

乙個mr 會分成兩個mr 來做

第乙個mr : map 隨機分發 reduce 獲取到是比較均勻 區域性聚合 count

第二個mr : map 自己的規則 (資料已經不是特別大了) reduce的壓力不會太大

mapred.max.split.size

乙個split的最大值,即每個map處理檔案的最大值

mapred.min.split.size.per.node

乙個節點上split的最小值

mapred.min.split.size.per.rack

乙個機架上split的最小值

改變切片就行 改變切片就是 相當於改變 map 因為乙個切片就是乙個map

split 切片規則:

如果乙個map處理檔案最大值是64m 但是乙個block是70m 剩下6m 的資料 和 其他節點剩下的資料 全部會作為乙個split

mapred.reduce.tasks

強制指定reduce任務的數量

hive.exec.reducers.bytes.per.reducer

每個reduce任務處理的資料量

hive.exec.reducers.max

每個任務最大的reduce數

適用場景:

1、小檔案個數過多

2、task個數過多

通過 set mapred.job.reuse.jvm.num.tasks=n; 來設定 (n為task插槽個數)

缺點:設定開啟之後,task插槽會一直占用資源,不論是否有task執行,直到所有的task即整個job全部執行完成時,才會釋放所有的task插槽資源!

hive 幾種hive優化方法

1.通過explain或者explain extended來檢視執行計畫。explain select from u3 執行結果 stage dependencies stage 0 is a root stage stage plans stage stage 0 fetch operator l...

超實用 超全 Vim 必會快捷操作

vim 操作 在nomal模式 冒號都是必須輸入的 左h下j上k右l 練習 delete刪除乙個游標 i 插入 r 替換乙個字元 在某個字元先按r再按要替換的字元 退回 u 反退回 ctrl r 刪除整行 dd 刪除多行 數字 dd 如2dd 刪除兩行 選中行模式 v 選中後 y複製 p貼上 選中列...

Hive 優化總結

1.left semi join let semi join 只是hive的一種join。left semi join是可以高效實現in exists子查詢的語義。hive本身是不支援exist和in語句的,以下sql語義 1 select a.key,a.value from a where a....