【问题标题】:Why do we need setup() method in MapReduce when we can initialize parameters in map() or reduce()?当我们可以在 map() 或 reduce() 中初始化参数时,为什么我们需要在 MapReduce 中使用 setup() 方法?
【发布时间】:2016-10-28 17:34:18
【问题描述】:

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

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

虽然这两种方法最终都会提供所需的输出,但在选择任何一种方法时,是否存在性能因素?提前致谢。

【问题讨论】:

    标签: java hadoop mapreduce


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      该设计只是鼓励这种行为,否则您也会选择这种行为。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 作业配置是全局的,可用于在特定阶段工作的节点。当一个特定的映射器在一个节点上运行时,映射器类设置,然后使用正确的输入拆分调用映射。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-11-29
          • 2020-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多