ChainMapper.addReducer & addMapper 的第 7 个参数是将数据作为值或引用传递。当reducer 可以在与mapper 不同的机器上运行时,我无法理解如何将数据作为引用传递。
Hadoop专家请回复
这些类在 a或之前或之后Chain
添加了额外的Mapper
转换。它发生在工作人员的本地计算中。没有什么需要序列化键和值,发送到另一台机器,然后再次处理。它只是在线发生。Mapper
Reducer
这就是为什么这可能会让人感到困惑,因为我们不习惯Mapper
从字面上看到另一个操作输出的相同对象。这将是更有效的事情,通过引用传递。但是代码可能会假定它是按值计算的,因为 Hadoop 以其他方式工作。例如,您可能假设您可以修改链中键或值对象的状态,并且对它观察到该更改之前Mapper
感到非常惊讶。Reducer
(虽然我认为这是糟糕的设计。)
所以这个参数控制Hadoop是否只是序列化和反序列化对象——基本上,通过序列化创建一个克隆。这是额外的工作。
byValue
较新的 Hadoop API 中不存在该参数。默认是true
,除非你知道得更好,否则你可能会坚持使用它。如果您确定不修改键/值对象状态,则可以安全地使用false
并通过引用传递获得一点速度。
当然,这有点令人困惑,因为 Java 始终是一种按值传递的语言。但是对象永远不会按值传递,而是对象引用是按值传递的。当然,Java 在这方面并没有改变。