【问题标题】:use of Static variable in mapreduce programs在 mapreduce 程序中使用静态变量
【发布时间】:2014-06-11 14:09:03
【问题描述】:
我实际上是在 hadoop 上编写程序。在我的 reduce 任务中,我必须使用一个静态变量,因为我希望它被许多线程编辑(这些线程是从 reduce 函数调用的)。
问题是这个变量正在被当前reduce任务的线程和其他reduce任务的线程编辑,我想避免这种情况。
所以我的问题是:有没有办法或技巧仅通过当前 reducer 的线程来修改这个变量?
我希望我的问题足够清楚,可以帮助你帮助我;)。
非常感谢堆栈社区:)
【问题讨论】:
标签:
java
multithreading
hadoop
static
mapreduce
【解决方案1】:
您可能想要查看 map/reduce 程序的“无共享”方面。它们不打算(实际上也不能......)共享 JVM 对象 - 包括静态变量。
reducer 通常大部分是相互独立的。它们对已在 Mapper 阶段处理的数据的特定分区进行操作。
在不寻常的情况下,仍然有机会使用 Counters 在 Reducer 之间共享数据。但是,您更有可能想要研究现有的 map/reduce 程序,看看它们如何保持 reducer 之间的分离。
【解决方案2】:
谢谢javadba,
您说减速器是独立的,是的,但是如果在同一个节点上执行多个减速器,则将共享静态变量。
因此,我使用的解决方案可能对其他人有所帮助,因为我根据唯一键的数量为每个减速器使用了不同的变量。
例如,如果在我的第一个程序中我声明了 $public static int x; $ 所以为了避免我上面提到的问题,我声明了 $public static ArrayList x; $ 并且这个 ArrayList 中的每个元素都专用于一个唯一的 reducer。