当我们可以初始化map()或reduce()中的参数时,为什么我们需要MapReduce中的setup()方法?

时间:2016-10-28 17:34:18

标签: java hadoop mapreduce

我是Hadoop和整体MapReduce范例的新手。我在网上搜索了很多关于覆盖Map类中的 setup()方法以访问配置对象的信息。但是根据我的阅读,似乎每次运行任务时都会调用 setup()方法。

那么为什么需要一个单独的方法来访问配置对象并初始化参数呢?为什么我们不能直接在 map() reduce()方法中做同样的事情?

虽然两种方法最终都会按要求提供输出,但在选择任何一种方法时是否会出现性能因素?提前谢谢。

4 个答案:

答案 0 :(得分:0)

答案不在于Hadoop,而在于我认为的编程范式。 分离业务逻辑的不同部分总是好的,设置运行环境与运行映射本身不同。

想象一下,如果您有某些数据需要进行多次计算,在这种情况下,如果您有一个父类用于您的作业,您可以通过覆盖单独的方法来执行常见的设置阶段,这样做会更好

设计只是鼓励你选择这种行为。

答案 1 :(得分:0)

您必须检查map()reduce()是否已初始化参数,以便通过划分初始化实际地图来简化初始化过程逻辑阶段。

答案 2 :(得分:0)

我不确定我是否正确,但据我所知,map()reduce()在分布式网络中的节点中执行,其中节点不了解整个系统。因此,您在map() reduce()方法中访问的内容不是主节点中配置的内容。您无法访问节点中的整个配置,因为这意味着您需要始终连接到主节点。

答案 3 :(得分:0)

Re:“似乎每次运行任务时都会调用setup()方法。”

每当运行任务时,相应的Map或Reduce任务都会处理多少条记录。为每个正在处理的记录调用map()或reduce()方法。但是,每个任务运行一次setup()方法,通过初始化配置/资源(例如(数据库连接,读取参考文件等)),只需对该任务正在处理的所有记录执行一次,从而使您有机会优化工作流程。

同样,API提供了一个名为“cleanup”的回调,您可以在其中清理资源。当任务完成处理为该任务分配的记录时,将调用此方法。