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容易因為空值產生資料傾斜
selecta.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來做 通常來說前面的任務啟動可以稍帶一起做的事情就一起做了,以便後續的多個任務重用,與此...