1

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

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

https://github.com/fenriswolf/python-hadoop/blob/master/python-hadoop/hadoop/io/compress/LzoCodec.py

(我将 lzo 替换为 snappy 以进行 Snappy 压缩),并且在 python-hadoop 框架内,可以毫无错误地写入和读取这些文件。但是,在 Hadoop 上,当我将它们作为 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 中的实现方式不同,但我不确定它们应该是什么。

是否有任何原因导致在 Java Hadoop 框架之外无法正确生成具有这些压缩方案的序列文件?同样,只要我使用 Gzip、BZip2 或 Default,整个事情就可以正常工作。

4

0 回答 0