2

いくつかの処理後にSparkを使用する場合、結果をファイルに保存し、簡単なコードでスナッピーコーデックを使用します:

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

その後、Spark を使用してこのフォルダー ファイルを読み取ると、すべてが完全に機能します。しかし、今日、PCでjava snappy(java-snappy 1.1.1.2)を使用して、結果フォルダーのファイルを解凍しようとしました(このファイルは、PCにダウンロードされたこのフォルダーのファイルの1つです)

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 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

リンクからスナッピーネイティブをダウンロードしてビルドしました:

https://code.google.com/p/snappy/ およびソース: https://drive.google.com/file/d/0B0xs9kK-b5nMOWIxWGJhMXd6aGs/edit?usp=sharing

誰かがこの奇妙なエラーについて説明してください!! Hadoop がネイティブの snappy を使用して java-snappy を使用してデータを圧縮すると、いくつかの違いがありますか??????

4

1 に答える 1

5

私は snappy-java の開発者です。Hadoop の SnappyCodec は、Snappy のフォーマット仕様とまったく同じではありません: https://code.google.com/p/snappy/source/browse/trunk/format_description.txt

Hadoop の SnappyCodec は、この形式を拡張して、大きなデータ ストリームを圧縮します。データは (BlockCompressionStream を介して) ブロックに分割され、各ブロックにはいくつかのヘッダーと圧縮データが含まれます。Snappy.uncompress メソッドで圧縮データを読み取るには、各ブロックを抽出してそのヘッダーを削除する必要があります。

于 2014-12-25T15:03:04.720 に答える