Hadoopの入出力クラス(InputFormat/OutputFormat)について。
|
|
InputFormatは、ファイルやDB(HBase)等からデータを読み込み、キーと値に分けて、キー毎にMapperへ受け渡す。
入力データの分割(Split)を行うのが特長。
InputFormatの具象クラスは、getSplits()で入力データを分割する(読み込む範囲を分ける)。
分割されると、Mapperがその分割された部分ごとに処理できるので、並列性が良くなる。
ただし入力データの種類によっては分割できるとは限らない。(例えばFileInputFormatには、分割可能かどうかを示すisSplitable()というメソッドがある。圧縮されたファイルだと(圧縮形式によっては)解凍前の分割は不可能だから)
実際のデータ読み込みはRecordReaderの具象クラスが行う。
InputFormatには、リーダーのインスタンスを生成するcreateRecordReader()がある。
InputFormat(Hadoop0.20.1)には以下のようなクラスがある。
実際によく使うのはTextInputFormatやTableInputFormatといった辺りかな?
クラス名 | リーダー | 出力型 | 説明 | |
---|---|---|---|---|
キー | 値 | |||
org.apache.hadoop.mapreduce. InputFormat |
InputFormatの基本的な抽象クラス。 | |||
org.apache.hadoop.mapreduce.lib.input. FileInputFormat<K, V> |
K | V | ファイルからの入力を扱う抽象クラス。 | |
org.apache.hadoop.mapreduce.lib.input. TextInputFormat |
LineRecordReader | LongWritable | Text | テキストファイルを入力とする。 行ごとにMapperを呼び出す。 値はテキストファイルの1行、キーはその値の開始位置(ファイル内のオフセット。バイト単位)。 →チュートリアル・サンプル |
org.apache.hadoop.mapreduce.lib.input. SequenceFileInputFormat<K, V> |
SequenceFile RecordReader |
K | V | シーケンスファイル(キーと値の形式でバイナリデータを保持するファイル。SequenceFileOutputFormatで作成できる)を入力とする。 キー毎にMapperを呼び出す。 →例:HBaseのテーブルのImport |
OutputFormatは、Reducer(あるいはMapper)からの出力をファイルやDB(HBase)等に書き込む。
実際の書き込み処理を行うのはRecordWriterクラスで、OutputFormatはgetRecordWriter()によってライターインスタンスを返す。
また、出力のコミット(ファイルのフラッシュ)を行う為にOutputCommitterというクラスがある。(getOutputCommitter())
OutputFormat(Hadoop0.20.1)には以下のようなクラスがある。
クラス名 (ライター・コミッター) |
入力型 | 説明 | |
---|---|---|---|
キー | 値 | ||
org.apache.hadoop.mapreduce. OutputFormat<K, V> |
K | V | OutputFormatの基本的な抽象クラス。 |
org.apache.hadoop.mapreduce.lib.output. FileOutputFormat<K, V> |
K | V | ファイルへの出力を行う抽象クラス。 |
org.apache.hadoop.mapreduce.lib.output. TextOutputFormat<K, V> (LineRecordWriter ・FileOutputCommitter) |
K | V | テキストファイルへ出力する。 キー・値はnull(またはNullWritable)以外の場合だけ出力される。 キーと値が共にnull(またはNullWritable)以外の場合、間をタブで区切ってキーと値を出力する。 (→タブ以外で区切りたい場合はCommaTextOutputFormatのようなクラスを自作するか、 設定ファイル(conf)の"mapred.textoutputformat.separator"で区切り文字を指定する) キーと値の両方がnull(またはNullWritable)の場合は何も出力されない。 HadoopはUNIXを想定しているので、改行コードはLF('\n')のみ。 キー・値の型がTextの場合は、そのまま文字列(UTF-8)として出力する。 Text以外の場合はtoString()によって文字列を取得し、UTF-8として出力する。 →チュートリアル・サンプル |
org.apache.hadoop.mapreduce.lib.output. SequenceFileOutputFormat<K, V> |
K | V | シーケンスファイル(キーと値の形式でバイナリデータを保持するファイル)形式で出力する。 シーケンスファイルは、ヘッダー部でキーと値のクラス名を保持する。 また、ファイルの先頭3バイトは「SEQ」となる。 SequenceFileInputFormatで読み込むことが出来る。 →例:HBaseのテーブルのExport |
org.apache.hadoop.mapreduce.lib.output. NullOutputFormat<K, V> |
K | V | 何も出力しない。 例えばHBase用のMapperでTableOutputFormatを使わず直接テーブルを更新する 場合とか、 件数をログ出力するだけなのでレコードとして出力するものが無い場合とか に使用するのだろう。 |