Java hadoop是如何通过引用传递的?

Java hadoop是如何通过引用传递的?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,ChainMapper.addReducer&addMapper的第7个参数是将数据作为值或引用传递。 我无法理解当一个reducer可以在不同于mapper的机器上运行时,如何将数据作为引用传递 Hadoop专家请回复链类在映射器或还原器之前或之后添加额外的映射器转换。它发生在工人的本地计算中。这并不要求对键和值进行序列化、发送到另一台机器并再次处理。它只是一条直线 这就是为什么这可能令人困惑的原因,因为我们不习惯于映射器看到另一个操作所输出的完全相同的对象。通过引用传递将是更有效的方法。但代

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


Hadoop专家请回复
类在
映射器
还原器
之前或之后添加额外的
映射器
转换。它发生在工人的本地计算中。这并不要求对键和值进行序列化、发送到另一台机器并再次处理。它只是一条直线

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

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

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


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

我很荣幸欧文先生能抽出时间回答我的问题。这是一个很好的答案。你能分享一些我可以找到更多细节的建议吗?