我刚刚开始研究基于 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.
}
一旦你进入blob显然会有更多的结构 - 但我会在映射器中处理它 - 我想做的是最初每个映射器有一个blob(后来可能是每个映射器的一些blob)。
其他一些输入格式/记录读取器使用“足够大”的拆分大小,然后向后/向前搜索到分隔符 - 但由于没有分隔符可以让我知道 blob/headers 的偏移量 - 并且没有索引也指向他们 - 如果不首先通过文件流式传输,我看不到任何方法来获得我的分割点。
现在我不需要从磁盘上实际读取整个文件——我可以从读取标题开始,使用该信息查找 blob,将其设置为第一个分割点,然后重复。但这是我能想到的预分割成序列文件的唯一替代方法。
有没有更好的方法来处理这个 - 或者如果没有,对这两个建议的想法?