[英]Running a local hadoop map-reduce does not partition data as expected
我有一個map-reduce程序,可以計算每十年Google ngrams中出現的雙字母組的數量。
我的分區是:
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);
代碼未按預期運行,某些數據已正確處理,而某些數據未正確處理。
我真的不知道該如何調試。
有任何想法嗎?
根據給定的分區數量,分區程序定義將哪個鍵分配給哪個分區。 它的工作不是設置分區的數量,而是設置其內容。 然后,每個縮減任務將處理一個分區,因此最后,分區數=縮減任務數=輸出文件數(正在使用默認設置,而不是MultipleOutputs)。
為了設置分區數,您應該使用:
job.setNumReduceTasks(n);
,其中n
是您想要的數字。
有關如何設置此數字的說明(經驗法則,無嚴格要求),您可以閱讀此文章 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.