具有单个映射器和两个不同减速器的 hadoop 作业

Posted

技术标签:

【中文标题】具有单个映射器和两个不同减速器的 hadoop 作业【英文标题】:hadoop job with single mapper and two different reducers 【发布时间】:2014-06-23 09:58:27 【问题描述】:

我有一个大型文档语料库作为 MapReduce 作业(旧的 hadoop API)的输入。在映射器中,我可以产生两种输出:一种是计算单词,另一种是产生 minHash 签名。我需要做的是:

    将字数统计输出提供给一个减速器类(典型的 WordCount 减速器)并 将 minHash 签名提供给另一个 reducer 类(对桶的大小执行一些计算)。

输入是同一个文档语料库,不需要处理两次。我认为 MultipleOutputs 不是解决方案,因为我找不到将 Mapper 输出提供给两个不同 Reduce 类的方法。

简而言之,我需要以下内容:

               WordCounting Reducer   --> WordCount output
             / 

输入 --> 映射器

             \ 
              MinHash Buckets Reducer --> MinHash output

有什么方法可以使用同一个 Mapper(在同一个工作中),还是应该将它分成两个工作?

【问题讨论】:

【参考方案1】:

你可以这样做,但它会涉及一些编码技巧(分区器和前缀约定)。这个想法是让mapper输出以“W:”为前缀的单词和以“M:”为前缀的minhash。比使用 Partitioner 来决定它需要进入哪个分区(又名 reducer)。

伪代码 主要方法:

Set number of reducers to 2

映射器:

.... parse the word ...
... generate minhash ..
context.write("W:" + word, 1);
context.write("M:" + minhash, 1);

分区器:

IF Key starts with "W:"  return 0;  // reducer 1
IF Key starts with "M:"  return 1;  // reducer 2

组合器:

IF Key starts with "W:"  iterate over values and sum; context.write(Key, SUM); return; 
Iterate and context.write all of the values

减速机:

IF Key starts with "W:"  iterate over values and sum; context.write(Key, SUM); return; 
IF Key starts with "M:"  perform min hash logic 

在输出中,part-0000 将是您的字数统计,part-0001 将是您的最小哈希计算。

很遗憾,无法提供不同的Reducer 类,但使用IF 和前缀可以模拟它。

从性能的角度来看,只有 2 个 reducer 可能效率不高,您可以使用 Partitioner 将前 N 个分区分配给 Word Count。

如果您不喜欢前缀的想法,那么您需要使用自定义的 WritableComparable 类为键实现二次排序。但只有在更复杂的情况下才值得付出努力。

【讨论】:

我对前缀的想法没意见;我已经用过好几次了。这是一个完全可以接受的答案,但我会在接受之前稍等片刻,以防出现其他建议。【参考方案2】:

AFAIK 这在单个 map reduce 作业中是不可能的,只有默认输出文件 part--r--0000 文件将被提供给 reducer,所以如果您创建两个命名为 WordCount 的多个命名输出-- m--0 和 MinHash--m--0

您可以使用 Identity Mapper 和各自的 Reducer 创建另外两个不同的 Map/Reduce 作业,将输入指定为 hdfspath/WordCount--* 和 hdfspath/MinHash--* 作为各自作业的输入。

【讨论】:

以上是关于具有单个映射器和两个不同减速器的 hadoop 作业的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop MapReduce访问减速器中的映射器输出编号

在 DataStax Enterprise 中更改减速器/映射器的数量

在 reducer 上执行 Hadoop 组合器

Mapreduce:在单个作业中同时从 mapper 和 reducer 写入

如何在hadoop中组合两个独立映射器的结果?

映射器输出直接打印到输出文件