【问题标题】:When do reduce tasks start in Hadoop?Hadoop中reduce任务什么时候开始?
【发布时间】:2012-07-25 05:44:15
【问题描述】:

在 Hadoop 中,reduce 任务什么时候开始?它们是否在映射器完成一定百分比(阈值)后开始?如果是这样,这个阈值是固定的吗?通常使用什么样的阈值?

【问题讨论】:

    标签: hadoop mapreduce reduce


    【解决方案1】:

    当 Mapper 完成其任务时,Reducer 开始其作业以减少数据,这是 Mapreduce 作业。

    【讨论】:

      【解决方案2】:

      Reduce 仅在所有映射器完成任务后才开始,Reducer 必须与所有映射器通信,因此它必须等到最后一个映射器完成其任务。然而,映射器在完成任务时开始传输数据。

      【讨论】:

        【解决方案3】:

        reduce 阶段有 3 个步骤:shuffle、sort、reduce。 Shuffle 是 reducer 从每个 mapper 收集数据的地方。这可能在映射器生成数据时发生,因为它只是数据传输。另一方面,排序和归约只能在所有映射器完成后开始。你可以通过查看 reducer 完成百分比来判断 MapReduce 在做什么:0-33% 表示它在做 shuffle,34-66% 是 sort,67%-100% 是 reduce。这就是为什么你的 reducer 有时会“卡”在 33% 的原因——它正在等待映射器完成。

        Reducer 根据已完成映射器的百分比阈值开始洗牌。您可以更改参数以使减速器迟早启动。

        为什么提早启动减速器是件好事?因为它随着时间的推移分散了从映射器到减速器的数据传输,如果您的网络是瓶颈,这是一件好事。

        为什么提早启动减速器是一件坏事?因为他们“占用”减少了插槽,而只复制数据并等待映射器完成。稍后开始的另一个实际使用 reduce 槽的作业现在无法使用它们。

        您可以通过更改mapred-site.xmlmapred.reduce.slowstart.completed.maps 的默认值来自定义reducers 何时启动。 1.00 的值将等待所有映射器完成,然后再启动减速器。 0.0 的值将立即启动减速器。当映射器完成一半时,0.5 的值将启动减速器。您还可以逐个工作更改mapred.reduce.slowstart.completed.maps在新版本的 Hadoop(至少 2.4.1)中,调用的参数是 mapreduce.job.reduce.slowstart.completedmaps(感谢用户 yegor256)。

        通常,如果系统同时运行多个作业,我喜欢将mapred.reduce.slowstart.completed.maps 保持在0.9 之上。这样,当他们除了复制数据什么都不做时,这项工作就不会占用减速器。如果您一次只运行一项工作,那么0.1 可能是合适的。

        【讨论】:

        • 你知道我在哪里可以阅读更多关于你提到的内容吗?
        • 在我看来,Slowstart 的文档记录很差......就像大多数晦涩的配置参数一样。
        • 好答案@Donald Miner。只想在较新的 Hadoop 版本中添加它(我使用的是 1.1.2),该值默认为 0.05。 hadoop.apache.org/docs/r1.1.2/mapred-default.html
        • @Donald 我使用的是hadoop的0.20.205.0版本,并且将mapred-site.xml中的参数“mapred.reduce.slowstart.completed.maps”设置为0.1,但是reducer之后仍然运行映射器完成。我可以知道为什么吗?
        • @nishm 我认为您混淆了整个 reduce 阶段的术语与仅在 reduce 阶段内部减少的术语。 reduce阶段是shuffle、sort和reduce。慢启动告诉它何时开始整个阶段。你是对的,reduce 阶段中的 reduce 只有在映射器完成后才开始。
        【解决方案4】:

        Reducer 任务仅在所有映射器的completion 之后启动。

        但是数据传输发生在each Map 之后。 实际上这是一个拉动操作。

        这意味着,每次 reducer 都会询问每个 maptask 是否有一些数据要从 Map 中检索。如果他们发现任何 mapper 完成了他们的任务,Reducer 会拉取中间数据。

        Mapper 的中间数据存储在disk 中。 并且从 Mapper 到 Reduce 的数据传输是通过网络发生的(Data Locality 在 Reduce 阶段不保留)

        【讨论】:

          【解决方案5】:

          考虑一个 WordCount 示例,以便更好地理解 map reduce 任务的工作原理。假设我们有一个大文件,比如一本小说,我们的任务是找出每个单词在文件中出现的次数。由于文件很大,它可能被分成不同的块并在不同的工作节点中复制。字数统计作业由 map 和 reduce 任务组成。 map 任务将每个块作为输入,并生成一个中间键值对。在这个例子中,由于我们正在计算单词的出现次数,因此映射器在处理块时会产生形式为 (word1,count1)、(word2,count2) 等的中间结果。所有映射器的中间结果是通过了一个 shuffle 阶段,该阶段将对中间结果进行重新排序。

          假设我们从不同映射器输出的地图是以下形式:

          地图1:- (是,24) (是,32) (和,12)

          地图2:- (我的,12) (是,23) (是,30)

          map 输出以这样的方式排序,即相同的键值被赋予相同的 reducer。这意味着对应于 is,was 等的键使用相同的减速器。它是产生最终输出的减速器,在这种情况下为:- (and,12)(is,47)(my,12)(was,62)

          【讨论】:

          • 没有解决 OP 关于减速器何时启动的问题。
          【解决方案6】:

          reduce 阶段可以在调用 reducer 之前很久开始。一旦“a”映射器完成工作,生成的数据就会进行一些排序和改组(包括对组合器和分区器的调用)。减速器“阶段”在映射器后数据处理开始的那一刻开始。完成这些处理后,您将看到减速器百分比的进展。但是,还没有调用任何减速器。根据可用/使用的处理器数量、数据性质和预期 reducer 的数量,您可能需要更改上面@Donald-miner 所述的参数。

          【讨论】:

            【解决方案7】:

            reduce 阶段显示的百分比实际上是从映射输出复制到 reducer 输入目录的数据量。 要知道这个复制什么时候开始?这是您可以设置的配置,如 Donald 上面所示。一旦所有数据都被复制到减速器(即 100% 减少),这就是减速器开始工作的时候,因此如果您的减速器代码是 I/O 或 CPU 密集型的,则可能会冻结在“100% 减少”中。

            【讨论】:

              【解决方案8】:

              据我所知,Reduce 阶段从地图阶段开始,并不断消耗地图中的记录。然而,由于在 map 阶段之后有排序和洗牌阶段,所有的输出都必须被排序并发送到 reducer。因此,从逻辑上讲,您可以想象 reduce 阶段仅在 map 阶段之后开始,但实际上出于性能原因,reducer 也使用映射器进行初始化。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-07-22
                • 1970-01-01
                • 2016-12-01
                • 2012-05-10
                • 1970-01-01
                • 2011-08-06
                • 1970-01-01
                相关资源
                最近更新 更多