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 件のコメント:
コメントを投稿