天天看點

Hive解決資料傾斜方法

根本原因:資料過于集中。解決的基本思路:打散。

容易産生資料傾斜的幾種情況:count distinct、group by key、Join。

  1. count distinct :

     資料量小的時候無所謂,資料量大的情況下,由于COUNT DISTINCT操作需要用一個Reduce Task來完成,這一個Reduce需要處理的資料量太大,就會導緻整個Job很難完成,一般COUNT DISTINCT使用先GROUP BY再COUNT的方式替換。

  1. group by key:

     兩種解決方法:第一種解決方案1)設定參數:這裡有兩個參數。i)開啟map端聚合。

           ii)有資料傾斜的時候開啟負載均衡。開啟了負載均衡以後,會生成兩個mr,第一個mr會打散資料,也就是随機分發資料,進行局部聚合;第二個mr根據group by key的邏輯完成全局聚合。

2)手動優化sql:

兩階段聚合,加鹽局部聚合,去鹽全局聚合。(利用random構造輔助列,先group by  key,random,進行局部聚合;再group by key完成全局聚合)。

  1. Join:

       檢視日志找到傾斜的key。

  1. 如果傾斜的key是髒資料,直接過濾掉;
  2. 增加reduce個數;
  3. 如果兩個表join的時候,一個表為小表,可以用mapjoin做。
  4. 如果是兩個大表join,并且傾斜的 key 有實際的意義,可以将它們單獨抽取出來,對應的行單獨存入臨時表中,然後打上一個較小的随機數字首(比如0~9),最後再進行聚合。
  5. 設定hive.optimize.skewjoin=true。

繼續閱讀