如何从mapreduce作业获得响应?

tkclm6bt  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(239)

我怎样才能从我的Map减少工作中得到回应?
我已经在java程序中提交了这样的作业输入。

conf.set("key1", somevalue);conf.set("key2", somevalue);
Job job = new Job(conf, jobId);
if (job != null) {
        job.waitForCompletion(true);
    }

此作业已成功执行,现在在作业完成时(它是仅Map的作业),我想返回一些值。我要用

protected void cleanup(Context context) throws IOException,
            InterruptedException { // How can I set value here }

我想返回上一个/最大的密钥Map器使用过的密钥,或者是否有任何方法从inputsplit获取上一个密钥?

xj3cbfub

xj3cbfub1#

要获得最大值,您应该声明一个示例变量,并使用它来保存mapper()方法迄今为止看到的最大值。您可能需要某种方法来表明尚未看到任何值。最后调用cleanup()方法时,变量将保存所需的值。
返回这个值有点困难。hadoop工作流引擎都使用以下方法的变体在hadoop作业之间传递数据。您可以使用此方法在作业完成时将最大值传递给需要它的人。hack/kludge涉及使用一个众所周知的hdfs目录(可以传入)和taskid来构建一个唯一的、可发现的文件名来保存值。使用hdfs文件io api写出值。

lpwwtiir

lpwwtiir2#

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

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

相关问题