1.OutputFormatインタフェースクラス
OUTPUTFORMAT MapReduceの出力は、全出力をMapReduceのOUTPUTFORMATインタフェースを達成するために実装される基本クラスです。
1.1テキスト出力TextOutputFormat
TextOutputFormatデフォルトの出力フォーマットは、各レコードのテキスト行に書き込まれ、キーとその値は文字列に変換するTextOutputFormatコールのtoString()メソッドのように、任意のタイプであってもよいです。
1.2 SequenceFileOutputFormat
入力として後続のMapReduce SequenceFileOutputFormat簡単に圧縮するために、、そのコンパクトな形式で、良好な出力フォーマットであるタスクの出力、。
1.3カスタムOUTPUTFORMAT
ユーザーの要件、カスタム実装の出力によると、
2.カスタムOUTPUTFORMAT
2.1利用シナリオ
出力パスと出力ファイル形式の最終的な制御を達成するために、自動的にOUTPUTFORMATすることができます。
例えば:別のディレクトリに出力結果データに応じMapReduceのプログラムタイプに、このようなフレキシブル出力要求がカスタムOUTPUTFORMATによって達成することができます。
2.2カスタマイズステップOUTPUTFORMAT
2.2.1カスタムクラスを継承FileOutputFormatいます。
2.2.2書き換えRecordWriter、書き込み書き換え特定の出力データ()。
2.3デマンド
ログログ入力フィルタは、ファイルにBaiduのサイトbaidu.log出力を備え、それはother.log Baiduの出力ファイルへのサイトが含まれていません。
http:// www.baidu.com
ます。http:// www.google.com
ます。http:// cn.bing.com
ます。http:// www.baidu.com
ます。http:// www.sohu.com
のhttp:// WWW .sina.com
ます。http:// www.sin2a.com
ます。http:// www.sin2desa.com
ます。http:// www.sindsafa.com
3.カスタムケースOUTPUTFORMAT実用的な操作
3.1 FilterMapperを書きます
パッケージcom.wn.outputformat。
輸入org.apache.hadoop.io.LongWritable;
輸入org.apache.hadoop.io.NullWritable;
輸入org.apache.hadoop.io.Text;
輸入org.apache.hadoop.mapreduce.Mapper;
インポートにjava.io.IOException;
パブリック クラス FilterMapperはマッパー<LongWritableは、テキスト、テキスト、NullWritable>は拡張{
@Overrideは、
保護された 無効マップ(LongWritableキー、テキスト値、コンテキストコンテキスト)にIOException、InterruptedExceptionある{スロー
// 写出
context.write(値を、NullWritable。取得します() );
}
}
3.2 FilterReducerを書きます
パッケージcom.wn.outputformat。
輸入org.apache.hadoop.io.NullWritable;
輸入org.apache.hadoop.io.Text;
輸入org.apache.hadoop.mapreduce.Reducer;
インポートにjava.io.IOException;
パブリック クラス FilterReducerは減速を<テキスト、NullWritable、テキスト、NullWritable>延び{
テキストテキスト = 新しいテキスト();
@Override
保護 ボイド低減(テキストキーを、反復処理可能で<NullWritableは> の値は、コンテキスト・コンテキスト)にIOException、InterruptedExceptionがスロー{
// 获取一行
文字ライン= text.toString()。
// 拼接
line =行+ " \ rを\ nは" ;
// セット
。テキストSET (ライン);
// 出力
context.write(テキスト、NullWritable。GET ());
}
}
3.3 FilterRecordWriterを書きます
パッケージcom.wn.outputformat。
輸入org.apache.hadoop.fs.FSDataOutputStream;
輸入org.apache.hadoop.fs.FileSystem;
輸入org.apache.hadoop.fs.Path。
輸入org.apache.hadoop.io.IOUtils。
輸入org.apache.hadoop.io.NullWritable;
輸入org.apache.hadoop.io.Text;
輸入org.apache.hadoop.mapreduce.RecordWriter;
輸入org.apache.hadoop.mapreduce.TaskAttemptContext;
インポートにjava.io.IOException;
パブリック クラス FilterRecordWriterはRecordWriter <テキスト、NullWritable>延び{
FSDataOutputStream atguiguOut = ヌル。
FSDataOutputStream otherOut = nullを。
公衆FilterRecordWriter(TaskAttemptContext仕事){
// 取得したファイルシステムの
ファイルシステムFS;
試し{
FS =ファイルシステム。GET (job.getConfigurationを());
//は、出力ファイルのパスを作成します
atguiguPathがPATH = 新新(パスを「E:\\ \\ APTECH Hadoopの大規模なデータ\\ \\ 04をbaidu.log " );
パスotherPath = 新しい新しいパス(" E:\\ APTECH Hadoopの\\ \\ \\大規模データother.log 04 " );
// 出力ストリームを作成します
atguiguOut = fs.create(atguiguPath);
otherOut =fs.create(otherPath)。
} キャッチ(IOExceptionを電子){
e.printStackTrace();
}
}
@Override
公共 のボイドの書き込み(テキスト、テキスト、NullWritable nullWritableは)にIOException、InterruptedExceptionがスロー{
// 判断包含"百度"输出到不同文件
場合(text.toStringは()。(含まれている" 百度" {))
atguiguOut.writeを( text.toString()GetBytesメソッド())。
} 他{
otherOut.write(text.toString()GetBytesメソッド()。)。
}
}
@Override
公共 のボイド近い(TaskAttemptContext taskAttemptContext)はIOExceptionが、例外:InterruptedExceptionをスロー{
// 关闭资源
IOUtils.closeStream(atguiguOut)。
IOUtils.closeStream(otherOut)。
}
}
3.4 FilterOutputFormatを書きます
パッケージcom.wn.outputformat。
インポートにjava.io.IOException;
輸入org.apache.hadoop.io.NullWritable;
輸入org.apache.hadoop.io.Text;
輸入org.apache.hadoop.mapreduce.RecordWriter;
輸入org.apache.hadoop.mapreduce.TaskAttemptContext;
輸入org.apache.hadoop.mapreduce.lib.output.FileOutputFormat。
パブリック クラス FilterOutputFormatはFileOutputFormat <テキスト、NullWritable>延び{
@Override
公共 RecordWriter <テキスト、NullWritable> getRecordWriter(TaskAttemptContext taskAttemptContextが)にIOException、InterruptedExceptionあるが{スロー
戻り 新しいFilterRecordWriter(taskAttemptContext)を、
}
}
3.5 FilterDriverを書きます
com.wn.outputformatパッケージ;
インポートorg.apache.hadoop.conf.Configuration;
インポートorg.apache.hadoop.fs.Path;
インポートorg.apache.hadoop.io.NullWritable;
インポートorg.apache.hadoop.io.Text ;
インポートorg.apache.hadoop.mapreduce.Job;
インポートorg.apache.hadoop.mapreduce.lib.input.FileInputFormat;
インポートorg.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
インポートにjava.io.IOException;
公衆 クラスFilterDriver {
公共 静的 ボイドメイン(文字列[]引数)はIOExceptionが、ClassNotFoundExceptionがスローされ、InterruptedExceptionある{
// 入出力経路ニーズは、そのコンピュータ上の実際の入力及び出力経路に応じて設定される
引数= 新しい新しい文字列[] {" E:\\北大青鸟\\大数据04 \\ Hadoopの\\入力"、" E:\\北大青鸟\\大数据04 \\ Hadoopの\\出力" }。
設定confが = 新しいコンフィギュレーション();
ジョブジョブ = Job.getInstance(CONF)。
job.setJarByClass(FilterDriver。クラス);
job.setMapperClass(FilterMapper。クラス);
job.setReducerClass(FilterReducer。クラス);
job.setMapOutputKeyClass(テキスト。クラス);
job.setMapOutputValueClass(NullWritable。クラス);
job.setOutputKeyClass(テキスト。クラス);
job.setOutputValueClass(NullWritable。クラス);
// 仕事に独自のカスタム設定コンポーネント出力フォーマット
。job.setOutputFormatClass(FilterOutputFormat クラス);
FileInputFormat.setInputPaths(仕事、新しい新しいパス(引数[ 0 ])) ;
FileOutputFormat.setOutputPath(ジョブ、新しい新しいパス(引数[ 1 ]));
ブールB =(job.waitForCompletion 真の);
System.exitと(B?0:1 );
}
}