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



我是Hadoop和整体MapReduce范式的新手。我在网上搜索了很多关于在Map类中重写setup()方法来访问配置对象。但是从我所读到的,似乎每次任务运行时都调用setup()方法。

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

虽然这两种方法最终都会给出所需的输出,但在选择任何一种方法时,是否会考虑到性能因素?

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

每当一个任务运行时,对应的Map或Reduce任务处理的记录数。map()或reduce()方法会被每条正在处理的记录调用。然而,setup()方法在每个任务中运行一次,使您有机会通过初始化配置/资源(例如(数据库连接,读取参考文件等)来优化工作流,仅对该任务处理的所有记录进行一次初始化。

类似地,API提供了一个名为"cleanup"的回调,您可以在其中清理资源。这将在任务完成处理为该任务分配的记录时调用。

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

想象一下这样一个场景,当您希望对某些数据进行多次计算时,在这种情况下,如果您有一个作业的父类,您可以通过覆盖一个单独的方法来完成常见的设置阶段,这是更好的。

您必须检查map()reduce()是否已经初始化参数,因此通过划分初始化实际映射逻辑阶段,可以简化初始化过程。

我不确定我是否正确,但据我所知,map()reduce()是在分布式网络中的节点上执行的,节点对整个系统并不了解。因此,您在map() reduce()方法中访问的内容不是在主节点中配置的内容。

您不能访问节点中的整个配置,因为这意味着您需要始终连接到主节点。

相关内容

  • 没有找到相关文章

最新更新