我有一个读取输入和写入数据库的映射器。我想限制实际转换并写入该数据库的输入数量,并且所有映射器必须达到限制,然后一旦达到该限制就停止(大约;一两个额外的并不是什么大问题。)
我在mapper上实现了一个限制器函数,询问其他任务,“你导入了多少条记录?”达到给定限制后,它将停止导入这些记录(尽管它会继续将其用于其他目的。)
有问题的地图代码如下所示:
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
// ...
}
因此每个映射器都会检查是否有更多空间可以导入,并且只有在未达到限制时才会执行任何导入。但是,每个映射器本身都在导入到限制,因此对于16个映射器,我们将导入16 * IMPORT_LIMIT个记录。它绝对做了一些限制(计数远低于正常导入记录的数量。)
计数器值何时被推送到其他映射器,或者它们甚至可用于每个映射器?我真的可以从计数器获得一些实时值,还是只在映射器完成时才更新?有没有更好的方法在映射器之间共享一个值?
答案 0 :(得分:0)
好的:从我看到的情况来看,MapReduce在作业完成之前不会共享映射器之间的计数器(即根本没有。)我不确定是否中途使用的映射器将允许后来的映射器看到他们的柜台,但它不够可靠,无法实时完成。
相反,我要做的是运行一个简单的java应用程序,它自己迭代行并写入一个列,现有的MapReduce作业将用它来确定是否应该导入行。 / p>