在海量資料下的資料查詢中,資料傾斜是乙個很恐怖的場景。常常看似很普通的資料查詢,執行了幾個小時也沒有結果,其原因往往是發生了資料傾斜。如果真對資料傾斜採取相應的解決方法,那麼查詢效率將會大大提高。所以,分析資料傾斜是一件相當有意義的任務。本文總結不同情況下的資料傾斜,並分別給出解決方法。
資料傾斜
資料傾斜的實質,是hadoop在mr過程中,對key分發不均勻,導致某些節點上的任務明顯比其他節點多,結果就是hadoop的多數節點空閒,而少數節點不停在執行。這樣就大大降低了任務執行的效率,延長了執行時間。
資料傾斜主要由兩種原因造成。一種是資料本身熱點和非熱點差異很大,存在長尾。比如10億條的資料,大部分都屬於少量的key,而其他大部分key都只佔很少的資料量。這樣在分發key的過程中,大量相同key的資料將會被集中到少量節點,從而造成資料傾斜。這種情況下,需要提前確定熱點資料和非熱點資料,分開處理。
另外一種造成資料傾斜的原因,是在join過程中,表之間的關聯的key造成的。下面重點分析這種情況.
join中的資料傾斜
有兩種情況的join會造成資料傾斜,最常見的是大表和小表(作為從表)的join,這種情況下,大表中大量的key因為找不到小表中的匹配而分發不均勻。這種情況下,需對小表使用mapjoin,將小表提前寫入記憶體,並將join操作提前到map端執行,從而避免資料傾斜。
select /*+mapjoin(b)*/
a.c2,
b.c3
from
(select c1, c2 from t_large)a
left join
(select c1, c3 from t_small)b
on a.c1 = b.c1
另一種情況是當表中空值過多,在分發key的時候,空值聚集造成長尾。這種情況可以將空值處理成隨機值,避免被分發至一處。
select ...
from
(select * from t_large_1)a
left join
(select * from t_large_2)b
on coalsece(a.id, rang()*9999) = b.id
-- coalsece方法處理a.id為null的情況
什麼是資料傾斜,怎麼解決資料傾斜?
相信很多接觸mapreduce的朋友對 資料傾斜 這四個字並不陌生,那麼究竟什麼是資料傾斜?又改怎樣解決這種該死的情況呢?何為資料傾斜?正常的資料分布理論上都是傾斜的,就是我們所說的2 8原理 80 的財富集中在20 的人手中,80 的使用者只使用20 的功能,20 的使用者貢獻了80 的訪問量,不...
資料傾斜2
如何避免因空值或者無意義的異常值引起的資料傾斜?首先檢視是否是這些值導致的傾斜,用select key,count 1 from table group by key。如果是的話,解決方法為 在on時,如下寫 on case when length a.key 符合異常條件 then concat ...
mapreduce資料傾斜
前言 資料傾斜是日常大資料查詢中 的乙個bug,遇不到它時你覺得資料傾斜也就是書本部落格上的乙個無病呻吟的偶然案例,但當你遇到它是你就會懊悔當初怎麼不多了解一下這個赫赫有名的事故。當然你和資料傾斜的緣分深淺還是看你公司的業務邏輯和資料量有沒有步入資料傾斜的領地。說明 關於資料傾斜的產生原因我將結合 ...