我正在寻找一种可移植的键值数据文件格式,它可以作为 Hadoop 的输入和输出格式,并且除了 Hadoop 之外,它还可以直接在 C++、Java 和 Python 中读写。一个问题......我需要支持使用非 Java 映射器和化简器(特别是通过 Hadoop 管道的 c++)进行处理。
有任何想法吗?我应该编写自己的可移植键值文件格式,与 Hadoop 和 Hadoop 管道互操作吗?这种新格式对社区有用吗?
长版: Hadoop 序列文件(及其近亲 Map、Set、Array 和 BloomMap)似乎是使用 Hadoop 时高效二进制键值数据存储的标准。序列文件的一个缺点是它们只能在 Java 中可读和可写(它们是根据序列化的 java 对象指定的)。我想构建一个复杂的多阶段 MapReduce 管道,其中各个阶段的输入和输出必须可以从 C++、java 和 python 读取和写入。此外,为了在映射阶段使用大型且高度优化的 c++ 库,我需要能够用 java 以外的语言(即 c++)编写映射器和化简器。
我考虑过各种解决方法,但没有一个看起来……有吸引力。
- 转换:在每个 MapReduce 阶段之前和之后添加额外的转换阶段,以在序列文件和与其他语言兼容的可移植格式之间转换阶段的输入和输出。
- 问题:阶段之间消耗和生成的数据非常大(TB)......在每个阶段多次复制数据只是为了获得不同编程语言的读/写访问权限是昂贵的。有 10 个阶段,这对我来说开销太大了($$$)。
- Avro 文件:使用 Avro 的可移植数据文件格式。
- 问题:虽然似乎有代码允许可移植的 Avro 数据文件作为 MapReduce 中的输入或输出格式,但它只适用于用 Java 编写的映射器和缩减器。我已经看到了一些关于通过 avro/mapred/tether 包创建对其他语言的映射器支持的讨论,但目前只支持 java。来自文档:“目前只实现了一个 Java 框架,用于测试目的,所以这个功能还没有用。” http://avro.apache.org/docs/1.5.4/api/java/org/apache/avro/mapred/tether/package-summary.html
- Avro File + SWIG:将 Avro 数据格式与 Java 映射器一起使用,该映射器调用从分布式缓存访问的自定义 SWIG 包装的 c++ 库来进行真正的处理。
- Java 字符串的不变性使得编写 SWIG 包装器变得痛苦且效率低下,因为需要一个副本。而且,这么多层次的包装开始成为维护调试和配置的噩梦!
我正在考虑基于与 Hadoop 和 Hadoop 管道互操作的 H-File 格式编写我自己的语言可移植键值文件格式……有更好的现成替代品吗?这种可移植的格式对社区有用吗?