OUTPUTFORMAT MapReduceの出力は、ベース・クラスで、すべての出力は、MapReduceのOUTPUTFORMATインタフェースを達成するために実装されています。
一般的な実装クラスとSequenceFileOutputFormatのTextOutputFormat OUTPUTFORMAT
1、TextOutputFormat(テキスト出力)
デフォルトの出力形式は、各レコード書かれたテキストを入れて、TextOutputFormatです。キーと値は任意のタイプであってもよい、TextOutputFormatコールのtoString()メソッドは、文字列に変換されます。
2、SequenceFileOutputFormat
コンパクトな形式は、容易に圧縮します
3、カスタムOUTPUTFORMAT
(1)シナリオ
最終的な制御ファイルの出力パスと出力形式を達成するためにOUTPUTFORMATをカスタマイズすることができます
そのような別のディレクトリに結果データとして二つの異なる出力の必要性、そしてカスタムOUTPUTFORMATを使用することができます
(2)カスタムステップOUTPUTFORMAT
1)カスタムクラス継承FileOutputFormat
パブリッククラスFilterOutputFormatはFileOutputFormat <テキスト、NullWritable> {延び @Override 公共RecordWriter <テキスト、NullWritable> getRecordWriter(TaskAttemptContextコンテキストが) にIOException、例外:InterruptedExceptionをスロー{ 新しいFilterRecordWriter(コンテキスト)を返します。 } }
2))RecordWriter、書き換え方法、特にライト出力データ(書き直すことができます。
パブリッククラスFilterRecordWriterはRecordWriter <テキスト、NullWritable> {延び プライベートFSDataOutputStream hadoopOutputStream =ヌル; プライベートFSDataOutputStream otherOutputStream = NULL; @Override 公共ボイド近い(TaskAttemptContextコンテキスト)がスローにIOException、InterruptedExceptionある{ IOUtils.closeStream(hadoopOutputStream)。 IOUtils.closeStream(otherOutputStream)。 } @Override 公共ボイドライト(テキスト、テキスト、NullWritable書き込み可能)にIOException、InterruptedExceptionが{スロー (text.toStringは()。含み( "www.123.com"))場合、{ hadoopOutputStream.write(text.toString()。GetBytesメソッド( )); }そうしないと{ otherOutputStream.write(text.toString()GetBytesメソッド()。)。 } } パブリックFilterRecordWriter(TaskAttemptContextコンテキスト){ ファイルシステムファイルシステム= NULL; 試す{ //获取文件系统 ファイルシステム= FileSystem.get(context.getConfiguration())。 //创建输出文件路径 パスhadoopPath =新しいパス( "/ MapReduceの/ OUTPUTFORMAT /出力/ 123.log"); パスotherPath =新しいパス( "/ MapReduceの/ OUTPUTFORMAT /出力/ other.log"); hadoopOutputStream = fileSystem.create(hadoopPath)。 otherOutputStream = fileSystem.create(otherPath)。 }キャッチ(IOExceptionを電子){ e.printStackTrace(); } } }
パブリッククラスFilterMapperはマッパー<LongWritable、テキスト、テキスト、NullWritable> {延び @Overrideは ボイドマップを保護(LongWritableキー、テキスト値、コンテキストコンテキストは) にIOException、InterruptedExceptionある{スロー 文字列の行= value.toStringを(); context.write(新しいテキスト(ライン)、NullWritable.get()); } }
パブリッククラスFilterReduceはリデューサー<テキストは、NullWritableは、テキスト、NullWritableは> {拡張 @Overrideが 無効に保護削減(テキスト、テキスト、反復処理可能<NullWritable>反復可能な、 コンテキストコンテキストは)IOExceptionが、InterruptedExceptionある{スロー //防止テキスト重复被过滤掉 (NullWritable nullWritableのために:反復可能){ context.write(新しいテキスト(text.toString()+ "\ R \ n")、NullWritable.get())。 } } }
公共の静的な無効メイン(文字列[] argsが){例外をスロー するSystem.setProperty( "HADOOP_USER_NAME"、 "ルート")。 コンフィギュレーションの設定=新しいConfiguration(); ジョブジョブ= Job.getInstance(コンフィギュレーション)。 job.setOutputFormatClass(FilterOutputFormat.class)。 job.setMapperClass(FilterMapper.class)。 job.setMapOutputKeyClass(Text.class)。 job.setMapOutputValueClass(NullWritable.class)。 job.setReducerClass(FilterReduce.class)。 job.setOutputKeyClass(Text.class)。 job.setOutputValueClass(NullWritable.class)。 FileInputFormat.setInputPaths(仕事、新しいパス( "/ MapReduceの/ OUTPUTFORMAT /ログ")); FileOutputFormat.setOutputPath(仕事、新しいパス(」 ブールwaitForCompletion = job.waitForCompletion(TRUE)。 System.exit(waitForCompletion ==真0:1);? }