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