2017-03-01 10 views
0

私は10年ごとにグーグルグラムから発生するバイグラムの数を計算するmap-reduceプログラムを持っています。
私のパーティは、次のとおりです。
ローカル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

、取得しているnumPartitionsの値は何ですか...?メインメソッドでsetNumReduceTasksとして設定する必要があります。 – vefthym

+0

一部のデータが正しく処理されません - データが間違ったレデューサーに送信されている場合があります(わかりません)。問題はnumPartitionsを設定しなかったことだと思います。設定する値をどのように知ることができますか。それはパーティーが何をしていますか? –

答えて

0

与えられたパーティションの数を指定すると、どのパーティションにどのキーが移動するかが定義されます。その仕事は、パーティションの数ではなく、その内容を設定することです。各縮小タスクは1つのパーティションを処理するので、最後にパーティション数=削減タスク数=出力ファイル数(デフォルト設定を使用し、MultipleOutputsは使用していません)。

パーティションの数を設定するためには、あなたが使用する必要があります。

job.setNumReduceTasks(n);

nは、あなたがしたい番号です。

この番号の設定方法(大まかなルールはありません)については、this postをご覧ください。

関連する問題