如何在 Hadoop MapReduce 的 Java 实现中创建全局变量?

Posted

技术标签:

【中文标题】如何在 Hadoop MapReduce 的 Java 实现中创建全局变量?【英文标题】:How to Create Global Variable in Java Implementation of Hadoop MapReduce? 【发布时间】:2012-10-24 22:01:55 【问题描述】:

现在我想创建一个全局双变量(成员),它可以被 MapReduce 作业中的每个映射器/减速器访问和更改。起初我试图在我的主 java 文件中声明一个静态双精度成员,但这似乎有问题,因为每个映射器/减速器都在单独的 JVM 上运行,并且可以正确更改和访问该成员。

我知道对于 int 变量有counter 机制。但是如果我想创建一个全局双变量,我该怎么做呢?

我的最终目标是总结所有映射器/缩减器中的双重格式。如果我不能或不应该创建全局变量,有没有其他方法可以实现该目标?

【问题讨论】:

全局可变变量基本上与您可以使用 map/reduce 执行的操作相反。甚至不要尝试这样做。即使您可以模仿它,这也会破坏 map/reduce 的全部目的并阻止并行化生效。 @LouisWasserman 但是如果我想总结一些在映射器或减速器中是双倍的东西怎么办? @LouisWasserman 我已将其添加到问题中。 如果你想对双精度值求和,让你的映射器返回他们收到的值的总和,并让减速器总结他们的输入。您必须将自己限制为局部变量,但您可以以这种方式进行求和等操作。 【参考方案1】:

这些双打从何而来?如果它们在输入数据中,您可以将其作为普通的 MR 工作。让您的映射器始终输出相同的键和要求和的值。使用组合器在每个映射器中进行本地求和。然后只使用一个 reducer,让它简单地发出总和。

“全局”状态正是 Map-Reduce 范式试图避免的。您必须尝试将所有内容视为在单独的映射器中完成不同部分的工作,然后在减速器中组合/聚合。

【讨论】:

【参考方案2】:

实际上,您可以将 double 视为整数。您可以将任何双倍乘以 100000 并将其存储在计数器中。在reducer中如果需要的话,除以100000即可。

【讨论】:

是的。这很棘手。但我觉得既然这违背了分布式计算的概念,那我应该找一些其他的解决办法。 我仍然不明白这与分布式计算的概念有何不同。如果是,那么为什么计数器存在?为这个答案 +1

以上是关于如何在 Hadoop MapReduce 的 Java 实现中创建全局变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何记录hadoop mapreduce运行日志

如何在Windows下面运行hadoop的MapReduce程序

如何在hadoop环境下执行mapreduce任务

如何查看hadoop mapreduce 性能

如何获取hadoop mapreduce job运行信息

如何获取hadoop mapreduce job运行信息