2

我正在寻找一种可移植的键值数据文件格式,它可以作为 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++)编写映射器和化简器。

我考虑过各种解决方法,但没有一个看起来……有吸引力。

  1. 转换:在每个 MapReduce 阶段之前和之后添加额外的转换阶段,以在序列文件和与其他语言兼容的可移植格式之间转换阶段的输入和输出。
    • 问题:阶段之间消耗和生成的数据非常大(TB)......在每个阶段多次复制数据只是为了获得不同编程语言的读/写访问权限是昂贵的。有 10 个阶段,这对我来说开销太大了($$$)。
  2. 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
  3. Avro File + SWIG:将 Avro 数据格式与 Java 映射器一起使用,该映射器调用从分布式缓存访问的自定义 SWIG 包装的 c++ 库来进行真正的处理。
    • Java 字符串的不变性使得编写 SWIG 包装器变得痛苦且效率低下,因为需要一个副本。而且,这么多层次的包装开始成为维护调试和配置的噩梦!

我正在考虑基于与 Hadoop 和 Hadoop 管道互操作的 H-File 格式编写我自己的语言可移植键值文件格式……有更好的现成替代品吗?这种可移植的格式对社区有用吗?

4

1 回答 1

1

我认为您已经做出了一些错误假设:

序列文件的一个缺点是它们只能在 Java 中可读和可写(它们是根据序列化的 java 对象指定的)

取决于序列化的 java 对象的含义。Hadoop 使用 WritableSerialization 类来提供序列化机制,而不是默认的 Java 序列化机制。您可以将 hadoop 配置为使用默认的 Java 序列化 ( JavaSerialization),或您选择的任何自定义实现(通过io.serializations配置属性)。

因此,如果您使用 Hadoop Writable 机制,您只需要为 C++ 编写一个可以解释序列文件的阅读器,然后编写您希望序列化的类的 c++/python 等价物(但这会很麻烦,并且会导致你的第二个问题,Avro)

此外,为了在映射阶段使用大型且高度优化的 c++ 库,我需要能够用 java 以外的语言(即 c++)编写映射器和化简器

您可以在 python/c++/任何当前使用 Hadoop Streaming 的语言中编写映射器/reducers,并使用序列文件来存储中间格式。所有流式传输需要的是您的映射器/缩减器/组合器需要key\tvalue成对输入标准输入(您可以自定义分隔符而不是制表符),并以类似的格式输出(同样是可自定义的)。

那么,如果您想将更复杂的键/值对传递到/从您的流式映射器/reducer 中呢?在这种情况下,我会说考虑自定义 contrib/流式源代码,特别是 PipeMapper、PipeReducer 和 PipeMapRed 类。例如,您可以将输出/输入修改为<Type-int/str,Length-int,Value-byte[]>元组,然后修改您的 python / c++ 代码以进行适当的解释。

通过这些修改,您可以使用 Avro 来管理围绕 hadoop 流框架 (Java) 和您的 c++/python 代码之间的序列化的代码。您甚至可以使用 Avro。

最后 - 您是否查看了AvroAsTextInputFormatAvroTextOutputFormat类,它们可能正是您正在寻找的(警告,我从未使用过它们)

于 2012-04-19T01:22:35.100 回答