在Java Hadoop框架之外创建序列文件

在Java Hadoop框架之外创建序列文件,hadoop,compression,lzo,snappy,Hadoop,Compression,Lzo,Snappy,我一直在尝试在Java框架(具体来说是Python)之外为Hadoop生成序列文件。有一个python hadoop模块,它提供了类似的框架来实现这一点。我已经使用它成功地创建了序列文件;生成的序列文件可以复制到HDF,并用作Hadoop作业的输入。LZO和Snappy在本地Hadoop安装中完全配置,当我在Java上通过org.apache.Hadoop.io.SequenceFile.createWriter这样做时,我可以使用这些算法生成适当的压缩序列文件 但是,在python hadoo

我一直在尝试在Java框架(具体来说是Python)之外为Hadoop生成序列文件。有一个python hadoop模块,它提供了类似的框架来实现这一点。我已经使用它成功地创建了序列文件;生成的序列文件可以复制到HDF,并用作Hadoop作业的输入。LZO和Snappy在本地Hadoop安装中完全配置,当我在Java上通过org.apache.Hadoop.io.SequenceFile.createWriter这样做时,我可以使用这些算法生成适当的压缩序列文件

但是,在python hadoop上尝试LZO或Snappy作为块压缩方案时,似乎没有生成有效的序列文件。我正在使用与此代码中类似的方案:

在这里,我将lzo替换为snappy以进行snappy压缩,在python hadoop框架中,这些文件可以在没有任何错误的情况下写入和读取。但是,在Hadoop上,当我将EOF错误作为Hadoop输入提供时,我会得到EOF错误:

Exception in thread "main" java.io.EOFException
        at org.apache.hadoop.io.compress.BlockDecompressorStream.rawReadInt(BlockDecompressorStream.java:126)
        at org.apache.hadoop.io.compress.BlockDecompressorStream.getCompressedData(BlockDecompressorStream.java:98)
        at org.apache.hadoop.io.compress.BlockDecompressorStream.decompress(BlockDecompressorStream.java:82)
        at org.apache.hadoop.io.compress.DecompressorStream.read(DecompressorStream.java:76)
        at org.apache.hadoop.io.compress.DecompressorStream.read(DecompressorStream.java:64)
        at java.io.DataInputStream.readByte(DataInputStream.java:265)
        at org.apache.hadoop.io.WritableUtils.readVLong(WritableUtils.java:299)
        at org.apache.hadoop.io.WritableUtils.readVInt(WritableUtils.java:320)
        at org.apache.hadoop.io.SequenceFile$Reader.next(SequenceFile.java:1911)
        at org.apache.hadoop.io.SequenceFile$Reader.next(SequenceFile.java:1934)
        at SequenceFileReadDemo.main(SequenceFileReadDemo.java:34)
只有当我使用LZO或Snappy时,我才一直看到这个特殊的消息

我怀疑Hadoop中的LzoCodec和SnappyCodec的生成或读取方式与Python在lzo和snappy中的实现不同,但我不确定它们应该是什么


在JavaHadoop框架之外,没有正确生成具有这些压缩方案的序列文件有什么原因吗?同样,只要我使用Gzip、BZip2或Default,整个过程都很顺利。

您是否尝试过用Java和python创建一个包含相同数据键/值的文件,并对这些文件执行hexdump diff?我有一些记忆,GZip序列文件不存储GZip头的一部分number@ChrisWhite基本上我就是这样测试的。我对GZip没有任何问题,但LZO和Snappy给我带来了麻烦。不知道Hadoop的编解码器是否部分是专有的,我对此表示怀疑。那么hexdump Diff透露了什么呢?