S-JIS[2010-03-12] 変更履歴

Hadoop InputFormat/OutputFormat

Hadoopの入出力クラス(InputFormat/OutputFormat)について。


InputFormatの概要

InputFormatは、ファイルやDB(HBase)等からデータを読み込み、キーと値に分けて、キー毎にMapperへ受け渡す。

入力データの分割(Split)を行うのが特長。
InputFormatの具象クラスは、getSplits()で入力データを分割する(読み込む範囲を分ける)。
分割されると、Mapperがその分割された部分ごとに処理できるので、並列性が良くなる。
ただし入力データの種類によっては分割できるとは限らない。(例えばFileInputFormatには、分割可能かどうかを示すisSplitable()というメソッドがある。圧縮されたファイルだと(圧縮形式によっては)解凍前の分割は不可能だから)

実際のデータ読み込みはRecordReaderの具象クラスが行う。
InputFormatには、リーダーのインスタンスを生成するcreateRecordReader()がある。


InputFormatの種類

InputFormat(Hadoop0.20.1)には以下のようなクラスがある。
実際によく使うのはTextInputFormatTableInputFormatといった辺りかな?

クラス名 リーダー 出力型 説明
キー
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

HBase関連のInputFormat


OutputFormatの概要

OutputFormatは、Reducer(あるいはMapper)からの出力をファイルやDB(HBase)等に書き込む。

実際の書き込み処理を行うのはRecordWriterクラスで、OutputFormatはgetRecordWriter()によってライターインスタンスを返す。
また、出力のコミット(ファイルのフラッシュ)を行う為にOutputCommitterというクラスがある。(getOutputCommitter()


OutputFormatの種類

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を使わず直接テーブルを更新する 場合とか、
件数をログ出力するだけなのでレコードとして出力するものが無い場合とか
に使用するのだろう。

HBase関連のOutputFormat


Hadoop APIへ戻る / Hadoop目次へ戻る / Java目次へ行く / 技術メモへ戻る
メールの送信先:ひしだま