我必须获取 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);
- - - - - 编辑 - - - - -
Also, please update your question with possible i/p adn o/p
我必须实现一种新的数据聚类方式。
映射器是聚类算法,输出是聚类中点的键/列表。
每个 Reducer 将集群与相同的键进行比较,如果它们“相似”,则 reducer 将其合并。 reducer 选择新键,输出是新键/点列表。通过随机选择新 key 和大量迭代,将比较所有初始集群。
最佳答案
I have to take the output of my Mapper and pass it 4 times to my Reducer.
从上面的陈述中,我可以理解您的数据必须按顺序过滤/处理 4 次。做os,MapReduce提供了
ChainMapper
或 ChainReducer
.使用
job.setNumReduceTasks(4);
仅有助于并行运行 4-reducer 任务,基于默认的 key-partition 机制共享映射器输出(称为中间数据)。从您问题的另一部分来看,可以引入自定义分区。因此,它们将键值对排列为值的键列表。然后,根据需要的过滤机制,在reducer中合并结果。
关于java - MapReduce 多个归约任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42224273/