7

私の仕事では、多くの履歴ログセットを解析する必要があります。個々の顧客 (数千人) は、日付ごとに分割された数百のログ サブディレクトリを持っている場合があります。例えば:

  • ログ/Customer_One/2011-01-02-001
  • ログ/Customer_One/2012-02-03-001
  • ログ/Customer_One/2012-02-03-002
  • ログ/Customer_Two/2009-03-03-001
  • ログ/Customer_Two/2009-03-03-002

個々のログ セット自体が 5 ~ 6 レベルの深さで、数千のファイルが含まれている場合があります。

したがって、実際には、個々のマップ ジョブでサブディレクトリの移動を処理する必要があります。個々のファイルを単純に列挙することは、私の分散コンピューティングの問題の一部です。

残念ながら、ログのサブディレクトリのみを含むディレクトリを Hadoop に渡そうとすると、これらのサブディレクトリをマッパーに渡すことができないというエラーが表示されます。(繰り返しますが、サブディレクトリを入力として受け入れるように書いています):

$ hadoop jar "${HADOOP_HOME}/contrib/streaming/hadoop-streaming-${HADOOP_VERSION}.jar" -input file:///mnt/logs/Customer_Name/ -file mapper.sh -mapper "mapper.sh" -file reducer.sh -reducer "reducer.sh" -output .

[ . . . ]

12/04/10 12:48:35 ERROR security.UserGroupInformation: PriviledgedActionException as:cloudera (auth:SIMPLE) cause:java.io.IOException: Not a file: file:/mnt/logs/Customer_Name/2011-05-20-003 12/04/10 12:48:35 ERROR streaming.StreamJob: Error Launching job : Not a file: file:/mnt/logs/Customer_Name/2011-05-20-003 Streaming Command Failed! [cloudera@localhost ~]$

ディレクトリを作業項目として割り当てることを Hadoop ストリーミングに許可する簡単な方法はありますか?

4

2 に答える 2

2

ルートディレクトリも渡すことができるカスタムInputFormatの作成を調査する必要があると思います。これにより、顧客ごとに分割が作成され、各分割のレコードリーダーがディレクトリウォークを実行し、ファイルの内容をマッパーにプッシュします

于 2012-04-10T21:04:00.603 に答える
2

Hadoop は、正規表現である入力パスをサポートしています。多くの複雑な正規表現を試したことはありませんが、単純なプレースホルダーは? そして*はうまくいきます。

したがって、あなたの場合、入力パスとして次のものがあればうまくいくと思います:

file:///mnt/logs/Customer_Name/*/*

最終ディレクトリ内のすべてのファイルが入力パスとして自動的に追加されるため、最後のアスタリスクは必要ない場合があります。

于 2013-03-31T17:54:43.767 に答える