减速器数量和输出顺序

时间:2015-12-07 00:41:23

标签: hadoop mapreduce

当我使用函数job.setNumReduceTasks(1);时,我得到按键排序的输出。但是,当我删除此功能时,输出不按键排序。

那么,当我们有多个reducer任务时,我们是否应该期望从reducer获得排序输出?

感谢。

1 个答案:

答案 0 :(得分:1)

输出在单个Reducer中的键上排序。但是,默认的分区程序是散列函数的结果,因此如果使用多个Reducers,每个文件将被排序,一个文件将不是最后一个的排序延续。例如:

我们有三个Reducers的字数统计工作。 Mapper输出:

(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不包含A-F,Reducer 2不包含G-M且Reducer 3不包含N-Z,即它不按字母顺序分割。这就是整体输出不会被排序的原因,但数据将在每个Reducer的输出中进行排序。

这是有道理的,否则我们最终可能会出现大的偏差。例如,您正在某些客户服务数据上运行MapReduce作业,其中ID始终以C开头 - 您不希望所有内容都转到相同的Reducer。