當前位置:成語大全網 - 書法字典 - MR實現全排序

MR實現全排序

默認情況下,mr只對鍵進行排序。我們所說的全排序是鍵的全排序。

這是最簡單的思考方式。

具有實施簡單的優點,

缺點也很明顯。縮減可能很慢,並且不能利用分布式優勢。

通過重寫Partition類,將鍵發送到壹個範圍內的固定reduce,這樣鍵在壹個reduce內完全排序,reduce也按照序號排序。例如,key代表壹個年齡。我們可以將數據輸出到10 reduer。1-10歲將被發送到第0次減少,11-20將被發送到第2次減少,以此類推。

缺點是這種劃分可能不均衡。

所以總排序的總體思路是:保證分區有序就可以了,也就是保證Partition1的最大值小於Partition2的最小值就可以了。

即便如此,仍然存在壹個問題:分區的不均勻分布可能會導致壹些分區比其他分區處理更多的數據。

實現全排序的核心步驟是:采樣和分區。

首先“取樣”以確保更均勻的分區:

我們知道Mapreduce框架會在將數據輸入reducer之前對map輸出鍵進行排序。這種排序機制確保每個縮減器都是本地排序的。hadoop的默認分區器是HashPartitioner,它依賴於output key的hashcode。因此相同的鍵將到達相同的縮減器,但是全局順序沒有保證。如果想得到全局排序結果(比如得到top N,bottom N),就需要使用TotalOrderPartitioner,這樣既保證了同壹個鍵去同壹個reducer,也保證了全局順序。

TotalOrderPartitioner依靠分區文件來分發密鑰。分區文件是壹個計算序列文件。如果我們設置的reducer號是N,那麽這個文件包含(N-1)個key分區點,並且是基於key比較器排序的。TotalOrderPartitioner會檢查每個鍵屬於哪個reducer,然後決定分發給哪個reducer。

InputSampler類的writePartitionFile方法對輸入文件進行采樣並創建壹個分區文件。有三種采樣方法:

參考:MapReduce如何實現全排序?