目錄
方案一 硬編碼
方案二 map join
方案1:硬編碼,將傾斜的值打散。
方案2:map join
背景:多張表在進行關聯時,可能有乙個key的值非常多,導致某個reduce處理時間過久,此時產生了資料傾斜。
方案1是用拆分空值和總量較多的key值進行優化。
舉例:table 2和table 1關聯,key為ucid,table 2 的ucid非常隨機,且有一兩條ucid為-911的資料,總體沒有傾斜。
table1的資料中有許多ucid=-911的資料,假如說是1000w條,那麼在關聯的時候肯定會出現資料傾斜。
先判斷這部分key值是否實際有用,如果沒有用,直接轉換成隨機值,將資料打散。
關聯條件為:
on if(table1.ucid=-911,rand(),table1.ucid) = table2.ucid
如果-911的資料是有用的,則需要做其它處理。
在table1中將-911的資料進行「**」處理:
if(table1.ucid=-911,concat(table1.ucid,'_',pmod(ceil(rand()*1000000),10)),table1.ucid) as table1.ucid
對table2中-911的資料進行「翻倍」處理:
select
ucid
from
table2
--關聯值-911擴充套件10倍
union
select '-911_0' as ucid
union
select '-911_1' as ucid
union
select '-911_2' as ucid
union
select '-911_3' as ucid
union
select '-911_4' as ucid
union
select '-911_5' as ucid
union
select '-911_6' as ucid
union
select '-911_7' as ucid
union
select '-911_8' as ucid
union
select '-911_9' as ucid
然後進行關聯
(
select
ucid
from
table1
)aleft join
( select
ucid
from
table2
--關聯值-911擴充套件10倍
union
select '-911_0' as ucid
union
select '-911_1' as ucid
union
select '-911_2' as ucid
union
select '-911_3' as ucid
union
select '-911_4' as ucid
union
select '-911_5' as ucid
union
select '-911_6' as ucid
union
select '-911_7' as ucid
union
select '-911_8' as ucid
union
select '-911_9' as ucid
)bon a.ucid=b.ucid
關聯之後別忘記在最外層將table1的ucid還原回來喔(如果要使用的話)
這種方案屬於硬編碼,只能針對特定的情況進行處理。
將table2作為小表進行map join。
設定引數:
set hive.auto.convert.join=true;
set hive.auto.convert.join.noconditionaltask.size = 30000000;(可根據實際情況設定)
如果table2過大,則做列裁剪。
這樣及時table1有幾千萬條-911的資料,也是在map端就能關聯完,不會涉及到shuffle到reduce上進行處理。
這種方法比較通用,不用做太多處理,且如果table2需要關聯多次,則可以將table2作為臨時表處理。
資料傾斜解決方案
資料傾斜定義 簡單的講,資料傾斜就是我們在資料計算的時候,由於資料的分散度不夠,導致大量的資料集中到了一台或者幾台機器上計算,這些機器的計算速度遠遠低於整個集群的平均計算速度,導致整個計算過程十分緩慢。常見資料傾斜現象 資料傾斜往往會發生在資料開發的各個環節中,比如 用hive資料計算的時候redu...
資料傾斜解決方案
1 聚合原資料 主要操作的是hive資料庫中的資料,先通過hive sql將相同key的資料聚合成一條資料,再進行map操作 當沒辦法聚合成一條資料時 增大key粒度,從而key的數量會減少,但是每個key對應的資料量會增大,key之間的資料量差異可能會減少。2 過濾導致傾斜的key 3 提高shu...
MR資料傾斜解決方案
1.資料傾斜 由於mapreduce程式是按照key的hash值進行分割槽的 如果某些單詞特別多 特別多的單詞就會被分到同乙個reduce去處理 有些reducere任務處理的資料量小 有些reduce任務處理的資料量非常大 只有所有的reduce任務完成以後job才算完成 造成job的工作時間變長...