我有一个map-reduce程序,用于计算每十年谷歌ngram中发生的双字母数量。
我的分区是:
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);
代码运行不符合预期,一些数据处理正确,一些数据不是。
我真的不知道如何调试这个。
有什么想法吗?
答案 0 :(得分:0)
分区程序在给定分区数量的情况下,定义哪个密钥到哪个分区。它的工作不是设置分区的数量,而是设置它们的内容。然后每个reduce任务处理一个分区,因此最后,分区数= reduce任务数=输出文件数(使用默认设置而不是MultipleOutputs)。
要设置分区数,您应该使用:
job.setNumReduceTasks(n);
,其中n
是您想要的号码。
关于如何设置此号码的说明(经验法则,没有严格要求),您可以阅读this post。