核心思想:把hive sql 當做mapreduce程式去優化
以下sql不會轉為mapreduce來執行
select僅查詢本表字段
where僅對本表字段做條件過濾
其實本質上還是轉化為mapreduce來執行的,只不過預設設定了抓取策略:
抓取策略
set hive.fetch.task.conversion=none/more;
explain [extended] query
explain select * from psn;
hive抓取策略:
hive中對某些情況的查詢不需要使用mapreduce計算
抓取策略
set hive.fetch.task.conversion=none/more;
本地模式
集群模式
本地模式:
開啟本地模式:
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、限制執行笛卡爾積的查詢。
order by - 對於查詢結果做全排序,只允許有乙個reduce處理
(當資料量較大時,應慎用。嚴格模式下,必須結合limit來使用)
sort by - 對於單個reduce的資料進行排序distribute by - 分割槽排序,經常和sort by結合使用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
自動的mapjoin
通過修改以下配置啟用自動的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時,其表的最大值)
3、盡可能使用相同的連線鍵(會轉化為乙個mapreduce作業)
4、大表join大表
空key過濾:
空key轉換:
通過設定以下引數開啟在map端的聚合:
set hive.map.aggr=true;
hive.groupby.mapaggr.checkinterval:
map端group by執行聚合時處理的多少行資料(預設:100000)
hive.map.aggr.hash.min.reduction:
進行聚合的最小比例(預先對100000條資料做聚合,若聚合之後的資料量/100000的值大於該配置0.5,則不會聚合)
hive.map.aggr.hash.percentmemory:
map端聚合使用的記憶體的最大值
hive.map.aggr.hash.force.flush.memory.threshold:
map端做聚合操作是hash表的最大可用內容,大於該值則會觸發flush
hive.groupby.skewindata
是否對groupby產生的資料傾斜做優化,預設為false
檔案數目小,容易在檔案儲存端造成壓力,給hdfs造成壓力,影響效率
設定合併屬性
是否合併map輸出檔案:hive.merge.mapfiles=true
是否合併reduce輸出檔案:hive.merge.mapredfiles=true;
合併檔案的大小:hive.merge.size.per.task=25610001000
去重統計
資料量小的時候無所謂,資料量大的情況下,由於count distinct操作需要用乙個reduce task來完成,這乙個reduce需要處理的資料量太大,就會導致整個job很難完成,一般count distinct使用先group by再count的方式替換
map數量相關的引數
mapred.max.split.size
乙個split的最大值,即每個map處理檔案的最大值
mapred.min.split.size.per.node
乙個節點上split的最小值
mapred.min.split.size.per.rack
乙個機架上split的最小值
reduce數量相關的引數
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的優化方案
對資料進行分割槽,可以將資料以一種符合邏輯的方式進行組織 比如分層儲存 同時極大提高查詢效能。在建立表的時候,根據後續查詢需求 partitioed by 對資料進行合理的分割槽,下面我們根據 province 和 city 進行對資料進行分割槽分割槽 create table if not exi...
HIVE優化 解決方案
1.開啟並行引數 set hive.exec.parallel true set hive.exec.parallel.thread.number 16 同乙個sql允許最大並行度,預設為8 2.負載均衡引數 只針對groupby操作的傾斜 set hive.groupby.skewindata t...
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...