数据倾斜问题分析
文章出處:https://www.jianshu.com/p/539415d06f1b
大數(shù)據(jù)----“數(shù)據(jù)傾斜”的問題
一、Hadoop中的數(shù)據(jù)傾斜:
什么是數(shù)據(jù)傾斜?(見下圖)
簡單來說數(shù)據(jù)傾斜就是數(shù)據(jù)的key 的分化嚴(yán)重不均,造成一部分?jǐn)?shù)據(jù)很多,一部分?jǐn)?shù)據(jù)很少的局面。
舉個(gè) word count 的入門例子: 它的map 階段就是形成 (“aaa”,1)的形式,然后在reduce 階段進(jìn)行 value 相加,得出 “aaa” 出現(xiàn)的次數(shù)。若進(jìn)行 word count 的文本有100G,其中 80G 全部是 “aaa” 剩下 20G 是其余單詞,那就會(huì)形成 80G 的數(shù)據(jù)量交給一個(gè) reduce 進(jìn)行相加,其余 20G 根據(jù) key 不同分散到不同 reduce 進(jìn)行相加的情況。如此就造成了數(shù)據(jù)傾斜,臨床反應(yīng)就是 reduce 跑到 99%然后一直在原地等著 那80G 的reduce 跑完。
這里如果詳細(xì)的看日志或者和監(jiān)控界面的話會(huì)發(fā)現(xiàn):
?
有一個(gè)多幾個(gè)reduce卡住
各種container報(bào)錯(cuò)OOM
讀寫的數(shù)據(jù)量極大,至少遠(yuǎn)遠(yuǎn)超過其它正常的reduce
伴隨著數(shù)據(jù)傾斜,會(huì)出現(xiàn)任務(wù)被kill等各種詭異的表現(xiàn)。
二、導(dǎo)致的原因分為幾種情況:
1.單個(gè)值有大量記錄
單個(gè)值有大量記錄, 這種值的所有紀(jì)錄已經(jīng)超過了分配給reduce 的內(nèi)存,無論你怎么樣分區(qū)這種情況都不會(huì)改變. 當(dāng)然這種情況的限制也非常明顯, 1.內(nèi)存的限制存在,2.可能會(huì)對集群其他任務(wù)的運(yùn)行產(chǎn)生不穩(wěn)定的影響.
解決方法:(1)增加reduce 的jvm內(nèi)存(效果可能不好)
或者(2)在 key 上面做文章,在 map 階段將造成傾斜的key 先分成多組,例如 aaa 這個(gè) key,map 時(shí)隨機(jī)在 aaa 后面加上 1,2,3,4 這四個(gè)數(shù)字之一,把 key 先分成四組,先進(jìn)行一次運(yùn)算,之后再恢復(fù) key 進(jìn)行最終運(yùn)算。
(在MapReduce/spark,該方法常用)
2.唯一值較多
唯一值較多,單個(gè)唯一值的記錄數(shù)不會(huì)超過分配給reduce 的內(nèi)存. 如果發(fā)生了偶爾的數(shù)據(jù)傾斜情況,增加reduce 個(gè)數(shù)可以緩解偶然情況下的某些reduce 不小心分配了多個(gè)較多記錄數(shù)的情況.
解決辦法: 增加reduce 個(gè)數(shù)
3.以上兩種都無效的情況
一個(gè)固定的組合重新定義
解決辦法:自定義partitioner
4.從業(yè)務(wù)和數(shù)據(jù)上解決數(shù)據(jù)傾斜
我們能通過設(shè)計(jì)的角度嘗試解決它。
(1)有損的方法:
找到異常數(shù)據(jù),比如ip為0的數(shù)據(jù),過濾掉
(2)無損的方法:
對分布不均勻的數(shù)據(jù),單獨(dú)計(jì)算
先對key做一層hash,先將數(shù)據(jù)打散讓它的并行度變大,再匯集
(3)數(shù)據(jù)預(yù)處理;
5.平臺的優(yōu)化方法
1.join 操作中,使用 map join 在 map 端就先進(jìn)行 join ,免得到reduce 時(shí)卡住;
2.能先進(jìn)行 group 操作的時(shí)候先進(jìn)行 group 操作,把 key 先進(jìn)行一次 reduce,之后再進(jìn)行 count 或者 distinct count 操作;
3. 設(shè)置map端輸出、中間結(jié)果壓縮;
大家喜歡多多關(guān)注,你的關(guān)注是我最大的動(dòng)力,會(huì)不定期更新
總結(jié)
- 上一篇: 有源晶振和无源晶振的输出波形
- 下一篇: 互联网晚报 | 2月28日 星期一 |