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



如何在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();

这同样适用于映射器。虽然这解决了我的问题,但我认为这种解决方案是"丑陋的"。因此,我不提这个问题

您不能修改map/reduce任务中的配置,并期望将更改持久化为其他任务和/或提交作业的作业客户端中的配置(假设您在reducer中写入不同的值-哪一个"胜出"并持久化回?)。

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

最新更新