具有单个映射器和两个不同减速器的 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 中更改减速器/映射器的数量