在mapreduce程序中使用Static变量

时间:2014-06-11 14:09:04

标签: java multithreading hadoop static mapreduce

我实际上正在编写一个关于hadoop的程序。在我的reduce任务中,我必须使用一个静态变量,因为我希望它由许多线程编辑(这些线程是从reduce fonction调用的)。 问题是这个变量是由当前reduce任务的线程编辑的,也是由其他reduce任务的线程编辑的,我想避免这种情况。

所以我的问题是:是否有一种方法或技巧可以仅通过当前reducer的线程来修改这个变量?

我希望我的问题足够清楚,可以帮助你帮助我;)。

非常感谢stack-community:)

2 个答案:

答案 0 :(得分:0)

您可能想要查看map / reduce程序的“无共享”方面。它们不是(并且实际上不能......)共享JVM对象 - 包括静态变量。

减速器通常基本上彼此独立。它们在Mapper阶段处理的数据的特定分区上运行。

在特殊情况下,仍有机会使用计数器在Reducers之间共享数据。但是,您更有可能想要研究现有的map / reduce程序,看看它们如何保持缩减器之间的分离。

答案 1 :(得分:0)

谢谢javadba, 你说减速器是独立的,是的,但是如果在同一节点上有多个减速器,则静态变量将被共享。 因此,我使用它的解决方案可能有助于其他人,我根据唯一键的数量为每个减速器使用不同的变量。 例如,如果在我的第一个程序中我声明了$ public static int x; $所以为了避免我上面引用的问题我声明$ public static ArrayList x; $和此ArrayList中的每个元素都专用于一个独特的reducer。