[英]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 ++)以外的语言编写映射器和化简器。
我考虑过各种解决方法,但是似乎都没有……有吸引力。
我正在考虑基于与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。
最后-您是否研究过AvroAsTextInputFormat
和AvroTextOutputFormat
类,它们可能正是您要查找的(caveat,我从未使用过它们)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.