4

私は Hadoop をいじっており、Ubuntu で 2 ノード クラスターをセットアップしました。WordCount の例は問題なく動作します。

ここで、いくつかのログ データを分析するために独自の MapReduce プログラムを作成したいと思います (主な理由: シンプルに見え、データが豊富にあるため)

ログの各行の形式は次のとおりです

<UUID> <Event> <Timestamp>

イベントは、INIT、START、STOP、ERROR などです。私が最も興味を持っているのは、同じ UUID の START イベントと STOP イベントの間の経過時間です。

たとえば、私のログには次のようなエントリが含まれています

35FAA840-1299-11DF-8A39-0800200C9A66 START 1265403584
[...many other lines...]
35FAA840-1299-11DF-8A39-0800200C9A66 STOP 1265403777

私の現在の線形プログラムは、ファイルを読み取り、メモリ内の開始イベントを記憶し、対応する終了イベントが見つかったら経過時間をファイルに書き込みます (他のイベントを含む行は現在無視され、エラー イベントは UUID を無効にし、も無視されます) 1

これを Hadoop/MapReduce プログラムに移植したいと考えています。しかし、エントリのマッチングを行う方法がわかりません。ファイルの分割/トークン化は簡単で、一致するものを見つけることは Reduce-Class になると思います。しかし、それはどのように見えるでしょうか?MapReduce ジョブで数学エントリを見つけるにはどうすればよいですか?

私の主な焦点は、Hadopo/MapReduce を理解することです。Pig やその他の Apache プログラムへのリンクは大歓迎ですが、純粋な Hadoop/MapReduce でこの問題を解決したいと考えています。ありがとうございました。

1) ログは実行中のアプリケーションから取得されるため、一部の開始イベントには対応する終了イベントがまだない可能性があり、ログファイルの分割により、開始イベントのない終了イベントが発生します。

4

2 に答える 2

8

map で UUID をキーとして発行するemit(<uuid>, <event, timestamp>)と、reduce でこの UUID のすべてのイベントを受け取ります。 key = UUID, values = {<event1, timestamp1>, <event2, timestamp2>}

次に、イベントをタイムスタンプでソートし、それらを結果ファイルに出力するかどうかを決定できます。

ボーナス: 独自の並べ替えクラスを設定するために使用できるjob.setSortComparatorClass();ため、reduce のタイムスタンプで並べ替えられたエントリを取得できます。

public static class BNLSortComparator extends Text.Comparator {
  public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
    String sb1, sb2;
    try {
      sb1 = Text.decode(b1, s1, l1);
      ...
于 2010-02-05T21:36:22.677 に答える
3

マップ関数で UUID をキーとして出力し、残りの行を値として出力することで、これを行うことができると思います。次に、同じ UUID を持つすべてのログ エントリのコレクションが reduce 関数に渡されます。それらを処理する際に、検出したさまざまなイベントを追跡し、それに応じてアクションを実行できます。たとえば、START イベントを検出すると、ローカル変数を開始ラインから抽出された時間に設定し、STOP を検出すると、イベントから時間を抽出し、開始時間を減算し、差を出力できます (START の前に STOP が検出された場合も同様に行います)。

于 2010-02-05T21:36:08.870 に答える