【问题标题】:Different context types in hadoop for mapper and combinerhadoop 中用于映射器和组合器的不同上下文类型
【发布时间】:2015-05-09 18:49:02
【问题描述】:

您好,我正在尝试实现 java hadoop 应用程序。我想制作 的映射器(因此映射器的输出将 NaicsAreaPair 作为键,LongWritable 作为值)。然后我需要Combiner 像 这样输入与映射器输出是正确的,但组合器输出与映射器输出不同。

我在主类中有这个配置:

public static void main(String[] args) throws Exception {
 Configuration conf = new Configuration();
 Job job = Job.getInstance(conf, "NY statistics");
 job.setJarByClass(NYStatisticsOwnWritableComparable.class);
 job.setMapperClass(TokenizerMapper.class);
 job.setCombinerClass(Combiner.class);
 job.setReducerClass(IntSumReducer.class);
 job.setOutputKeyClass(NaicsAreaPair.class);
 job.setOutputValueClass(LongWritable.class);
 //job.setPartitionerClass(Rozdelovac.class);
 FileInputFormat.addInputPath(job, new Path(args[0]));
 FileOutputFormat.setOutputPath(job, new Path(args[1]));
 //job.setNumReduceTasks(3);
 System.exit(job.waitForCompletion(true) ? 0 : 1);
}

这里我不得不说将使用哪个输出键和输出值。是否有可能将它设置为映射器使用此输出键和值但组合器使用不同?

非常感谢您的回答

【问题讨论】:

    标签: java hadoop


    【解决方案1】:

    事实并非如此。组合器输出必须与映射器输出相同。

    【讨论】:

      【解决方案2】:

      为什么要为此使用组合器? 组合器存在的目的是通过减少通过网络发送的数据来实现“性能”。 有几个限制,例如输入/输出类型必须匹配映射器输出(键/值)类型/reducer 输入(键/值)类型,它执行的功能应该是关联和可交换的,请参见此处的示例http://www.philippeadjiman.com/blog/2010/01/14/hadoop-tutorial-series-issue-4-to-use-or-not-to-use-a-combiner/

      你想要什么作为你的组合器,让它成为减速器

      【讨论】:

      • 我使用它是因为我想在 mapper naics 中作为键和以工资为值的区域。然后在Combiner中,我想将每个区域的所有工资相加,并将其作为键发送为naics,并将工资总和作为值的区域发送,然后在reducer中,我只想找到每个naics中每个区域的最大值。如果我赢了'不要为此使用组合器,我需要使用减速器 2 次(一次用于求和,一次用于最大值)不是吗?在这一点上,组合器会使数据变得更小(不是每个 naics 的面积那么多),不是吗?
      • 您可以使用组合器来执行聚合(仅此而已),因此输出类型将与其输入类型相同。在减速器中,您可以找到每个输入键类型的最大值。
      猜你喜欢
      • 1970-01-01
      • 2016-01-21
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      相关资源
      最近更新 更多