1

現在、10 台のサーバーの Hadoop クラスターで約 300 GB のログ ファイルを処理しています。私のデータは YYMMDD という名前のフォルダーに保存されているため、毎日すぐにアクセスできます。

私の問題は、今日、ログ ファイルにあるタイムスタンプが、予想どおり UTC ではなく DST (GMT -0400) になっていることを発見したことです。つまり、これは、logs/20110926/*.log.lzo に 2011-09-26 04:00 から 2011-09-27 20:00 までの要素が含まれていることを意味し、そのデータに対して行われた map/reduce をほとんど台無しにしています (つまり、統計を生成します)。

map/reduce ジョブを実行して、すべてのログ ファイルを正しく再分割する方法はありますか? 私が知る限り、ストリーミングを使用して特定のレコードを出力ファイル A に送信し、残りのレコードを出力ファイル B に送信する方法はないようです。

現在使用しているコマンドは次のとおりです。

/opt/hadoop/bin/hadoop jar /opt/hadoop/contrib/streaming/hadoop-streaming-0.20.2-cdh3u1.jar \
-D mapred.reduce.tasks=15 -D mapred.output.compress=true \
-D mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec \
-mapper map-ppi.php -reducer reduce-ppi.php \
-inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat \
-file map-ppi.php -file reduce-ppi.php \
-input "logs/20110922/*.lzo" -output "logs-processed/20110922/"

Java やカスタム クラスの作成については何も知りません。http://blog.aggregateknowledge.com/2011/08/30/custom-inputoutput-formats-in-hadoop-streaming/に投稿されたコードを試してみました(そこにあるものをほとんどコピー/貼り付けました) が、できませんでした。まったく機能しません。何を試しても、「-outputformat : class not found」というエラーが表示されます。

お時間とご協力ありがとうございました:)。

4

2 に答える 2

1

私が知る限り、ストリーミングを使用して特定のレコードを出力ファイル A に送信し、残りのレコードを出力ファイル B に送信する方法はないようです。

カスタムPartitionerを使用することで、どのキーがどのレデューサーに送られるかを指定できます。デフォルトでは、HashPartitionerが使用されます。他の唯一のパーティショナー ストリーミング サポートはKeyFieldBasedPartitionerのようです。

ここでストリーミングのコンテキストで KeyFieldBasedPartitioner の詳細を確認できます。ストリーミングを使用して KeyFieldBasedPartitioner を構成するために、Java の知識は必要ありません。

map/reduce ジョブを実行して、すべてのログ ファイルを正しく再分割する方法はありますか?

ファイルを再分割する MR ジョブを作成できるはずですが、Partitioner で問題を解決できるはずです。

于 2011-09-27T07:25:48.177 に答える
0

カスタムMultipleOutputFormatとPartitionerは、データを日ごとに分割する正しい方法のようです。

その投稿の著者として、あなたがとても大変な時間を過ごしたことをお詫び申し上げます。「クラスが見つかりません」というエラーが発生した場合は、「-libjars」にカスタム出力形式を含めた後、カスタム出力形式が見つからないという問題が発生したようです。

于 2012-01-29T19:21:42.033 に答える