Java Hadoop中所有节点的公共变量

Java Hadoop中所有节点的公共变量,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我想在我的Hadoop Map reduce程序中为我的所有Map函数保留一个通用全局变量。这个变量在所有Map函数中都进行了校正,我如何同步执行此操作?Hadoop是一个“无共享”体系结构,虽然有办法在映射器或还原器之间共享一些数据,无法保证同步。也就是说,如果您想尝试,可以使用作业计数器来检查值。或者,您可以尝试更改密钥类型,并将还原数设置为1。然后,您可以保证所有数据都被单个系统看到,并可以在那里应用计数器。但是,这取决于您的数据有多大。Hadoop是一种“无共享”体系结构,虽然有办法在映

我想在我的Hadoop Map reduce程序中为我的所有Map函数保留一个通用全局变量。这个变量在所有Map函数中都进行了校正,我如何同步执行此操作?

Hadoop是一个“无共享”体系结构,虽然有办法在映射器或还原器之间共享一些数据,无法保证同步。也就是说,如果您想尝试,可以使用作业计数器来检查值。或者,您可以尝试更改密钥类型,并将还原数设置为1。然后,您可以保证所有数据都被单个系统看到,并可以在那里应用计数器。但是,这取决于您的数据有多大。

Hadoop是一种“无共享”体系结构,虽然有办法在映射器或还原器之间共享一些数据,但无法保证同步。也就是说,如果您想尝试,可以使用作业计数器来检查值。或者,您可以尝试更改密钥类型,并将还原数设置为1。然后,您可以保证所有数据都被单个系统看到,并可以在那里应用计数器。然而,这取决于您的数据有多大。

正如Cowsaysmoo所说,Hadoop是不共享的。您可以使用诸如hbase之类的数据库来获取同步计数器。有关更多信息,请参阅。
我不知道这是否是对你所从事的工作的过度使用,但这是hBase的一个用途。

正如Cowsaysmoo所说,Hadoop是不共享的。您可以使用诸如hbase之类的数据库来获取同步计数器。有关更多信息,请参阅。
我不知道这是否是对您所从事的工作的过度使用,但这是hBase的用途之一。

用户定义计数器是全局的:Map reduce框架聚合 它们跨越所有地图,并在作业结束时减少以生成一个总计

在驱动程序中创建计数器

public class Driver{
    enum Count {
        TOTAL
    } 
}
在映射器中添加下面的行

context.getCounter(Count.TOTAL).increment(1);
然后在作业后使用下面的代码读取计数器值


通过使用计数器,您可以跟踪全局计数器。按照我的理解,这应该符合您的目的。

用户定义计数器是全局的:Map reduce框架聚合 它们跨越所有地图,并在作业结束时减少以生成一个总计

在驱动程序中创建计数器

public class Driver{
    enum Count {
        TOTAL
    } 
}
在映射器中添加下面的行

context.getCounter(Count.TOTAL).increment(1);
然后在作业后使用下面的代码读取计数器值


通过使用计数器,您可以跟踪全局计数器。按照我的理解,这应该符合您的目的。

但是在这种方法中,计数是同步的吗?基本上,所有增量细节都将由TaskTracker发送到Jobtracker,Jobtracker将在作业完成后合并增量。谢谢,但我的问题是我必须在映射器中访问增量变量的值!但是在这个方法中,计数是同步的吗?基本上所有的增量细节都将由TaskTracker发送到Jobtracker,Jobtracker将在作业完成后合并增量。谢谢,但我的问题是我必须在映射器中访问增量变量的值!使用1个reducer是否会降低我的计算速度,就像在一个节点上处理地图一样,因为地图输出必须排队等待该reducer?是的,它会降低你的计算速度,这就是为什么我说它作为替代品的潜力取决于减少的数据集有多大。这是你必须决定是否值得折衷的事情之一。使用1个reducer是否会降低我的计算速度,就像在一个节点上处理地图输出一样,必须排队等待该reducer?是的,它会降低你的计算速度,这就是为什么我说它作为替代品的潜力取决于你的数据集有多大。这是你必须决定的事情之一,权衡是否值得。