2013-08-17 49 views
1

ChainMapper.addReducer & addMapper的第7个参数是传递数据作为值或引用。 我不明白如何将数据作为参考传递,如果reducer可以在与映射器不同的机器上运行。hadoop如何通过引用传递?

的Hadoop专家敬请回复

回答

2

ChainMapper转换之前或MapperReducer后添加额外的。它发生在工人的本地计算中。没有任何关于此的要求将键和值序列化,发送到另一台机器并再次处理。它只是在线发生。

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

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

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

当然,它总是让人困惑,因为Java始终是一种传值语言。但是对象永远不会按值传递,而是通过值传递对象引用。当然Java在这方面不会改变。

+0

我很荣幸欧文先生有时间回答我的问题。这是一个很好的答案。你能不能分享一些我可以找到更多细节的指针? –