1. 程式人生 > >hive.map.aggr、hive.groupby.skewindata執行過程

hive.map.aggr、hive.groupby.skewindata執行過程

如果設定hive.map.aggr為true,hive.groupby.skewindata為true,執行流程如下:

這裡寫圖片描述

  1. 會生成兩個job來執行group by,第一個job中,各個map是平均讀取分片的,在map階段對這個分片中的資料根據group by 的key進行區域性聚合操作,這裡就相當於Combiner操作。
  2. 在第一次的job中,map輸出的結果隨機分割槽,這樣就可以平均分到reduce中
  3. 在第一次的job中,reduce中按照group by的key進行分組後聚合,這樣就在各個reduce中又進行了一次區域性的聚合。
  4. 因為第一個job中分割槽是隨機的,所有reduce結果的資料的key也是隨機的,所以第二個job的map讀取的資料也是隨機的key,所以第二個map中不存在資料傾斜的問題。
  5. 在第二個job的map中,也會進行一次區域性聚合。
  6. 第二個job中分割槽是按照group by的key分割槽的,這個地方就保證了整體的group by沒有問題,相同的key分到了同一個reduce中。
  7. 經過前面幾個聚合的區域性聚合,這個時候的資料量已經大大減少了,在最後一個reduce裡進行最後的整體聚合。

這裡寫圖片描述