MultipleOutputs

通常hadoopの処理結果は part-00000 ファイルにすべて書かれる。
ほとんどの場合それで問題ないが、時には処理結果を複数に分けたいこともある。

たとえば、解析結果を日付ごとに出力したいとかよく起こりそうだ。

そういった場合、Hadoop 0.19.0 から導入された MultipleOutputs を使うと便利。

下のようにすれば解析結果を複数ファイルに出力できる。

//Job configuration
 JobConf conf = new JobConf();

 conf.setInputPath(inDir);
 FileOutputFormat.setOutputPath(conf, outDir);

 conf.setMapperClass(MOMap.class);
 conf.setReducerClass(MOReduce.class);
 ...

 //他の出力ファイルを設定
 MultipleOutputs.addNamedOutput(conf, "text", TextOutputFormat.class,
 LongWritable.class, Text.class);

 //他の名前付き出力ファイルの設定
 MultipleOutputs.addMultiNamedOutput(conf, "day",
   TextOutputFormat.class,
   LongWritable.class, Text.class);

 JobClient jc = new JobClient();
 RunningJob job = jc.submitJob(conf);

 ...
 

//Job configuration usage pattern is:

 public class MOReduce implements
   Reducer<WritableComparable, Writable> {
 private MultipleOutputs mos;

 public void configure(JobConf conf) {
 ...
 mos = new MultipleOutputs(conf);
 }

 public void reduce(WritableComparable key, Iterator<Writable> values,
 OutputCollector output, Reporter reporter)
 throws IOException {
 ...
 mos.getCollector("text", reporter).collect(key, new Text("Hello"));
 mos.getCollector("day", "20090101", reporter).collect(key, new Text("hoge"));
 mos.getCollector("day", "20090102", reporter).collect(key, new Text("fuga"));
 ...
 }

 public void close() throws IOException {
 mos.close();
 ...
 }

 }
 

reduce時にkeyによって出力ファイルを変えればOK。