【问题标题】:Which runs first, Combiner or Partitioner in a MapReduce Job在 MapReduce 作业中首先运行,Combiner 或 Partitioner
【发布时间】:2016-02-04 07:35:33
【问题描述】:

我很困惑,因为我找到了两个答案。

1) 根据 Hadoop Definitive Guide - 第 3 版,第 6 章 - Map Side 说:“在写入磁盘之前,线程首先将数据划分为与它们最终将被发送到的 reducer 对应的分区。在每个分区,后台线程都会在内存中按key进行排序,如果有combiner函数,就在排序的输出上运行。

2) 雅虎开发者教程 (Yahoo tutorial) 说组合器在分区器之前运行。

任何人都可以澄清哪个先运行。

【问题讨论】:

    标签: hadoop mapreduce hdfs


    【解决方案1】:

    Map Reduce Job 可能包含这些阶段中的一个或所有阶段

    1. 地图

    2. 合并

    3. 随机排序

    4. 减少

    Partitioner 介于第二阶段和第三阶段之间

    您可以访问link了解更多详情。

    在浏览了相关的 SE 问题和文章后,

    What runs first: the partitioner or the combiner?

    Who will get a chance to execute first , Combiner or Partitioner?

    https://sreejithrpillai.wordpress.com/2014/11/24/implementing-partitioners-and-combiners-for-mapreduce/

    我们可以看到意见分歧。

    但从逻辑上我觉得

    1. 映射器将输出写入内存中的循环环形缓冲区
    2. 如果 reducer 的数量超过 1 个且分区器已就位,则映射器输出将被分区
    3. 一旦缓冲内存满了,输出就会溢出到磁盘上
    4. 根据 hadoop 权威指南“在每个分区内,后台线程按键执行内存排序,如果有组合器函数,则在排序的输出上运行”时间>

    这意味着 Partitioner 应该首先运行,combiner 必须在每个分区中的输出数据上运行。

    【讨论】:

    • 谢谢拉文德拉。分区是根据 reducer 的数量创建的。所以我的问题是,是否在应该运行 reduce 任务的节点上创建了分区?
    • 没有。分配分区号发生在 Mapper 节点。 Reducer 会在 shuffle 和 sort 后得到值。你可能有 100 个映射器和 5 个减速器。在所有 50 个 mapper 完成执行并且框架将输出复制到 Reducer 节点后,5 个 reducer 将获得值。
    • 举个例子。 MR 作业在 10 个 Datanode 的集群上运行。 Image 这个工作需要 10 个映射器和 2 个减速器。 1) 假设 2 个 map 任务在“5 DataNode”上同时运行,那么我们总共有 10 个 mapper 同时执行。 2)每个map任务的输出(如果使用Combiner,那么Combiner Result)存储在每个Datanode的本地文件系统中。 3)这些中间数据需要在所有节点之间进行交换(shuffle阶段)并排序后交给“2个reduce任务”。所以我们有 5 个 Datanode 运行地图任务。分区发生在哪个节点以及将创建多少个分区?
    • 希望这个例子能让我更加清楚。我在那个例子中是否遗漏了一些逻辑。非常感谢您的宝贵意见。
    猜你喜欢
    • 2012-04-30
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多