0
當我使用函數job.setNumReduceTasks(1);
時,我得到按鍵排序的輸出。但是,當我刪除此功能時,輸出未按鍵排序。減速器的數量和輸出順序
那麼,當我們有多個reducer任務時,我們是否應該期望從reducer獲得排序輸出?
謝謝。
當我使用函數job.setNumReduceTasks(1);
時,我得到按鍵排序的輸出。但是,當我刪除此功能時,輸出未按鍵排序。減速器的數量和輸出順序
那麼,當我們有多個reducer任務時,我們是否應該期望從reducer獲得排序輸出?
謝謝。
輸出在單個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。
你能詳細說明嗎?你能給出一些數據來顯示reducer輸出沒有排序嗎? –
看看http://stackoverflow.com/questions/33298159/difference-between-partial-sort-total-sort-and-secondary-sort-in-hadoop/33301253#33301253和http://blog.zaloni的.com /二次分揀中的hadoop –