我在 Mapper 类中创建了一些计数器:
(使用 appengine-mapreduce Java 库 v.0.5 编写的示例)
@Override
public void map(Entity entity) {
getContext().incrementCounter("analyzed");
if (isSpecial(entity)){
getContext().incrementCounter("special");
}
}
(方法isSpecial
刚刚返回true
or false
取决于实体的状态,与问题无关)
我想在处理完所有内容后访问这些计数器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
只能从映射器上下文类,只能从 Mappers/Reducers 访问getContext()
method.
如何在输出阶段访问我的计数器?
旁注:我无法将计数器值发送到我的输出类,因为整个 Map/Reduce 是将一组实体转换为另一组实体(换句话说:计数器不是 Map/Reduce 的主要目的)。计数器只是用于控制 - 我在这里计算它们而不是创建另一个进程只是为了进行计数是有意义的。
Thanks.
目前还没有办法在输出中执行此操作。但请随时在这里提出要求: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 并具有用于创建 Summary 对象的 run 方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)