Hadoop中所有节点的公共变量

时间:2014-03-29 12:37:20

标签: java hadoop mapreduce

我想为我的Hadoop map reduce程序中的所有Map函数保留一个公共全局变量。这个变量在所有map函数中递增,我该如何同步执行?

4 个答案:

答案 0 :(得分:2)

Hadoop是一种“无共享”架构,虽然有很多方法可以在映射器或缩减器之间共享一些数据,但无法保证同步。话虽这么说,如果你想尝试,你可以使用工作计数器来检查价值。或者,您可以尝试更改密钥类型并将减速器数量设置为1.然后,您可以保证所有数据都由单个系统查看,并可以在那里应用您的计数器。但是,这取决于您的数据量。

答案 1 :(得分:1)

用户定义的计数器是全局的:Map-reduce框架聚合 它们遍布所有地图,并在作业结束时缩小以产生总计。

在驱动程序中创建一个计数器

public class Driver{
    enum Count {
        TOTAL
    } 
}

在地图工具中添加以下行

context.getCounter(Count.TOTAL).increment(1);

然后在job.submit()

之后使用下面的代码读取计数器值
Counters counters = job.getCounters();
long missing = counters.findCounter(
Driver.Count.MISSING).getValue();

这样使用计数器可以跟踪全局计数器。根据我的理解,这应该服务于你的目的。

答案 2 :(得分:0)

就像TheCowSaysMoo所说,Hadoop没有任何共享。您可以使用hbase等数据库来获取同步计数器。有关详细信息,请参阅increment。 我不知道这对你所做的事情是否有点过分,但这是hBase的用途之一。

答案 3 :(得分:0)

我认为我找到了问题的解决方案,仅供将来参考可能遇到同样问题的人使用....

检查此链接: Use global variable in reudcer class

由于