如何从mapreduce工作获得响应?

时间:2012-10-23 20:07:17

标签: hadoop mapreduce hdfs

如何从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?

2 个答案:

答案 0 :(得分:2)

要获取最大值,您应该声明一个实例变量,并使用它来保存mapper()方法到目前为止所看到的最大值。您可能需要某种方式来表明尚未看到任何值。当最后调用cleanup()方法时,变量保存您想要的值。

返回此值有点困难。 Hadoop工作流引擎都使用以下方法的变体在hadoop作业之间传递数据。您可以使用此方法将最大值传递给作业完成时需要它的任何人。 hack / kludge涉及使用一个众所周知的hdfs目录(可以传入)和taskid来构建一个唯一的,可发现的文件名来保存该值。使用HDFS文件io API来写出值。

答案 1 :(得分:-3)

但是,这可能不是最佳解决方案,但作为一种解决方法,您可以将每个任务的最大值存储在counter中,您可以 在jobrunner类中检索。然后迭代它们并选择最大值。 E.g:

<强>映射器:

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

<强> JobRunner

选择作业完成后的最大值:

...
long max = 0;
CounterGroup group = job.getCounters().getGroup("MaxValue");
for (Counter c : group) {
  long val = c.getValue();
  if (val > max) {
    max = val;
  }
}
...