hadoop如何通过引用传递?

时间:2013-08-17 08:49:58

标签: java hadoop mapreduce

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

Hadoop专家请回复

1 个答案:

答案 0 :(得分:2)

Chain类在MapperMapper之前或之后添加其他Reducer转换。它发生在工人的本地计算中。没有任何关于这一点,需要序列化密钥和值,发送到另一台机器,并再次处理。它只是在线发生。

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

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

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

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

相关问题