生物物理計算化学者の雛

主に科学に関する諸々を書き留めています。

Hadoop SequenceFileフォーマットを実ファイルでチェック

HadoopのSequenceFileフォーマットで記録されたデータを直接読み込む必要性が生じましたので、SequenceFileのフォーマットを調査しました。
なおこの調査はバージョン 0.21.0 で行いました。

下図は実際に読み込み処理を作成する必要のあるSequenceFileをバイナリエディタで表示したものです。
なお、データ圧縮は行わない非圧縮のものです。

Header部

まずSequenceFile先頭にヘッダ部(図の青色枠)があり、順番に以下のデータが格納されています。
・(青色)マジックナンバーとして「SEQ」の3文字、次にバージョン情報を示すバイナリ"06"が記録されている
・(赤色) KeyValue ペアのクラス名
・(緑色) compression, blockCompression, compressor_class, metadata×2 (この例示したファイルでは全て false なので '00' が5バイト連続しています)
・(青色)sync を示すランダムな16バイトのデータ

KeyValueレコード

次に KeyValue レコードが保存されています。
・(紫色)int型4バイト RecordLength (01 12 66 58 = 17,983,064バイト、約18MB)
・(青色)int型4バイト KeyLength (00 00 00 14 = 20バイト)
・(緑色)key
・(赤色)value
RecordLength は key と value の長さの和です(図の赤色矢印ではさんだ部分の長さ)

sync point

KeyValueレコードの間に sync point が記録されます(図の緑色枠)。
(KeyValueレコードサイズが短い場合には存在しない場合があります。この例ではレコード長が長いため、常にレコード間には sync point が保存されていました)
・(緑色)int型4バイト SYNC_ESCAPE = -1(16進表記で FF FF FF FF) が常に出力される
・(青色)sync を示すランダムな16バイトのデータ(Header部で記録されていたもの)

以降は KeyValue レコード、sync point が順に保存されます。
なお、最後の KeyValue レコード後には sync point は保存されません。