-2

Map Reduce ジョブから応答を得るにはどうすればよいですか?

Java プログラムでこのようなジョブ入力を送信しました。

conf.set("key1", somevalue);conf.set("key2", somevalue);
Job job = new Job(conf, jobId);
if (job != null) {
        job.waitForCompletion(true);
    }

このジョブは正常に実行されました。ジョブの完了時 (マップのみのジョブ)、何らかの値を返したいと考えています。私は使用するつもりです

protected void cleanup(Context context) throws IOException,
            InterruptedException { // How can I set value here }

Mapper が使用した最後の/最大のキーを返したい、または InputSplit から lastkey を取得する方法はありますか?

4

2 に答える 2

2

最大値を取得するには、インスタンス変数を宣言し、それを使用して mapper() メソッドがこれまでに確認した最大値を保持する必要があります。まだ値が表示されていないことを示す何らかの方法が必要になる場合があります。cleanup() メソッドが最後に呼び出されると、変数は必要な値を保持します。

この値を返すのは少し難しいです。Hadoop ワークフロー エンジンはすべて、hadoop ジョブ間でデータを渡すために次のアプローチの変形を使用します。このアプローチを使用して、ジョブが完了したときに必要な人に最大値を渡すことができます。ハック/クラッジには、よく知られている hdfs ディレクトリ (渡される可能性があります) と taskid を使用して、値を保持するための一意の検出可能なファイル名を作成することが含まれます。HDFS file io API を使用して値を書き出します。

于 2012-10-23T20:52:22.413 に答える
-3

ただし、これは最善の解決策ではない可能性がありますが、回避策としてcounter、jobrunner クラスで取得できる にタスクごとの最大値を格納することができます。次に、それらを繰り返し、最大値を選択します。例えば:

マッパー:

private long num = 0L;

@Override
protected void map(...) {
  ...
  num++;
  ...
}

@Override 
public void cleanup(Context context) {
  context.getCounter("MaxValue", "task_" + 
    context.getTaskAttemptID().getTaskID().getId()).increment(num);
}

ジョブランナー

ジョブが終了した後の最大値を選択します。

...
long max = 0;
CounterGroup group = job.getCounters().getGroup("MaxValue");
for (Counter c : group) {
  long val = c.getValue();
  if (val > max) {
    max = val;
  }
}
...
于 2012-10-24T11:42:51.183 に答える