使用零减速器时,我可以从Hadoop获得不经常分类的Mapper输出吗?

Ben*_*ran 5 hadoop mapreduce

我在Hadoop 0.20中有一份工作需要对大文件进行操作,一次一个.(这是一个预处理步骤,将面向文件的数据转换为更清晰,基于行的格式,更适合MapReduce.)

我不介意我有多少输出文件,但每个Map的输出最多只能有一个输出文件,每个输出文件必须排序.

  • 如果我使用numReducers = 0运行,它会快速运行,并且每个Mapper写出自己的输出文件,这很好 - 但文件没有排序.
  • 如果我添加一个reducer(plain Reducer.class),这会为单个文件添加一个不必要的全局排序步骤,这需要花费很多时间(比Map任务花费的时间长得多).
  • 如果我添加多个reducer,则各个map作业的结果会混合在一起,因此一个Map的输出最终会出现在多个文件中.

有没有办法说服Hadoop对每个作业的输出执行地图侧排序,而不使用Reducers,或任何其他方式来跳过缓慢的全局合并?

小智 2

进行全局排序的一种方法是使用自定义分区器并为您的减速器进行范围分区。为此,您必须知道映射器输出键的范围。您可以将键范围划分为 n 个桶,其中 n 是减速器的数量。根据键映射到的存储桶,映射器输出被路由到特定的减速器。

每个reducer的输出都是排序的。由于范围分区,所有减速器输出的集合都是全局排序的。您所要做的就是按照与文件名中的 5 位数字相同的顺序获取减速器输出文件。

需要注意的一件事是密钥分布的倾斜,这将导致集群中的减速器负载不均匀。如果您有分布信息(即密钥的直方图),则可以缓解此问题。然后你可以使你的桶长度不相等,并且每个桶持有大约相同数量的密钥。

希望能帮助到你。