在MapReduce映射器之间共享计数器值
我有一个映射器,可以读取输入并写入数据库。我想限制实际转换和写入该数据库的输入数量,所有映射程序都必须达到该限制,然后在达到该限制后停止(大约;额外一两个不是什么大问题) 我在我们的映射器上实现了一个限制器功能,它会询问其他任务,“您导入了多少记录?”一旦达到给定的限制,它将停止导入这些记录(尽管它将继续为其他目的处理它们) 相关地图代码如下所示:在MapReduce映射器之间共享计数器值,mapreduce,synchronization,Mapreduce,Synchronization,我有一个映射器,可以读取输入并写入数据库。我想限制实际转换和写入该数据库的输入数量,所有映射程序都必须达到该限制,然后在达到该限制后停止(大约;额外一两个不是什么大问题) 我在我们的映射器上实现了一个限制器功能,它会询问其他任务,“您导入了多少记录?”一旦达到给定的限制,它将停止导入这些记录(尽管它将继续为其他目的处理它们) 相关地图代码如下所示: public void map(ImmutableBytesWritable key, Result row, Context context) {
public void map(ImmutableBytesWritable key, Result row, Context context) {
// prepare the input
// ...
if (context.getCounter(Metrics.IMPORTED).getValue()<IMPORT_LIMIT){
importRecord();
context.getCounter(Metrics.IMPORTED).increment(1l);
}
// do other things
// ...
}
public void映射(ImmutableBytesWritable键、结果行、上下文){
//准备输入
// ...
if(context.getCounter(Metrics.IMPORTED).getValue()好的:据我所知,MapReduce在作业完成之前(即根本不)不会在映射程序之间共享计数器。我不确定中途提交的映射程序是否允许以后的映射程序查看其计数器,但这不够可靠,无法实时完成
相反,我要做的是运行一个简单的java应用程序,它自己迭代行并写入列,现有的MapReduce作业将使用该列来确定是否应该导入行