Snappy圧縮形式でHDFSにファイルを保存しています。ローカルのLinuxファイルシステムでこれらのファイルを調べて、それらを作成したHadoopプロセスが正しく実行されていることを確認できるようにしたいと思います。
それらをローカルにコピーし、Google標準ライブラリを使用して解凍しようとすると、ファイルにSnappy識別子がないことがわかります。 Snappy識別子を挿入してこれを回避しようとすると、チェックサムが台無しになります。
別のHadoopプログラムを作成したり、Hiveのようなものを通過させたりせずに、これらのファイルを読み取るにはどうすればよいですか?
私はついに、次のコマンドを使用して、HDFS上のSnappy圧縮ファイルの内容を読み取ることができることを発見しました。
hadoop fs -text filename
追加の検査と処理のためにファイルをテキスト形式でダウンロードすることが目的の場合、そのコマンドの出力をローカルシステム上のファイルにパイプすることができます。また、headを使用して、ファイルの最初の数行を表示することもできます。
Clouderaブログのこの投稿 をご覧ください。 SnappyをHadoopで使用する方法について説明します。基本的に、生のテキスト上のSnappyファイルは分割できないため、複数のホスト間で単一のファイルを読み取ることはできません。
解決策は、Snappyをコンテナー形式で使用することです。したがって、基本的には、圧縮をSnappyとして設定してHadoop SequenceFile
を使用します。説明されているように この回答では 、プロパティmapred.output.compression.codecをorg.Apache.hadoopに設定できます.io.compress.SnappyCodecを実行し、ジョブ出力形式をSequenceFileOutputFormat
として設定します。
そして、それを読むには、コーデック情報がファイルヘッダーに格納されているため、SequenceFile.Reader
を使用するだけで済みます。
これは、hadoopで使用されるsnappyには、 https://code.google.com/p/snappy/ のようなライブラリでは理解できないメタデータがいくつかあるため、hadoopネイティブsnappyを使用してスナップを解除する必要があります。ダウンロードしたデータファイル。