Hadoopストリーミングを使用してcommoncrawl.orgからのデータを解析しようとしています。コードをテストするためにローカルHadoopをセットアップし、ストリーミングARCfileリーダーを使用する単純なRubyマッパーを用意しました。自分でコードを呼び出すと
cat 1262876244253_18.arc.gz | mapper.rb | reducer.rb
期待どおりに動作します。
hadoopは、ファイルの拡張子が.gzであることを自動的に認識し、解凍してからマッパーに渡すようです。ただし、そうしている間、ストリーム内の\ r\n改行を\nに変換します。ARCはヘッダー行のレコード長に依存しているため、変更するとパーサーが破損します(データ長が変更されたため)。
再確認するために、非圧縮データを期待するようにマッパーを変更し、次のことを行いました。
cat 1262876244253_18.arc.gz | zcat | mapper.rb | reducer.rb
そしてそれは動作します。
私はhadoopが自動的に解凍することを気にしませんが(ストリーミング.gzファイルを非常にうまく処理できますが)、必要な場合は、改行変換などを行わずに「バイナリ」で解凍する必要があります。デフォルトの動作は、解凍されたファイルをファイルごとに1つのマッパーにフィードすることであると思います。これは完璧です。
.gzを解凍しないように依頼する(ファイルの名前を変更することはできません)か、正しく解凍するようにするにはどうすればよいですか?可能であれば、jarファイルで出荷する必要がある特別なInputFormatクラスを使用したくありません。
これらはすべて、最終的にAWSElasticMapReduceで実行されます。