オープン ストリート マップ データの Hadoop ベースのインジェスターに取り組み始めたところです。いくつかの形式がありますが、私はプロトコル バッファ ベースの形式をターゲットにしています (注意 - 純粋な pb ではありません)。
カスタムレコードリーダー/入力形式で可変長エンコーディングを処理するのではなく、ファイルをシーケンスファイルに事前に分割する方が効率的であるように見えますが、サニティチェックが必要です。
形式については、 PBF 形式の説明で詳しく説明されていますが 、基本的には [BlobHeader,Blob] ブロックのコレクションです。
Blobヘッダーがあります
message BlobHeader {
required string type = 1;
optional bytes indexdata = 2;
required int32 datasize = 3;
}
次に、Blob (サイズはヘッダーの datasize パラメーターで定義されます)
message Blob {
optional bytes raw = 1; // No compression
optional int32 raw_size = 2; // Only set when compressed, to the uncompressed size
optional bytes zlib_data = 3;
// optional bytes lzma_data = 4; // PROPOSED.
// optional bytes OBSOLETE_bzip2_data = 5; // Deprecated.
}
明らかにブロブに取り掛かると、より多くの構造があります-しかし、私はそれをマッパーで処理します-私がやりたいことは、最初はマッパーごとに1つのブロブを持つことです(後でマッパーごとにブロブの倍数になる可能性があります)。
他の入力形式/レコードリーダーの一部は、「十分に大きい」分割サイズを使用し、区切り記号まで後方/前方にシークしますが、ブロブ/ヘッダーのオフセットを知らせる区切り記号がないため、インデックスがないためです。それらのいずれかを指しています-最初にファイルをストリーミングしないと、分割ポイントを取得する方法がわかりません。
これで、実際にディスクからファイル全体を読み取る必要がなくなります。ヘッダーの読み取りから始め、その情報を使用して BLOB をシークし、それを最初の分割ポイントとして設定してから繰り返すことができます。しかし、それは私が思いつくことができるシーケンスファイルへの事前分割に代わる唯一の方法です.
これを処理するより良い方法はありますか?そうでない場合は、2つの提案について考えてください。