MapReduce多重减少任务

时间:2017-02-14 10:53:08

标签: java hadoop mapreduce

我必须获取Mapper的输出并将其传递给我的Reducer 4次。

Reducer是数据之间的合并。因此,在Mapper之后,Reducer在第一次迭代时合并一些数据,更改键和重新合并以及第二次迭代,依此类推......

我尝试使用job.setNumReduceTasks(4)但没有任何反应。我只有1个输出和一个简单的System.out.println()放在我的Reducer只显示1条消息。

Job job = new Job(getConf());


job.setJarByClass(Driver.class);
job.setJobName(this.getClass().getName());

FileInputFormat.setInputPaths(job, new Path(input));
FileOutputFormat.setOutputPath(job, new Path(output+System.nanoTime()));

job.setMapperClass(KMMapper.class);

job.setReducerClass(KMReducer.class);
job.setNumReduceTasks(4);

job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);

job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);

job.waitForCompletion(true);

----------编辑----------

  

另外,请用可能的i / p adn o / p

更新您的问题

我必须实现一种新的数据聚类方式。

映射器是聚类算法,输出是集群中的键/点列表。

每个Reducer将群集与相同的密钥进行比较,如果它们是"类似的" reducer合并它。减速器选择新键,输出为新键/点列表。通过随机选择新密钥和大量迭代,将比较所有初始集群。

2 个答案:

答案 0 :(得分:1)

  

我必须获取Mapper的输出并将其传递给我4次   减速器。

从上面的陈述中,我可以理解您的数据必须按顺序过滤/处理4次。要做os,MapReduce提供ChainMapperChainReducer

使用job.setNumReduceTasks(4);只会有助于并行运行4-reducer任务,基于默认的密钥分区机制共享映射器输出(称为中间数据)。

从问题的其他部分,可以引入自定义分区。因此,它们将键值对排列为值的键列表。然后,根据所需的过滤机制,合并结果为reducer。

答案 1 :(得分:0)

通过群集,您是否需要对数据进行分区? 如果是这种情况,则需要添加分区逻辑。(您可以提供一系列密钥,因此mapper中的那些密钥会转到特定的reducer。)

否则你可以做一件事,在完成第一个工作后,应用链接,以便它进入下一个工作,你有一个身份映射器和reducer逻辑来执行任何业务逻辑。