hive優化方式總結

2022-05-07 07:48:09 字數 3417 閱讀 7396

1. 多表join優化**結構:

select .. from jointables (a,b,c) with keys (a.key, b.key, c.key) where ....

關聯條件相同多表join會優化成乙個job

2. leftsemi-join是可以高效實現in/exists子查詢的語義

select a.key,a.value from a where a.key in (select b.key from b);

(1)未實現left semi-join之前,hive實現上述語義的語句是:

select t1.key, t1.valuefrom a  t1

left outer join (select distinctkey from b) t2 on t1.id = t2.id

where t2.id is not null;

(2)可被替換為left semi-join如下:

select a.key, a.valfrom a left semi join b on (a.key = b.key)

這一實現減少至少1次mr過程,注意left semi-join的join條件必須是等值。

3. 預排序減少map  join和group by掃瞄資料hive-1194

(1)重要報表預排序,開啟hive.enforce.sorting選項即可

(2)如果mapjoin中的表都是有序的,這一特性使得join操作無需掃瞄整個表,這將大大加速join操作。可通過

hive.optimize.bucketmapjoin.sortedmerge=true開啟這個功能,獲得高的效能提公升。

set hive.mapjoin.cache.numrows=

10000000

;set hive.mapjoin.size.key

=100000

;insert overwrite table

pv_users

select

/*+mapjoin(pv)

*/pv.pageid,u.age

from

page_view pv

join

user u on (pv.userid=u.userid;

(3)sorted group byhive-931

對已排序的字段做group by可以不再額外提交一次mr過程。這種情況下可以提高執行效率。

4. 次性pv uv計算框架

(1)多個mr任務批量提交

hive.exec.parallel[=false]

hive.exec.parallel.thread.number[=8]

(2) 一次性計算框架,結合multi group by

如果少量資料多個union會優化成乙個job;

反之計算量過大可以開啟批量mr任務提交減少計算壓力;

利用兩次group by 解決count distinct 資料傾斜問題 

set hive.exec.parallel=

true;

set hive.exec.parallel.thread.number=2

;from

select

yw_type,

sum(case

when type=』pv』 then ct end) as

pv,

sum(case

when type=』pv』 then

1end) as

uv,

sum(case

when type=』click』 then ct end) as

ipv,

sum(case

when type=』click』 then

1end) as

ipv_uv

from

(

select

yw_type,log_type,uid,

count(1) as

ct

from

(

select 『total』 yw_type,『pv』 log_type,uid from

pv_log

union

allselect 『cat』 yw_type,『click』 log_type,uid from

click_log

) t

group

byyw_type,log_type

) t

group

byyw_type

) t

insert overwrite table

tmp_1

select

pv,uv,ipv,ipv_uv

where yw_type=

』total』

insert overwrite table

tmp_2

select

pv,uv,ipv,ipv_uv

where yw_type=』cat』;

5. 控制hive中的map和reduce數

(1)合併小檔案

set mapred.max.split.size=

100000000

;set mapred.min.split.size.per.node=

100000000

;set mapred.min.split.size.per.rack=

100000000

;set hive.input.format=

org.apache.hadoop.hive.ql.io.combinehiveinputformat;

hive.input.format=……表示合併小檔案。大於檔案塊大小128m的,按照128m來分隔,小於128m,大於100m的,按照100m來分隔,把那些小於100m的(包括小檔案和分隔大檔案剩下的),進行合併,最終生成了74個塊

(2)耗時任務增大map數

setmapred.reduce.tasks=10;

6. 利用隨機數減少資料傾斜

大表之間join容易因為空值產生資料傾斜 

select

a.uid

from

big_table_a a

left

outer

join

big_table_b b

on b.uid =

case

when a.uid is

null

or length(a.uid)=

0then concat('

rd_sid

',rand()) else a.uid end;

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....

hive的優化方式

一 常見的hive的優化方式有哪些 開啟執行計畫 explain select fetch模式 預設是開啟的,開啟後在全域性查詢 字段查詢 limit查詢等都不走mapreduce 本地模式 資料量小的時候通過本地模式在單台機器上處理所有的任務 開啟本地mr set hive.exec.mode.l...

hive優化要點總結

個人認為總體兩種思想 1 讓伺服器盡可能的多做事情,榨乾伺服器資源,以最高系統吞吐量為目標 再好的硬體沒有充分利用起來,都是白扯淡。比如 1 啟動一次job盡可能的多做事情,乙個job能完成的事情,不要兩個job來做 通常來說前面的任務啟動可以稍帶一起做的事情就一起做了,以便後續的多個任務重用,與此...