【发布时间】:2013-11-17 17:10:10
【问题描述】:
我刚刚开始为开放街道地图数据开发基于 hadoop 的摄取器。有几种格式 - 但我一直针对基于协议缓冲区的格式(注意 - 它不是纯 pb)。
在我看来,将文件预拆分为序列文件会更有效——而不是在自定义记录读取器/输入格式中处理可变长度编码——但需要进行完整性检查。
格式在PBF Format Description有更详细的描述 但基本上它是 [BlobHeader,Blob] 块的集合。
有一个 Blob 标头
message BlobHeader {
required string type = 1;
optional bytes indexdata = 2;
required int32 datasize = 3;
}
然后是Blob(大小由header中的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/标题的偏移量 - 并且也没有指向它们的索引 - 如果不首先通过文件流式传输,我看不到任何方法来获取我的分割点。
现在我不需要从磁盘上实际读取整个文件 - 我可以从读取标题开始,使用该信息查找 blob,将其设置为第一个分割点,然后重复。但这是我能想到的预分割成序列文件的唯一替代方法。
有没有更好的方法来处理这个问题 - 如果没有,对这两个建议的想法?
【问题讨论】:
标签: hadoop gis openstreetmap hadoop-partitioning