3

次のような膨大な数のログファイルがHDFSに保存されています。

2012-10-20 00:05:00; BEGIN
...
SQL ERROR -678: Error message
...
2012-10-20 00:47:20; END

時間枠内に特定のSQLエラーコードが発生した頻度を知りたいのですが、例:2012年10月20日午前0時から2012年10月20日午前1時までに発生した678のSQLエラーの数。

ファイルは通常、いくつかのブロックに分割されるため、すべてのデータノードに分散できます。

そのようなクエリは可能ですか?hadoop mapreduce JavaAPIまたはApachePigを使用したいのですが、時間枠条件を適用する方法がわかりません。

4

1 に答える 1

1

HDFS は、ファイルをブロックに分割する際に新しい行を考慮しないため、1 行が 2 つのブロックに分割される可能性があります。ただし、MapReduce は行うため、入力ファイル内の行は単一のマッパーによって処理されます。

2012-10-20 00:05:00; BEGIN
...
SQL エラー -678: エラー メッセージ
...
2012-10-20 00:47:20; 終わり

ファイルがブロック サイズよりも大きい場合、上記の行が 2 つのブロックに分かれ、異なるマッパーによって処理される可能性が高くなります。FileInputFormat.isSplitable()上書きして、1 つのログ ファイルが 1 つのマッパーによって処理され、複数のマッパーによって処理されないようにすることができます。

Hadoop は、KV ペアを使用してユーザー定義のマップ関数を呼び出します。ここで、K はファイル オフセットで、値は入力ファイルの行です。BEGIN 時刻を格納して、後でユーザー定義の map 関数を呼び出したときに END 時刻と照合するために、インスタンス変数が必要になります。

単一のマッパーが特定のマップ ファイルを処理し、分散されていないため、これは効率的な方法ではありません。

もう 1 つの方法は、関連する行を 1 行にまとめて、ログ ファイルを前処理することです。このように、ログ ファイル内の関連する行は、1 つのマッパーのみによって処理されます。

参考までに、 FileInputFormat.isSplitable() を使用しないより複雑なアプローチも可能ですが、解決する必要があります。

各アプローチの長所と短所を評価し、正しいものを選択する必要があります。

于 2012-10-24T12:10:34.213 に答える