【问题标题】:What runs first: the partitioner or the combiner?首先运行的是:分区器还是组合器?
【发布时间】:2014-02-27 06:56:35
【问题描述】:

我想知道分区器和组合器之间哪个先运行?

我认为它首先是分区器,然后是组合器,然后键被重定向到不同的减速器,这看起来像分区器,所以我很困惑。 请帮我理解。

【问题讨论】:

    标签: hadoop


    【解决方案1】:

    您的问题的直接答案是 => COMBINER

    详情: Combiner 可以看作是 map 阶段的 mini-reducer。在进一步分发之前,它们对映射器结果执行本地缩减。执行Combiner 功能后,会将其传递给Reducer 以进行进一步的工作。

    在哪里

    当我们使用比 reducer 多一个的时候,partitioner 就出现了。因此,partitioner 决定哪个 reducer 负责特定的 key。他们基本上获取 Mapper Result(如果使用了 Combiner,则使用 Combiner Result)并根据 key 将其发送给负责的 Reducer。

    为了更好地理解,您可以参考以下图片,该图片来自 Yahoo Developer Tutorial on Hadoop。
    (来源:flickr.com

    这里是tutorial

    【讨论】:

    • JFYI :但是有一个转折点:Combiner 也可以在减速器一侧运行。中间输出被复制到reducer JVM 的内存中。当内存缓冲区达到阈值大小时,将合并 intrim 输出并溢出到磁盘。如果指定了组合器,它将在合并期间运行以减少写入磁盘的数据量。
    【解决方案2】:

    分区优先。

    根据“Hadoop,权威指南”,Mapper 的输出首先写入内存缓冲区,然后在缓冲区即将溢出时溢出到本地目录。溢出的数据根据​​Partitioner进行partition,如果给定Combiner,则在每个partition中对结果进行排序合并。

    您可以简单地修改 wordcount MR 程序来验证它。我的结果是: (“敏捷的棕色狐狸跳过一条懒狗”)


    词、步、时间

    狐狸,地图师,**********754

    狐狸,分区器,**********754

    狐狸,合成器,**********850

    狐狸,减速机,**********904


    显然,Combiner 在 Partitioner 之后运行。

    【讨论】:

      【解决方案3】:

      PartitionerCombiner 之前运行:MapReduce Comprehensive Diagram

      您可以有自定义的分区逻辑,在映射器结果被分区后,分区被排序并且Combiner被应用到排序的分区。

      Hadoop MapReduce Comprehensive Description

      我通过运行带有自定义 CombinerPartitioner 并带有时间戳记录的字数统计程序来检查它:

      Apr 23, 2018 2:41:22 PM mapreduce.WordCountPartitioner getPartition
      INFO: Partitioner: 1524483682580 : hello : 1
      Apr 23, 2018 2:41:22 PM mapreduce.WordCountPartitioner getPartition
      INFO: Partitioner: 1524483682582 : hello : 1
      Apr 23, 2018 2:41:22 PM mapreduce.WordCountPartitioner getPartition
      INFO: Partitioner: 1524483682583 : hello : 1
      Apr 23, 2018 2:41:22 PM mapreduce.WordCountPartitioner getPartition
      INFO: Partitioner: 1524483682583 : world : 1
      Apr 23, 2018 2:41:22 PM mapreduce.WordCountPartitioner getPartition
      INFO: Partitioner: 1524483682584 : world : 1
      Apr 23, 2018 2:41:22 PM mapreduce.WordCountPartitioner getPartition
      INFO: Partitioner: 1524483682585 : hello : 1
      Apr 23, 2018 2:41:22 PM mapreduce.WordCountPartitioner getPartition
      INFO: Partitioner: 1524483682585 : world : 1
      18/04/23 14:41:22 INFO mapred.LocalJobRunner: 
      18/04/23 14:41:22 INFO mapred.MapTask: Starting flush of map output
      18/04/23 14:41:22 INFO mapred.MapTask: Spilling map output
      18/04/23 14:41:22 INFO mapred.MapTask: bufstart = 0; bufend = 107; bufvoid = 104857600
      18/04/23 14:41:22 INFO mapred.MapTask: kvstart = 26214396(104857584); kvend = 26214368(104857472); length = 29/6553600
      Apr 23, 2018 2:41:22 PM mapreduce.WordCountCombiner reduce
      INFO: Combiner: 1524483682614 : hello 
      Apr 23, 2018 2:41:22 PM mapreduce.WordCountCombiner reduce
      INFO: Combiner: 1524483682615 : world
      

      【讨论】:

        【解决方案4】:

        组合器在分区器之前运行

        combiner 在 map 之后运行,以减少 map 输出的项目数。所以它减少了网络过载。在分区器之后减少运行

        【讨论】:

        • 毕竟,对可能永远无法到达reducer的数据进行分区是没有用的。
        【解决方案5】:

        Combiner 是一个 map side reducer。这意味着reducer执行combiner所做的一切。组合器的主要用途是调整/优化性能。合并器优化代码后,请求者分离并协助获得多个输出。组合器是可选的,但强烈推荐用于大文件。

        partitioner 根据 reducer 的数量对数据进行划分,并根据需求划分输出。 例如:输出男性,女性,使用分区器分隔2个输出。

        First Combiner 会出现然后 Partitioner 会出现,两者都只出现在 Mapside 中,而不是在 reducer 端。

        【讨论】:

          【解决方案6】:

          在 Hadoop——权威指南第 3 版,第 209 页,我们有以下文字:

          在写入磁盘之前,线程首先将数据划分为与它们最终将被发送到的减速器相对应的分区。在每个分区内,后台线程按键执行内存排序,如果有组合器函数,则在排序的输出上运行。运行 combiner 函数可以得到更紧凑的 map 输出,因此写入本地磁盘和传输到 reducer 的数据更少。

          每次内存缓冲区达到溢出阈值时,都会创建一个新的溢出文件,因此在映射任务写入其最后一条输出记录后,可能会有多个溢出文件。在任务完成之前,溢出文件被合并成一个单独的分区和排序的输出文件。配置属性 io.sort.factor 控制一次合并的最大流数;默认值为 10。

          如果至少有三个溢出文件(由 min.num.spills.for.combine 属性设置),则在写入输出文件之前再次运行组合器。回想一下,组合器可以在输入上重复运行而不影响最终结果。如果只有一两次溢出,则映射输出大小的潜在减少不值得调用组合器的开销,因此不会为此映射输出再次运行。因此在合并溢出文件期间运行组合器。

          看来答案是:

          映射 -> 分区器 -> 排序 -> 组合器 -> 溢出 -> 组合器(如果溢出>=3) -> 合并。

          但是,Apache Tutorial 中有以下词:

          Mapper 输出经过排序,然后按 Reducer 进行分区。

          内容与权威指南不同。这里的答案似乎是:

          映射 -> 排序 -> 组合器 -> 分区器 -> 溢出 -> 组合器(如果溢出>=3) -> 合并。

          哪一个是正确的?我倾向于接受 Apache 教程中的后者,但不太确定。

          【讨论】:

          • 我注意到你们中的一些人参考了 Yahoo 的教程。但是,该图表具有误导性。你可以在这里查看答案。 stackoverflow.com/questions/21719308/…。最明显的错误是,在 Yahoo 的教程中,combiner 可以在一个节点内组合来自多个映射器的输出,但事实并非如此。
          【解决方案7】:

          Combiner 不会改变输出映射任务的键值对。它基于相同的键组合并发出相同的键/列表值对。

          Partitioner 从 map/combiner(如果存在)获取输入,然后对数据进行分段,并且在处理过程中可以发出新的 K 列表值对。

          so Map-->Combine->Partition-->Reduce.

          【讨论】:

            【解决方案8】:

            Mapper -> Combiner -> Partitionar -> Reducer

            【讨论】:

            • 您能说得更具体一点吗?请提供不需要提问者澄清的答案。更多信息请阅读How To Answer
            猜你喜欢
            • 2011-08-10
            • 1970-01-01
            • 2013-06-22
            • 1970-01-01
            • 1970-01-01
            • 2022-05-19
            • 1970-01-01
            • 2023-04-06
            • 1970-01-01
            相关资源
            最近更新 更多