22

複数のレベルのファイルを含む、ネストされたディレクトリ構造を処理するジョブに取り組んでいます。

one/
├── three/
│   └── four/
│       ├── baz.txt
│       ├── bleh.txt
│       └── foo.txt
└── two/
    ├── bar.txt
    └── gaa.txt

入力パスとして追加するone/と、ルート レベルですぐに使用できるファイルがないため、ファイルは処理されません。

について読みましjob.addInputPathRecursively(..)たが、これは最近のリリースでは非推奨になっているようです (私は Hadoop 1.0.2 を使用しています)。フォルダーをウォークスルーし、各ディレクトリを で追加するコードをいくつか書きました。これは、何らかの理由でディレクトリjob.addInputPath(dir)を入力ファイルとして処理しようとしたときにジョブがクラッシュするまで機能しましfs.open(split.getPath())た。 .split.getPath()LineRecordReader.java

ネストされたディレクトリ構造を持つジョブを提供するためのより簡単な方法が必要であると自分自身に納得させようとしています。何か案は?

編集- どうやらこれには未解決のバグがあります。

4

5 に答える 5

14

これに関するドキュメントは見つかりませんでしたが、*/*機能します。です-input 'path/*/*'

于 2012-08-13T06:57:02.163 に答える
4

distcpまたは同様のものからのログファイルが残っている可能性があるため、データを再帰的に処理することは危険な場合があります。代替案を提案させてください:

コマンド ラインで再帰ウォークを実行し、スペースで区切られたパラメーターでパスを MapReduce プログラムに渡します。からリストを取得しますargv

$ hadoop jar blah.jar "`hadoop fs -lsr recursivepath | awk '{print $8}' | grep '/data.*\.txt' | tr '\n' ' '`"

長いバッシュで申し訳ありませんが、仕事は完了です。ものを bash スクリプトでラップして、変数に分割することができます。

私は個人的に、mapreduce ジョブを作成するための pass-in-filepath アプローチが好きなので、コード自体にハードコーディングされたパスがなく、より複雑なファイル リストに対して実行するように設定するのが比較的簡単です。

于 2012-04-18T17:31:57.543 に答える
2

まだ関連性があるかどうかはわかりませんが、少なくとも hadoop 2.4.0 では、プロパティ mapreduce.input.fileinputformat.input.dir.recursive を true に設定する問題が解決します。

于 2014-12-04T12:46:40.073 に答える
-1

FileInputFormat.addInputPath("with file pattern"); を使用するだけです。入力が.gz形式のdiffディレクトリからのグラフ分析用の最初のhadoopプログラムを書いています...それは私のために働きました!!!

于 2012-04-27T21:49:48.237 に答える