输出分区程序的单个文件

时间:2014-06-17 10:26:55

标签: java hadoop mapreduce partitioner

尝试获得与密钥数量一样多的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);

但是我在单个文件中获得了输出。

我做错了什么

4 个答案:

答案 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工作。

希望这有帮助。

干杯 纳格