2010年1月21日木曜日

Hadoop MapReduce 0.19.* -> 0.20.*

Hadoopネタが続いてるが備忘録なので

MapReduce の0.19.*から0.20.*でかなり仕様が変わっている。

情報も少ないし、本家のチュートリアルも古いしでまったく使い物にならない。
ってことで、基本部分の変更箇所。

org.apache.hadoop.mapredで
使用していたものが
org.apache.hadoop.mapreduce

を使用するように変わっている。


public static class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
  public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter)       
    throws IOException {
  }
}
public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
  public void reduce(Text key, Iterator<Intwritable> values, OutputCollector>Text, IntWritable< output, Reporter reporter)
    throws IOException {
  }
}

みたいにMapもReduceもインターフェースでやってたいところが

public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
  protected void map(LongWritable key, Text value, Context context)
    throws java.io.IOException ,InterruptedException {
  }
}
public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
  protected void reduce(Text key, Iterable<intwritable> values, Context context)
    throws java.io.IOException ,InterruptedException {
  }
}

みたいに抽象クラスを使用するようになっている。
# 基本、上記の古いほうはDeprecatedになってる。

で、Jobもそのまま使用するようになっているのでだいたい、こんな感じに変更。



package example.hadoop;

import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;

public class UserCount extends Configured implements Tool {
  public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    protected void map(LongWritable key, Text value, Context context)
      throws java.io.IOException ,InterruptedException {
      String[] s = value.toString().split(",");
      word.set(s[0]);
      context.write(word, one);
    }
  }

  public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
    private IntWritable result = new IntWritable();

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

  @Override
  public int run(String[] args) throws Exception {
    Job job = new Job(getConf(), "user count");
    job.setJarByClass(UserCount.class);

    job.setMapperClass(Map.class);
    job.setCombinerClass(Reduce.class);
    job.setReducerClass(Reduce.class);

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

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

    return job.waitForCompletion(true) ? 0 : -1;
  }

  public static void main(String[] args) {
    status = ToolRunner.run(new UserCount(), args);
    System.exit(status);
  }
}

以上、備忘録。

0 件のコメント:

コメントを投稿