我想在hadoop map reduce程序中为我的所有map函数保留一个公共全局变量。这个变量在所有map函数中都是i校正的,如何同步执行?
lmvvr0a81#
正如cowsaysmoo所说,hadoop是不共享的。可以使用诸如hbase之类的数据库来获取同步计数器。有关详细信息,请参见增量。我不知道这是否是一个过度杀伤力,但这是hbase的用途之一。
k5ifujac2#
用户定义的计数器是全局的:map reduce框架跨所有Map聚合它们,并在作业结束时进行缩减以生成一个总计。在驱动程序中创建计数器
public class Driver{ enum Count { TOTAL } }
在Map器中添加下面的行
context.getCounter(Count.TOTAL).increment(1);
然后在作业后使用下面的代码读取计数器值。submit()
Counters counters = job.getCounters(); long missing = counters.findCounter( Driver.Count.MISSING).getValue();
通过使用计数器,您可以跟踪全局计数器。我的理解是,这应该符合你的目的。
mwkjh3gx3#
hadoop是一个“无共享”的架构,虽然有办法在Map器或还原器之间共享一些数据,但没有办法保证同步。也就是说,如果您想尝试,可以使用作业计数器来检查值。或者,您可以尝试更改密钥类型并将还原数设置为1。然后您可以保证所有的数据都被一个系统看到,并且可以在那里应用您的计数器。然而,这取决于你的数据有多大。
3条答案
按热度按时间lmvvr0a81#
正如cowsaysmoo所说,hadoop是不共享的。可以使用诸如hbase之类的数据库来获取同步计数器。有关详细信息,请参见增量。我不知道这是否是一个过度杀伤力,但这是hbase的用途之一。
k5ifujac2#
用户定义的计数器是全局的:map reduce框架跨所有Map聚合它们,并在作业结束时进行缩减以生成一个总计。
在驱动程序中创建计数器
在Map器中添加下面的行
然后在作业后使用下面的代码读取计数器值。submit()
通过使用计数器,您可以跟踪全局计数器。我的理解是,这应该符合你的目的。
mwkjh3gx3#
hadoop是一个“无共享”的架构,虽然有办法在Map器或还原器之间共享一些数据,但没有办法保证同步。也就是说,如果您想尝试,可以使用作业计数器来检查值。或者,您可以尝试更改密钥类型并将还原数设置为1。然后您可以保证所有的数据都被一个系统看到,并且可以在那里应用您的计数器。然而,这取决于你的数据有多大。