1. 程式人生 > >kevin_xiang的專欄,mail: [email protec

kevin_xiang的專欄,mail: [email protec

解決

利用 Reducer 拿到的輸入是有序的這一特性,Mapper 和 Recuder 如果都用 identity function,那麼每個 Reducer 的輸出都是有序的,但 Reducer 之間無法保證有序。

如果用歸併排序的思路, 那麼最後還需要一個只有一個 Reducer 的 Mapreduce 任務對所有資料做一次 merge,這顯然是無法接受的。

真正可行的演算法是 桶排序 。回顧桶排序的過程,它首先將資料分佈範圍劃分為若干個桶,接著遍歷一遍元素並分配到對應的桶中,然後對每個桶做一次排序,因為桶之間是有序的,所以不需要 merge。

在 Mapreduce 中,Partitioner 負責劃分桶。舉個例子,假設資料分佈在 1 到 1w 之間,我們可以將其劃分為 10 個桶,同時用 10 個 Reducer 處理每個桶內的資料,這樣 Reducer 間就是有序的。為了實現這個效果,可以用一個自定義的Partitioner,將 Mapper 輸出劃分到上述 10 個桶內即可。