Hadoop的可移植键值数据文件格式? 我正在寻找一个便携式的键值数据文件格式,它可以作为Hadoop的输入和输出格式,并且除了在Huoop中直接在C++、java和Python之外也是可读和可写的。一个陷阱。。。我需要支持非java映射器和还原器(特别是通过Hadoop管道C++)。p>
有什么想法吗?我是否应该编写自己的可移植键值文件格式,以便与Hadoop和Hadoop管道互操作?这样的新形式对社会有用吗 长版本: Hadoop序列文件(以及它们的近亲Map、Set、Array和BloomMap)似乎是使用Hadoop时高效二进制键值数据存储的标准。序列文件的一个缺点是它们只能在Java中可读写(它们是根据序列化的Java对象指定的)。我想建立一个复杂的多级MapReduce管道,其中输入和输出到各个阶段必须是可读的和可写的,从C++、java和Python。此外,我需要能够用java(C++ C++)以外的语言编写映射器和还原器,以便在映射阶段使用大的和高度优化的C++库。 我考虑过各种解决办法,但没有一个。。。吸引人Hadoop的可移植键值数据文件格式? 我正在寻找一个便携式的键值数据文件格式,它可以作为Hadoop的输入和输出格式,并且除了在Huoop中直接在C++、java和Python之外也是可读和可写的。一个陷阱。。。我需要支持非java映射器和还原器(特别是通过Hadoop管道C++)。p>,c++,python,hadoop,portability,key-value,C++,Python,Hadoop,Portability,Key Value,有什么想法吗?我是否应该编写自己的可移植键值文件格式,以便与Hadoop和Hadoop管道互操作?这样的新形式对社会有用吗 长版本: Hadoop序列文件(以及它们的近亲Map、Set、Array和BloomMap)似乎是使用Hadoop时高效二进制键值数据存储的标准。序列文件的一个缺点是它们只能在Java中可读写(它们是根据序列化的Java对象指定的)。我想建立一个复杂的多级MapReduce管道,其中输入和输出到各个阶段必须是可读的和可写的,从C++、java和Python。此外,我需要能够
- 问题:阶段之间消耗和生成的数据非常大(TB)。。。在每个阶段多次复制数据只是为了用不同的编程语言获得读/写访问权,成本很高。共有10个阶段,这对我来说是太多的开销($$)
- 问题:虽然似乎有代码允许便携式Avro数据文件在MapReduce中用作输入或输出格式,但它仅适用于用Java编写的映射器和还原器。我已经看过一些关于通过avro/mapred/tether包为其他语言的映射程序创建支持的讨论,但目前只支持java。从文档中可以看出:“为了测试的目的,目前只实现了一个Java框架,所以这个特性还没有用。”
- java字符串的不变性使得编写SWIG包装器既痛苦又低效,因为需要一个副本。而且,这种多层包装开始成为维护、调试和配置的噩梦李>
我正在考虑基于与Hadoop和Hadoop管道互操作的H文件格式编写自己的语言可移植键值文件格式。。。有更好的现成替代品吗?这种可移植的格式对社区有用吗?我想你做了一些错误的假设: 序列文件的一个缺点是它们只能在Java中可读写(它们是根据序列化Java对象指定的) 取决于序列化java对象的含义。Hadoop使用WritableSerialization类来提供序列化机制,而不是默认的Java序列化机制。您可以将hadoop配置为使用默认Java序列化(
JavaSerialization
),或您选择的任何自定义实现(通过io.serializations
配置属性)
这样,如果使用Hadoop可写机制,只需要编写C++的读取器,C++可以解释序列文件,然后编写C++类/ Python等类,您希望序列化(但这将是一个令人痛苦的维护,并导致您的第二个问题,AVRO)
<> P>此外,我需要能够用java(C++)以外的语言编写映射器和还原器,以便在映射阶段中使用大的和高度优化的C++库。 < P>可以用Python/C++ +任何当前使用Hadoop流的方法编写映射器/还原器,并使用序列文件来存储中间格式。流式处理所需的只是映射器/还原器/组合器希望stdin上的输入为key\tvalue
对(您可以自定义分隔符而不是制表符),并以类似格式输出(这也是可自定义的)
- (我相信你已经找到了这个链接,但以防万一)
avputformat
和avrotexoutputformat
类,它们可能正是您想要的(注意,我从未使用过它们)谢谢您的回复!SerializationJava Only Format当我声称序列文件是“java Only”格式时,我指的不是键值对的序列化(正如您提到的,它是可配置的),而是写入磁盘的字节的低级格式,它决定了容器格式本身。该格式是根据序列化的java原语(例如,可变长度整数的java内部表示形式等)指定的。这使得用其他语言编写解析器变得困难。你知道一家公司吗