我在Mapper类中创建了一些计数器:
(使用appengine-mapreduce Java库v.0.5编写的示例)
@Override
public void map(Entity entity) {
getContext().incrementCounter("analyzed");
if (isSpecial(entity)){
getContext().incrementCounter("special");
}
}
(方法isSpecial
只返回true
或false
,具体取决于实体的状态,与问题无关)
我想在完成处理整个内容时访问那些计数器,在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 /的主要用途)降低)。计数器仅用于控制 - 我在这里计算它们是有意义的,而不是仅仅为了计算而创建另一个过程。
感谢。
答案 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对象。