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
  }
}

解决方法

我想出了这个“丑陋”的解决方法。主要思想是您创建一组计数器,其中您只保存一个计数器,其名称是您希望返回的值(您忽略实际的计数器值)。代码如下所示:

// 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

您不能修改 map/reduce 任务中的配置,并期望将更改保留到其他任务和/或提交作业的作业客户端中的配置(假设您在 reducer 中写入不同的值 - 哪个赢了' 出来并坚持回来?)。

但是,您可以自己将文件写入 HDFS,然后可以在您的工作返回时读回 - 确实不那么丑,但没有办法不涉及其他技术(Zookeeper、HBase 或任何其他 NoSQL / RDB)持有价值在您的任务结束和您能够在工作成功后检索价值之间。

于 2012-07-19T20:47:16.383 回答