2

C++ ライブラリで処理する必要がある zip ファイルが多数あります。そのため、C++ を使用して Hadoop ストリーミング プログラムを作成しています。プログラムは zip ファイルを読み取り、解凍し、抽出されたデータを処理します。私の問題は次のとおりです。

  1. 私のマッパーは、正確に 1 つのファイルのコンテンツを取得できません。通常、2.4 ファイルまたは 3.2 ファイルのようなものを取得します。Hadoop はいくつかのファイルをマッパーに送信しますが、ファイルの少なくとも 1 つが不完全です。zip ファイルをこのように処理できないことはご存知でしょう。マップごとに 1 つのファイルを取得できますか? データの局所性を利用したいので、ファイル リストを入力として使用してプログラムから読み取りたくありません。

  2. Hadoop が zip ファイルを分割しない場合、マップごとに複数の zip ファイルのコンテンツを受け入れることができます。2.3 ファイルのようなものではなく、正確に 1、2、3 ファイルを意味します。私のプログラムは、解凍されたデータを処理するために約800MBのデータファイルをロードする必要があるため、実際にはさらに良くなります。これはできますか?

4

2 に答える 2

3

ここで解決策を見つけることができます:

http://wiki.apache.org/hadoop/FAQ#How_do_I_get_each_of_a_job.27s_maps_to_work_on_one_complete_input-file_and_not_allow_the_framework_to_split-up_the_files.3F

私がお勧めする最も簡単な方法はmapred.min.split.size、ファイルが分割されないように大きな値を設定することです。

これが機能しない場合InputFormatは、それほど難しくない実装を行う必要があります。手順はhttp://developer.yahoo.com/hadoop/tutorial/module5.html#fileformatで確認できます。

于 2012-12-25T11:59:54.750 に答える
-1

最小分割サイズに依存するのではなく、ファイルを Gzip することをお勧めします。

gzip を使用してファイルを圧縮する方法があります

http://www.gzip.org/

Linux を使用している場合は、抽出したデータを次のように圧縮します。

gzip -r /path/to/data

これで、このデータを Hadoop ストリーミング ジョブの入力として渡しました。

于 2014-11-22T01:44:42.467 に答える