现在我想创建一个全局双变量(成员),它可以被 MapReduce 作业中的每个映射器/缩减器访问和更改。起初我试图在我的主 java 文件中声明一个静态双精度成员,但这似乎有问题,因为每个映射器/减速器都在单独的 JVM 上运行,并且可以正确更改和访问该成员。
我知道对于 int 变量有counter
机制。但是如果我想创建一个全局双变量,我该怎么做呢?
我的最终目标是总结所有映射器/减速器中的双重格式。如果我不能或不应该创建全局变量,还有其他方法可以实现该目标吗?
这些双打从何而来?如果它们在输入数据中,您可以将其作为普通的 MR 工作。让您的映射器始终输出相同的键和要求和的值。使用组合器在每个映射器中进行本地求和。然后只使用一个 reducer 并让它简单地发出总和。
“全局”状态正是 Map-Reduce 范式试图避免的。您必须尝试将所有内容视为在单独的映射器中完成不同部分的工作,然后在减速器中组合/聚合。
实际上,您可以将 double 视为整数。您可以将任何双倍乘以 100000 并将其存储在计数器中。在减速机中,如果需要,只需除以 100000。