【问题标题】:Hadoop 2.2 chain MapReduce jobs Map -> Reducer -> Map -> ReducerHadoop 2.2 链 MapReduce 作业 Map -> Reducer -> Map -> Reducer
【发布时间】:2014-01-23 14:12:22
【问题描述】:

我有两个 MapReduce 作业,第一个 Reducer 的输出是第二个 Mapper 的输入:

Map1 -> Reduce1 -> Map2 -> Reduce2

现在Map2Reduce1 输出的文件中读取。所以Map1 -> Reduce1Map2 -> Reduce2 是独立的。

它可以工作,但如果 R​​educe1 的输出直接是 Map2 的输入,它会更容易,我认为更优化。

有没有办法做到这一点?在这种情况下,Map2 将只是一个身份映射器,所以如果我能这样做会更好:

Map1 -> Reduce1 -> Reduce2

Reduce1、Map2 和 Reduce2 具有相同的输入和输出类型。

谢谢!

【问题讨论】:

  • 您仍然可以将标识映射器用作 Mapper2,方法是:conf.setOutputFormat(SequenceFileOutputFormat.class); 用于第一个驱动程序类,conf.setInputFormat(SequenceFileInputFormat.class); 用于第二个驱动程序类。我不知道在 hadoop 2.2 中链接作业的语法变化,所以我不会发布答案(暂时)。
  • 按照 #vefthym 的建议使用 SequenceFileOutputFormat 的好主意,它可以提供优化
  • @vefthym 不错,这样就更好了。但是我还是要用临时文件,没办法直接把Reduce1的数据传给Map2
  • 我认为没有。也许我错了。

标签: java hadoop mapreduce chaining


【解决方案1】:

根据我的理解,我可以告诉你这些点(可能对你有帮助,也可能对你没有帮助,如果我错了,请纠正我):

1) 映射 1-> 减少 1-> 直接映射到 mapper2:优化在 spark 集群计算框架中进行(使用内存计算,避免对 hdfs 进行不必要的读/写)。

2) 如果你想要像 reducer1 ->reducer2 这样的东西。您必须考虑如何在一个减速器本身中编写逻辑,但这里的问题是它完全取决于您的要求,我的意思是您要执行的键的聚合(更详细地说:reducer1 接收相同的键集,在只有你可以执行下一个聚合的任务。

3) 在 Hadoop 中,协议只是这样:map --> 然后是聚合,如果有任何下一个聚合,它必须来自 Userdefinedmapper/IdentityMapper。

希望这会有所帮助:)

【讨论】:

  • 1) 如果没有必要,我宁愿只使用 Hadoop 和 MapReduce。 2)键的类型相同,但它们的值不同。 3)如果我必须使用 IdendityMapper 这不是问题,我只是不想在 Reduce1Map2 之间使用临时文件。
猜你喜欢
  • 1970-01-01
  • 2016-10-25
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多