这些二进制模式是由HADOOP-1722添加的。在调用Hadoop Streaming作业的命令行上,"-io rawbytes"允许您将数据定义为32位整数大小,后跟该大小的原始数据;"-io typedbytes"允许您将数据定义为1位零(表示原始字节),后跟32位整数大小,后跟该大小的原始数据。我已经创建了这些格式的文件(包含一个或多个记录),并通过使用/对比typedbytes.py的输出来验证它们是否处于正确的格式中。我还尝试了所有可能的变化(大端、小端、不同的字节偏移等)。我正在使用CDH4中的Hadoop 0.20,它具有实现typedbytes处理的类,并且当设置"-io"开关时,它会进入这些类。
我使用"hadoop fs -copyFromLocal"将二进制文件复制到HDFS。当我尝试将其用作MapReduce作业的输入时,它在试图创建指定长度(例如3个字节)的字节数组的行上失败,并显示一个OutOfMemoryError。它可能会错误地读取数字并尝试分配一个巨大的块。尽管如此,它确实成功地将记录传递给Mapper(是前面的记录吗?不确定),Mapper将其写入标准错误,以便我可以看到它。记录开头始终有太多字节:例如,如果文件是"\x00\x00\x00\x00\x03hey",则Mapper将看到"\x04\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x08\x00\x00\x00\x00\x03hey"(可重现的位,但我看不出任何规律)。
从这个讲座的第5页我了解到,流处理中有“loadtb”和“dumptb”子命令,可以在一步中将类型化的字节复制到/从HDFS并将其包装/解包到SequenceFile中。当与“-inputformat org.apache.hadoop.mapred.SequenceFileAsBinaryInputFormat”一起使用时,Hadoop正确地解压缩了SequenceFile,但随后以完全相同的方式错误地解释了其中包含的类型化字节。
此外,我找不到任何关于此功能的文档。在2月7日(我将其电子邮件发送给自己),它在Apache上的streaming.html页面中简要提到,但是这个r0.21.0网页已被删除,r1.1.1的等效页面没有提到原始字节或类型化字节。
我的问题是:在Hadoop Streaming中使用rawbytes或typedbytes的正确方法是什么?有人曾经成功过吗?如果有,能否发布一份说明书?似乎这对于想要在Hadoop Streaming中使用二进制数据的任何人来说都是一个问题,而这应该是一个相当广泛的群体。附言:我注意到Dumbo、Hadoopy和rmr都使用了这个功能,但应该有一种直接使用它的方法,而不需要通过基于Python或R的框架进行介绍。