尝试获得与密钥数量一样多的reducer
public class CustomPartitioner extends Partitioner<Text, Text>
{
public int getPartition(Text key, Text value,int numReduceTasks)
{
System.out.println("In CustomP");
return (key.toString().hashCode()) % numReduceTasks;
}
}
驱动程序类
job6.setMapOutputKeyClass(Text.class);
job6.setMapOutputValueClass(Text.class);
job6.setOutputKeyClass(NullWritable.class);
job6.setOutputValueClass(Text.class);
job6.setMapperClass(LastMapper.class);
job6.setReducerClass(LastReducer.class);
job6.setPartitionerClass(CustomPartitioner.class);
job6.setInputFormatClass(TextInputFormat.class);
job6.setOutputFormatClass(TextOutputFormat.class);
但是我在单个文件中获得了输出。
我做错了什么
答案 0 :(得分:2)
如果没有指定减速机,则无法控制减速机的数量:-)。但仍然无法确保将所有键都放在不同的reducer上,因为您不确定在输入数据中可以获得多少个不同的键,并且您的散列分区函数可能会为两个不同的键返回相同的数字。如果您想要实现解决方案,那么您必须事先知道不同密钥的数量,然后相应地修改分区功能。
答案 1 :(得分:1)
您需要指定与键数相等的reduce任务数,并且还需要根据分区器类中的键返回分区。例如,如果你的输入有4个键(这里是木头,砌体,钢筋混凝土等),那么你的getPartition方法看起来像这样..
public int getPartition(Text key, PairWritable value, int numReduceTasks) {
// TODO Auto-generated method stub
String s = value.getone();
if (numReduceTasks ==0){
return 0;
}
if(s.equalsIgnoreCase("wood")){
return 0;
}
if(s.equalsIgnoreCase("Masonry")){
return 1%numReduceTasks;
}
if(s.equalsIgnoreCase("Reinforced Concrete")){
return 2%numReduceTasks;
}
if(s.equalsIgnoreCase("Reinforced Masonry")){
return 3%numReduceTasks;
}
else
return 4%numReduceTasks;
}
}
相应的输出将收集在相应的reducer中。尝试在CLI中运行而不是eclipse
答案 2 :(得分:0)
您尚未配置要运行的reducer数量。
您可以使用以下API
job.setNumReduceTasks(10); //根据您的号码更改号码 群集
此外,您可以在从命令行执行时设置
-D mapred.reduce.tasks = 10
希望这有帮助。
答案 3 :(得分:0)
Veni,您需要将任务链接如下
Mapper1 --> Reducer --> Mapper2 (Post Processing Mapper which creates
file for Each key)
Mapper 2是InputFormat应该是NlineInputFormat,所以reducer的输出就是每个键都会有相应的mapper和Mapper输出,每个键都会有一个单独的文件。
Mapper 1和Reducer是您现有的MR工作。
希望这有帮助。
干杯 纳格