如何在输出阶段访问Mapper / Reducer计数器?

时间:2014-03-03 02:05:43

标签: java google-app-engine mapreduce

我在Mapper类中创建了一些计数器:

(使用appengine-mapreduce Java库v.0.5编写的示例)

@Override
public void map(Entity entity) {
    getContext().incrementCounter("analyzed");
    if (isSpecial(entity)){
        getContext().incrementCounter("special");
    }
}

(方法isSpecial只返回truefalse,具体取决于实体的状态,与问题无关)

我想在完成处理整个内容时访问那些计数器,在Output类的finish方法中:

@Override
public Summary finish(Collection<? extends OutputWriter<Entity>> writers) {
    //get the counters and save/return the summary
    int analyzed = 0; //getCounter("analyzed");
    int special = 0; //getCounter("special");
    Summary summary = new Summary(analyzed, special);
    save(summary);
    return summary;
}

...但方法getCounter仅适用于MapperContext类,只能通过Mappers / Reducers getContext()方法访问。

如何在输出阶段访问我的计数器?

旁注:我无法将计数器值发送到输出类,因为整个Map / Reduce是关于将一​​组实体转换为另一组(换句话说:计数器不是Map /的主要用途)降低)。计数器仅用于控制 - 我在这里计算它们是有意义的,而不是仅仅为了计算而创建另一个过程。

感谢。

1 个答案:

答案 0 :(得分:0)

今天在输出中没有办法做到这一点。但请随时在此处提出要求: https://code.google.com/p/appengine-mapreduce/issues/list

然而,你可以做的是在map-reduce之后链接一个作业,以便接收它的输出和计数器。这里有一个例子: https://code.google.com/p/appengine-mapreduce/source/browse/trunk/java/example/src/com/google/appengine/demos/mapreduce/entitycount/ChainedMapReduceJob.java

在上面的示例中,它连续运行3个MapReduce作业。请注意,这些不必是MapReduce作业,您可以创建自己的扩展Job的类,并使用run方法创建Summary对象。