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