2017-02-07 6 views
0

MapReduceのWordCountサンプルアプリケーションが出てきたので、マップステージ中にMapメソッドが呼び出された回数も出力するようにコードを編集したい。私は2つのテキストファイルを持っていますが、これはアプリケーション用に使用しているコードですMapReduceのマップステージで起動されたマップメソッドの数を確認するワード数例

public class WordCount 
{ 
public static class TokenizerMapper 
     extends Mapper<Object, Text, Text, IntWritable> { 

    private final static IntWritable one = new IntWritable(1); 
    private Text word = new Text(); 

    public void map(Object key, Text value, Context context 
    ) throws IOException, InterruptedException { 
     StringTokenizer itr = new StringTokenizer(value.toString()); 
     while (itr.hasMoreTokens()) { 
      word.set(itr.nextToken()); 
      context.write(word, one); 
     } 
    } 
} 

public static class IntSumReducer 
     extends Reducer<Text, IntWritable, Text, IntWritable> { 

    private IntWritable result = new IntWritable(); 

    public void reduce(Text key, Iterable<IntWritable> values, 
      Context context 
    ) throws IOException, InterruptedException { 
     int sum = 0; 
     for (IntWritable val : values) { 
      sum += val.get(); 
     } 
     result.set(sum); 
     context.write(key, result); 
    } 
} 

public static void main(String[] args) throws Exception { 
    Configuration conf = new Configuration(); 
    String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); 
    if (otherArgs.length != 2) { 
     System.err.println("Usage: wordcount <in> <out>"); 
     System.exit(2); 
    } 
    Job job = new Job(conf, "word count"); 
    job.setJarByClass(WordCount.class); 
    job.setMapperClass(TokenizerMapper.class); 
    job.setCombinerClass(IntSumReducer.class); 
    job.setReducerClass(IntSumReducer.class); 
    job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 
    FileInputFormat.addInputPath(job, new Path(otherArgs[0])); 
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); 
    System.exit(job.waitForCompletion(true) ? 0 : 1); 
} 
} 

これは単なる学習目的であり、私は本当に助けていただきたいと思います!

ありがとうございます

答えて

2

Hadoopはすでにマップメソッド呼び出しの数をカウントしています。それが終了した後は、カウンタセクションにアプリケーションUIでそれを参照するか、仕事から得ることができます。

int code = job.waitForCompletion(true) ? 0 : 1; 

String group = "Map-Reduce Framework"; 
String counter = "Map input records"; 

long val = job.getCounters().getGroup(group).findCounter(counter).getValue(); 

投機実行が有効になっている場合、この数は、入力ファイルの行数よりも大きくなることを覚えておいてください。

+0

このコードを私のメインメソッドに追加するだけでいいですか? @AdamSkywalker – useruser1412

+0

@ useruser1412はい – AdamSkywalker

関連する問題