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。