大資料----“資料傾斜”的問題
一、Hadoop中的資料傾斜:
什麼是資料傾斜?(見下圖)
簡單來說資料傾斜就是資料的key 的分化嚴重不均,造成一部分資料很多,一部分資料很少的局面。
舉個 word count 的入門例子: 它的map 階段就是形成 (“aaa”,1)的形式,然後在reduce 階段進行 value 相加,得出 “aaa” 出現的次數。若進行 word count 的文字有100G,其中 80G 全部是 “aaa” 剩下 20G 是其餘單詞,那就會形成 80G 的資料量交給一個 reduce 進行相加,其餘 20G 根據 key 不同分散到不同 reduce 進行相加的情況。如此就造成了資料傾斜,臨床反應就是 reduce 跑到 99%然後一直在原地等著 那80G 的reduce 跑完。
這裡如果詳細的看日誌或者和監控介面的話會發現:
有一個多幾個reduce卡住
各種container報錯OOM
讀寫的資料量極大,至少遠遠超過其它正常的reduce
伴隨著資料傾斜,會出現任務被kill等各種詭異的表現。
二、導致的原因分為幾種情況:
1.單個值有大量記錄
單個值有大量記錄, 這種值的所有紀錄已經超過了分配給reduce 的記憶體,無論你怎麼樣分割槽這種情況都不會改變. 當然這種情況的限制也非常明顯, 1.記憶體的限制存在,2.可能會對叢集其他任務的執行產生不穩定的影響.
解決方法:(1)增加reduce 的jvm記憶體(效果可能不好)
或者(2)在 key 上面做文章,在 map 階段將造成傾斜的key 先分成多組,例如 aaa 這個 key,map 時隨機在 aaa 後面加上 1,2,3,4 這四個數字之一,把 key 先分成四組,先進行一次運算,之後再恢復 key 進行最終運算。
(在MapReduce/spark,該方法常用)
2.唯一值較多
唯一值較多,單個唯一值的記錄數不會超過分配給reduce 的記憶體. 如果發生了偶爾的資料傾斜情況,增加reduce 個數可以緩解偶然情況下的某些reduce 不小心分配了多個較多記錄數的情況.
解決辦法: 增加reduce 個數
3.以上兩種都無效的情況
一個固定的組合重新定義
解決辦法:自定義partitioner
4.從業務和資料上解決資料傾斜
我們能通過設計的角度嘗試解決它。
(1)有損的方法:
找到異常資料,比如ip為0的資料,過濾掉
(2)無損的方法:
對分佈不均勻的資料,單獨計算
先對key做一層hash,先將資料打散讓它的並行度變大,再彙集
(3)資料預處理;
5.平臺的優化方法
1.join 操作中,使用 map join 在 map 端就先進行 join ,免得到reduce 時卡住;
2.能先進行 group 操作的時候先進行 group 操作,把 key 先進行一次 reduce,之後再進行 count 或者 distinct count 操作;
3. 設定map端輸出、中間結果壓縮。
瀋陽性病醫院:http://www.120sysdyy.com/
瀋陽尖銳溼疣醫院:http://www.sdxb024.com/