hadoop是如何通过引用传递的



ChainMaper.addReducer&addMapper的第7个参数是将数据作为值或引用传递。当reducer可以在不同于mapper的机器上运行时,我无法理解如何将数据作为引用传递。

Hadoop专家请回复

Chain类在MapperReducer之前或之后添加额外的Mapper转换。它发生在工作者的本地计算中。这并不需要对键和值进行序列化、发送到另一台机器并再次进行处理。它只是在线发生的。

这就是为什么这可能会令人困惑,因为我们不习惯Mapper看到另一个操作输出的完全相同的对象。这将是更有效的事情,通过引用传递。但是,代码可能会假定它是按值计算的,因为Hadoop的工作方式与此不同。例如,您可能假设您可以修改链接的Mapper中的键或值对象的状态,并对Reducer在观察到这种变化之前感到非常惊讶。(不过我认为这是个糟糕的设计。)

因此,这个参数控制Hadoop是否只是序列化和反序列化对象——基本上,通过序列化创建克隆。这是额外的工作。

较新的Hadoop API中不存在byValue参数。默认值是true,除非你更清楚,否则你可能会坚持使用它。如果您确定不修改键/值对象状态,则可以安全地使用false,并通过参考获得一点速度。

当然,这一切都有点令人困惑,因为Java总是一种传递值的语言。但是对象从不按值传递,而是按值传递对象引用。当然,Java在这方面没有改变。

相关内容

  • 没有找到相关文章

最新更新