2014-03-03 25 views
2

我有一些柜台我在映射类创建:如何访问输出阶段的Mapper/Reducer计数器?

(例如,使用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类,它只能访问从映射器/减速器getContext()方法。

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

备注:我无法将计数器值发送到我输出的类,因为整个Map/Reduce是将一组实体转换为另一个实体(换句话说:计数器不是地图的主要用途/减少)。计数器只是为了控制 - 这是有道理的,我在这里计算它们,而不是创建另一个进程来计算。

谢谢。

回答

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,并具有创建Summary对象的run方法。

+0

你去了哪里,创建了问题:https://code.google.com/p/appengine-mapreduce/issues/detail?id=208 –