-2

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

4

2 回答 2

2

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

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

于 2012-10-23T20:52:22.413 回答
-3

但是,这可能不是最好的解决方案,但作为一种解决方法,您可以将每个任务的最大值存储在counter您可以在 jobrunner 类中检索的 a 中。然后遍历它们并选择最大值。例如:

映射器:

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

求职者

作业完成后选择最大值:

...
long max = 0;
CounterGroup group = job.getCounters().getGroup("MaxValue");
for (Counter c : group) {
  long val = c.getValue();
  if (val > max) {
    max = val;
  }
}
...
于 2012-10-24T11:42:51.183 回答