hive優化方案

2021-09-27 08:24:38 字數 3858 閱讀 2365

核心思想:把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...