2017-03-01 27 views
0

我有一个map-reduce程序,可以根据每个十年的谷歌ngram计算出现的bigrams数量。
我的分区是:
运行本地hadoop map-reduce不会按预期划分数据

public static class PartitionerClass extends Partitioner<Bigram, IntWritable> { 
    public int getPartition(Bigram key, IntWritable value, int numPartitions) { 
     String combined=key.getFirst().toString()+key.getSecond().toString()+key.getDecade().toString(); 
     return combined.hashCode()%numPartitions; 
    } 
} 

我添加了一个断点,但程序不通过一段代码去。
我的主:

Configuration conf = new Configuration(); 
Job job = new Job(conf, "first join"); 
job.setJarByClass(WordCount.class); 
job.setMapperClass(Map.class); 
job.setReducerClass(Reduce.class); 
job.setPartitionerClass(PartitionerClass.class); 
FileInputFormat.addInputPath(job, new Path(args[0])); 
FileOutputFormat.setOutputPath(job, new Path(args[1])); ///SHOULD BE DECIDED 
job.setOutputKeyClass(Text.class); 
job.setOutputValueClass(IntWritable.class); 
job.setMapOutputKeyClass(Bigram.class); 
job.setMapOutputValueClass(IntWritable.class); 
System.exit(job.waitForCompletion(true) ? 0 : 1); 

代码运行并不如预期,有些数据被正确处理,有些则不是。
我真的不知道如何调试。
任何想法?

+2

您的意思是某些数据没有正确处理? – Serhiy

+0

和你正在获得的numPartition的值是什么...?您应该在主要方法中将setNumReduceTasks设置为 – vefthym

+0

某些数据处理不正确 - 在某些情况下(我无法确定哪些数据正在发送到错误的缩减器)。我认为问题是我没有设置numPartition。我如何知道要设置的值。分区器不是做什么的? –

回答

0

根据给出的分区数量,分区程序定义哪个键转到哪个分区。它的工作不是设置分区的数量,而是设置其内容。每个减少任务然后处理一个分区,因此最后,分区数量=减少任务数量=输出文件数量(使用默认设置而不是MultipleOutputs)。

为了设置分区的数量,你应该使用:

job.setNumReduceTasks(n);,其中n是你想要的号码。

有关如何设置此编号的说明(拇指规则,没有严格规定),您可以阅读this post