2015-12-07 30 views
0

當我使用函數job.setNumReduceTasks(1);時,我得到按鍵排序的輸出。但是,當我刪除此功能時,輸出未按鍵排序。減速器的數量和輸出順序

那麼,當我們有多個reducer任務時,我們是否應該期望從reducer獲得排序輸出?

謝謝。

+0

你能詳細說明嗎?你能給出一些數據來顯示reducer輸出沒有排序嗎? –

+0

看看http://stackoverflow.com/questions/33298159/difference-between-partial-sort-total-sort-and-secondary-sort-in-hadoop/33301253#33301253和http://blog.zaloni的.com /二次分揀中的hadoop –

回答

1

輸出在單個Reducer內的鍵上排序。然而,默認的分區程序是散列函數的結果,因此,如果使用多個Reducers,每個文件將被排序,但一個文件不會是最後一個文件的排序延續。例如:

我們有三個Reducers字數工作。該映射器輸出:

(A,1) 
(zebra,1) 
(bat,1) 
(zebra,1) 
(frog,1) 
(A,1) 

分區程序如下所示

public int getPartition(K key, V value, int numReduceTasks) { 
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 
} 

,所以它可以通過以下方式分配鍵:

REDUCER 1 REDUCER 2 REDUCER 3 
(A,1)  (frog,1)  (bat,1) 
(A,1)  
(zebra,1) 

注意Reducer 1不含AF,Reducer 2不包含GM,Reducer 3不包含NZ,即它不是按字母順序拆分。這就是爲什麼總體輸出不會被排序的原因,但是數據會在每個Reducer輸出中排序。

這是有道理的,否則我們可能會導致大的偏差。例如,假設您正在某些客戶服務數據上運行MapReduce作業,其ID始終始於C - 您不希望所有內容都轉到同一個Reducer。