0

レデューサーに変数を設定するにはどうすればよいですか?実行後、すべてのタスクが実行を終了した後、ドライバーが変数を読み取ることができますか?何かのようなもの:

class Driver extends Configured implements Tool{
  public int run(String[] args) throws Exception {
    ...
    JobClient.runJob(conf); // reducer sets some variable
    String varValue = ...;  // variable value is read by driver
  }
}

回避策

私はこの「醜い」回避策を思いついた。主なアイデアは、カウンターのグループを作成し、その名前が返したい値であるカウンターを1つだけ保持することです(実際のカウンター値は無視します)。コードは次のようになります。

// reducer || mapper
reporter.incrCounter("Group name", "counter name -> actual value", 0);

// driver
RunningJob runningJob = JobClient.runJob(conf);
String value = runningJob.getCounters().getGroup("Group name").iterator().next().getName();

同じことがマッパーにも機能します。これで私の問題は解決しますが、このタイプの解決策は「醜い」と思います。したがって、私は質問を開いたままにしておきます。

4

1 に答える 1

1

マップ/リデュースタスクの構成を修正して、他のタスクやジョブを送信したジョブクライアントの構成に変更が保持されることを期待することはできません(レデューサーに異なる値を書き込むとしましょう-どちらが勝ちますか? 'アウトし、永続化されますか?)。

ただし、自分でHDFSにファイルを書き込んで、ジョブが戻ったときに読み戻すことができます-それほど醜いことではありませんが、値を保持する別のテクノロジー(Zookeeper、HBase、またはその他のNoSQL / RDB)を使用しない方法はありませんタスクが終了してから、ジョブが成功したときに値を取得できるようになるまでの間。

于 2012-07-19T20:47:16.383 に答える