2016-12-19 12 views
0

私は今このエラーをしばらくデバッグしようとしています。基本的には、reduceクラスが正しい出力をコンテキストに書き込んでいることを確認しましたが、何らかの理由で常にゼロバイトの出力ファイルを取得しています。Hadoopの結果MapReduceが出力ファイルにデータを書き込んでいません

マイマッパークラス:

public class FrequencyMapper extends Mapper<LongWritable, Text, Text, IntWritable> { 


public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 
    Document t = Jsoup.parse(value.toString()); 
    String text = t.body().text(); 
    String[] content = text.split(" "); 

    for (String s : content) { 
     context.write(new Text(s), new IntWritable(1)); 
    } 
} 

}

マイ減速クラス:

public class FrequencyReducer extends Reducer<Text, IntWritable, Text, IntWritable> { 

public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { 
    int n = 0; 
    for (IntWritable i : values) { 
     n++; 
    } 
    if (n > 5) { // Do we need this check? 
     context.write(key, new IntWritable(n)); 
     System.out.println("<" + key + ", " + n + ">"); 
    } 
} 

}

と私のドライバー:

public class FrequencyMain { 

public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { 
    Configuration conf = new Configuration(true); 

    // setup the job 
    Job job = Job.getInstance(conf, "FrequencyCount"); 
    job.setJarByClass(FrequencyMain.class); 

    job.setMapperClass(FrequencyMapper.class); 
    job.setCombinerClass(FrequencyReducer.class); 
    job.setReducerClass(FrequencyReducer.class); 

    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 

    FileInputFormat.addInputPath(job, new Path(args[0])); 
    FileOutputFormat.setOutputPath(job, new Path(args[1])); 

    System.exit(job.waitForCompletion(true) ? 0 : 1); 
} 

}

そして、「出力レコードを減らすには、」常に

Job complete: job_local805637130_0001 
Counters: 17 
    Map-Reduce Framework 
    Spilled Records=250 
    Map output materialized bytes=1496 
    Reduce input records=125 
    Map input records=6 
    SPLIT_RAW_BYTES=1000 
    Map output bytes=57249 
    Reduce shuffle bytes=0 
    Reduce input groups=75 
    Combine output records=125 
    Reduce output records=0 
    Map output records=5400 
    Combine input records=5400 
    Total committed heap usage (bytes)=3606577152 
    File Input Format Counters 
    Bytes Read=509446 
    FileSystemCounters 
    FILE_BYTES_WRITTEN=385570 
    FILE_BYTES_READ=2909134 
    File Output Format Counters 
    Bytes Written=8 
+0

入力レコードの削減は125です。マッパーのみを実行してから、レデューサーの状態を確認してください。フィルタ条件が満たされていないようです... – Amal

答えて

1

ある何らかの理由(あなたの目標は、周波数> 5を持っている単語の出現頻度を印刷することであると仮定すると)

コンバイナの現在の実装あなたのプログラムのセマンティクスを完全に破ります。あなたはそれを削除するか、再実装するか必要があります。

  1. 現在のところ、それは少なくとも5コンバイナごとのマッパー作品の周波数を有する減速するだけでそれらの単語を渡すだけで、単一の文書がにスケジュールされている場合、これは、たとえば、意味しますこのマッパー/コンバイナーは、この文書の頻度が6未満の単語を出力しません(たとえ他のマッパーの他の文書でもこれらの単語の出現が多い場合でも)。コンバイナのチェックn > 5を削除する必要があります(ただし、減速機では使用できません)。
  2. 還元剤の入力値が必ずすべて「1」ではないため、n++の代わりにnを値の分だけ増やす必要があります。
+0

ドライバクラスの 'job.setCombinerClass(FrequencyReducer.class);'行を削除して問題を解決しました。ありがとうございます! –