用于 Hadoop 的可移植键值数据文件格式



我正在寻找一种可移植的键值数据文件格式,它可以作为Hadoop的输入和输出格式,并且除了Hadoop之外,还可以直接在C++,Java和Python中读取和写入。 一抓...我需要支持使用非java映射器和化简器(特别是通过Hadoop Pipes的c ++)进行处理。

有什么想法吗? 我应该编写自己的可移植键值文件格式,与Hadoop和Hadoop Pipes互操作吗? 这种新格式对社区有用吗?

长版本:Hadoop Sequence文件(以及它们的表亲Map,Set,Array和BloomMap)似乎是使用Hadoop时高效二进制键值数据存储的标准。 序列文件的一个缺点是它们仅在 Java 中可读和可写(它们是根据序列化的 Java 对象指定的)。 我想构建一个复杂的多阶段MapReduce管道,其中各个阶段的输入和输出必须是可读的,可以从C++,java和python中读取和写入。 此外,我需要能够用Java以外的语言(即c ++)编写映射器和化简器,以便在映射阶段使用大型且高度优化的C ++库。

我已经考虑过各种解决方法,但似乎都没有......吸引力。

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

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

我认为

你做了几个错误的假设:

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

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

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

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

你可以用python/c ++/当前使用Hadoop Streaming的任何内容编写映射器/化简器,并使用序列文件来存储中间格式。所有流需要的是您的映射器/化简器/合路器期望 stdin 上的输入成对keytvalue(您可以自定义分隔符而不是制表符),并以类似的格式输出(同样是可自定义的)。

  • http://hadoop.apache.org/common/docs/current/streaming.html(我相信你已经找到了这个链接,但以防万一)。

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

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

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

最新更新