OUTPUTFORMATのHadoopのMapReduceの者の分析

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);?
}

 

公開された63元の記事 ウォンの賞賛2 ビュー2722

おすすめ

転載: blog.csdn.net/zuodaoyong/article/details/104112949