hadoop发出的本机snappy压缩数据无法通过java snappy版本提取

cgyqldqp  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(530)

当我们在一些处理后使用spark时,我将结果存储到文件中,并使用带有简单代码的snappy编解码器:

data.saveAsTextFile("/data/2014-11-29",classOf[org.apache.hadoop.io.compress.SnappyCodec])

之后,当我使用spark来阅读这个文件夹文件,所以一切工作都很完美!但是今天我尝试在我的pc中使用java snappy(java snappy 1.1.1.2)来解压缩结果文件夹中的一个文件(这个文件是从这个文件夹下载到我的pc中的一个文件)
maven依赖关系:

<dependency>
    <groupId>org.xerial.snappy</groupId>
    <artifactId>snappy-java</artifactId>
    <version>1.1.1.2</version>
</dependency>

我用这个代码来解压:

File fileIn = new File("E:\\dt\\part-00000.snappy");
File fileOut = new File("E:\\dt\\adv1417971604684.dat");
FileOutputStream fos = new FileOutputStream(fileOut, true);
byte[] fileBytes = Files.readAllBytes(Paths.get(fileIn.getPath()));
byte[] fileBytesOut = Snappy.uncompress(fileBytes);
fos.write(fileBytesOut);

但是:(我立刻得到这个错误:

java.io.IOException: FAILED_TO_UNCOMPRESS(5)
 at org.xerial.snappy.SnappyNative.throw_error(SnappyNative.java:84)
 at org.xerial.snappy.SnappyNative.rawUncompress(Native Method)
 at org.xerial.snappy.Snappy.rawUncompress(Snappy.java:444)
 at org.xerial.snappy.Snappy.uncompress(Snappy.java:480)
 at org.xerial.snappy.Snappy.uncompress(Snappy.java:456)
 at

在spark cluster中,我们使用:
spark 1.1.0和hadoop 2.5.1(使用本机hadoop snappy)
下面是我运行hadoop checknative-a的结果:

14/12/09 16:16:57 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2    library system-native
14/12/09 16:16:57 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop: true /usr/local/hadoop/hadoop2.5.1/lib/native/libhadoop.so
zlib:   true /lib64/libz.so.1
snappy: true /usr/local/hadoop/hadoop2.5.1/lib/native/libsnappy.so.1
lz4:    true revision:99
bzip2:  true /lib64/libbz2.so.1

我从以下链接下载并构建snappy native:
https://code.google.com/p/snappy/ 来源:https://drive.google.com/file/d/0b0xs9kk-b5nmowixwgjhmxd6ags/edit?usp=sharing
有人请解释一下这个奇怪的错误!!hadoop使用本机snappy压缩来自java snappy的数据时有什么区别吗??????

aiqt4smr

aiqt4smr1#

我是SnappyJava的开发者。hadoop的snappycodec与snappy的格式规范不完全相同:https://code.google.com/p/snappy/source/browse/trunk/format_description.txt
hadoop中的snappycodec扩展了这种格式来压缩大数据流。数据被分成块(通过blockcompressionstream),每个块都有一些头和压缩数据。要使用snappy.uncompress方法读取压缩数据,需要提取每个块并删除其头。

相关问题