Hadoop变量在reducer中设置并读入驱动程序

时间:2012-07-19 16:43:58

标签: hadoop mapreduce global-variables driver

如何在reducer中设置变量,在所有任务完成执行后,驱动程序可以在执行后读取变量?类似的东西:

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();

同样适用于地图制作者。虽然这解决了我的问题,但我认为这种解决方案是“丑陋的”。因此,我打开问题

1 个答案:

答案 0 :(得分:1)

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

然而,您可以自己将文件写入HDFS,然后在您的工作返回时可以回读 - 真的很难看,但没有其他技术(Zookeeper,HBase或任何其他NoSQL) / RDB)保持任务结束之间的值,并且您可以在作业成功时检索该值。