我必须获取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合并它。减速器选择新键,输出为新键/点列表。通过随机选择新密钥和大量迭代,将比较所有初始集群。
答案 0 :(得分:1)
我必须获取Mapper的输出并将其传递给我4次 减速器。
从上面的陈述中,我可以理解您的数据必须按顺序过滤/处理4次。要做os,MapReduce提供ChainMapper
或ChainReducer
。
使用job.setNumReduceTasks(4);
只会有助于并行运行4-reducer任务,基于默认的密钥分区机制共享映射器输出(称为中间数据)。
从问题的其他部分,可以引入自定义分区。因此,它们将键值对排列为值的键列表。然后,根据所需的过滤机制,合并结果为reducer。
答案 1 :(得分:0)
通过群集,您是否需要对数据进行分区? 如果是这种情况,则需要添加分区逻辑。(您可以提供一系列密钥,因此mapper中的那些密钥会转到特定的reducer。)
否则你可以做一件事,在完成第一个工作后,应用链接,以便它进入下一个工作,你有一个身份映射器和reducer逻辑来执行任何业务逻辑。