4

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で実行されます。

4

1 に答える 1

2

Hadoop PipeMapper.java が原因のようです (少なくとも 0.20.2 では):

106 行目あたりで、TextInputFormat からの入力がこのマッパーに渡され (この段階で \r\n が取り除かれます)、PipeMapper はそれを \n だけで stdout に書き出します。

PipeMapper.java のソースを修正し、この「機能」がまだ存在することを確認し、必要に応じて修正することをお勧めします (構成プロパティを介して設定できるようにすることもできます)。

于 2012-03-28T02:19:31.090 に答える