繁体   English   中英

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

[英]Portable Key-Value data file format for Hadoop?

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

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

较长版本: 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映射器一起使用,该Java映射器调用从分布式缓存访问的自定义SWIG包装的c ++库,以进行实际处理。
    • Java字符串的不可变性使SWIG包装程序的编写变得痛苦而低效,因为需要复制。 同样,包装的许多层也开始成为维护,调试和配置的噩梦!

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

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

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

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

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

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

您可以在python / c ++ /或当前使用Hadoop Streaming的任何程序中编写映射器/化简器,并使用序列文件存储中间格式。 所有流式传输所需的是您的映射器/化简器/合并器期望key\\tvalue对中stdin上的输入(您可以自定义定界符而不是制表符),并以相似的格式输出(再次可自定义)。

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

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

最后-您是否研究过AvroAsTextInputFormatAvroTextOutputFormat类,它们可能正是您要查找的(caveat,我从未使用过它们)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM