【问题标题】:Chaining a Reduce-only job in Hadoop在 Hadoop 中链接仅限 Reduce 的作业
【发布时间】:2015-01-17 12:39:36
【问题描述】:

我正在使用 ControlledJobs 在 Hadoop 2.2.0 中实现一系列 MR 作业。基本架构是这样的:

mapper1 -> reducer1 -> mapper2 -> reducer2

但是,mapper2 是身份。有没有办法让reducer1轻松生成key-value-pairs并将它们传递给reducer2?

目前,两轮的作业输出配置如下:

// set intermediate/mapper output
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);

// set reducer output
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(Text.class);

【问题讨论】:

  • 如果你也没有给mapper2,默认会执行一个身份映射器

标签: java hadoop mapreduce


【解决方案1】:

据我所知,身份映射器仍然是一个映射器,您无法绕过它。但是,我相信在某些情况下,您可以将 mapper1、reducer1 和 reducer2 重构为一个工作,这样它就会变成:mapper1 -> reducer1。这完全取决于您的用例以及您在此处尝试减少(两次)的数据。

【讨论】:

  • 我认为这在我们的例子中是不可能的,因为两个 reducer 的键类型不同,导致分组完全不同。
  • 您是否介意分享您的数据流和类型,如果您不想透露任何专有信息,可能会简化变体。这将帮助我检查是否可以合并为一份工作。
  • 一个简化的设置(我不能提供更多细节,抱歉):考虑 2 个文件,一个包含名称、数字对的文件 A 和一个包含数字的文件 B。我们现在计算每个名称出现在文件 B 中的数字数量。首先,两种类型都转换为 (number,content) 键值对。然后只保留匹配的数字。然后,将它们投影到(名称,数字)键值对并计算不同数字的数量。
  • 所以在第一份工作中,您会按数字进行内部连接...文件 A 和 B 有多大?来自 A 或 B 的数据是否适合内存?
  • 两者都不适合内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 2023-03-08
  • 2012-02-20
相关资源
最近更新 更多