天天看點

Hive資料傾斜問題

  • 資料傾斜的現象:
    • 簡單來說,就是一個reduce累死,其他reduce閑死
    • 用Hive算資料的時候reduce階段卡在99.99%
    • 用SparkStreaming做實時算法時候,一直會有executor出現OOM的錯誤,但是其餘的executor記憶體使用率卻很低。
    • 各種container報錯OOM
    • 讀寫的資料量極大,至少遠遠超過其它正常的reduce ,伴随着資料傾斜,會出現任務被kill等各種詭異的表現。
  • 資料傾斜的原因:
    • 資料分布不均勻,某個值有大量記錄(null、空等情況),這種值的所有紀錄已經超過了配置設定給reduce 的記憶體,無論你怎麼樣分區這種情況都不會改變. 當然這種情況的限制也非常明顯, 1.記憶體的限制存在,2.可能會對叢集其他任務的運作産生不穩定的影響.

    解決方法:1.增加reduce 的jvm記憶體(效果可能不好)

    2. 在 key 上面做文章,在 map 階段将造成傾斜的key 先分成多組,例如 aaa 這個 key,map 時随機在 aaa 後面加上 1,2,3,4 這四個數字之一,把 key 先分成四組,先進行一次運算,之後再恢複 key 進行最終運算。

  • 從業務和資料上解決資料傾斜

我們能通過設計的角度嘗試解決它。

(1)有損的方法:

找到異常資料,比如ip為0的資料,過濾掉

(2)無損的方法:

對分布不均勻的資料,單獨計算

先對key做一層hash,先将資料打散讓它的并行度變大,再彙集

(3)資料預處理;

5.平台的優化方法

1.join 操作中,使用 map join 在 map 端就先進行 join ,免得到reduce 時卡住;

2.能先進行 group 操作的時候先進行 group 操作,把 key 先進行一次 reduce,之後再進行 count 或者 distinct count 操作;

  1. 設定map端輸出、中間結果壓縮;