大規模分散技術勉強会 in 名古屋 - Hadoop本読書会 - 4章 HadoopのI/O
Hadoop本 4章 HadoopのI/Oの疑問点や気になる点について記述してください。
※記入者、該当ページ・該当行は忘れずに書いて下さい。
圧縮されたHDFS上のファイルをMapReduceにかける際の注意
[記入者] terurou
[該当箇所] 89〜90ページ(4.2.2 圧縮と入力スプリット)
圧縮ファイルがHDFSのブロックサイズ大きな場合、スプリット可能な圧縮フォーマットでないと、mapが複数のノードに分散されない(ローカリティが犠牲になる)。
スプリット可能なフォーマットはbzip2とZIP。ただしZIPはファイルの境界のみ可能。
mapの出力の圧縮
[記入者] terurou
[該当箇所] 92〜93ページ(4.2.3.1 mapの出力の圧縮)
mapの出力も圧縮可能。
mapの出力はネットワーク経由でreducerへ転送されるため、LZOのような高速な圧縮フォーマットであれば、性能が向上する可能性がある。
HadoopのRPCプロトコル
[記入者] terurou
[該当箇所] 93〜112ページ(4.3 シリアライゼーション)
標準ではWratableというHadoop独自のバイナリプロトコルが使われている。
WritableではJava以外の言語との相互運用に難がある(他言語の実装が揃っていない)ため、今後はAvroに移行していく予定らしい。(本書ではThriftについても触れられているが、3章のメモで記述したように、現状Thriftは積極的にメンテされていない)
Hadoopのバイナリデータファイルフォーマット
[記入者] terurou
[該当箇所] 112〜125ページ(4.4 ファイルベースのデータ構造)
SequenceFile
複数のバイナリレコード(バイナリのキーと値のペア)を1つのファイルとしてまとめたもの。
バイナリログファイルの格納が利用例。キーがタイムスタンプ、値がログ。
書き込み時はWritable以外のシリアライゼーションフレームワークを利用可。
MapFile
キーでのルックアップができるようにインデックスを持ち、ソートされているSequenceFile。
SequenceFileと異なり、Writableでしか書き込めない。
SequenceFileの「同期点」って何?
[記入者] terurou
[該当箇所] 116〜118ページ(4.4.1.2 SequenceFileの読み込み)
同期点は数レコードごとにレコード境界に埋め込まれる。
SequenceFileはバイナリデータファイルなので、シーク位置が1バイトでもずれるとデータが読み込めなくなってしまう。本書では「リーダーが迷う」という言葉で表現している。
「リーダーが迷って」しまった場合、同期点を元にシーク位置をレコード境界に再度位置あわせする。
SequenceFileの書き込みの際、同期点を挿入する位置を制御できる。
SequenceFileをMapReduceの入力とする際、同期点によってファイル分割され、mapを分散できる。
SequenceFileの圧縮
[記入者] terurou
[該当箇所] 129ページ(4.4.1.5 SequenceFileのフォーマット)
SequenceFileはデータの圧縮の有効・無効を選択できる。
レコード圧縮
SequenceFile内のヘッダで指定されたフォーマットでレコードの値が圧縮される。キーは圧縮されない。
ブロック圧縮
複数のレコードをまとめて圧縮する。
レコード圧縮より圧縮効率が高く、一般にはブロック圧縮のほうを使う方がよい。