如何从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?
答案 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;
}
}
...