【问题标题】:Regarding partitioning of data for reducers关于 reducer 的数据分区
【发布时间】:2013-06-08 04:57:18
【问题描述】:

Hadoop 权威指南 (Tom White) 第 178 页 部分洗牌和排序:地图方面。 就在图6-4之后

在写入磁盘之前,线程首先将数据划分为与它们最终将被发送到的减速器相对应的分区。在每个分区中,后台线程执行内存中的 key 排序,如果有组合函数,则在排序的输出上运行。

问题:

这是否意味着映射将每个键输出写入不同的文件,然后将它们组合起来。 因此,如果有 2 个不同的 key 输出要发送到 reducer,每个不同的 key 将单独发送到 reducer,而不是发送单个文件。

如果我的上述推理不正确,那么实际发生了什么。

【问题讨论】:

    标签: hadoop mapreduce


    【解决方案1】:

    只有当两个关键输出去不同的减速器时。如果分区认为他们应该去同一个reducer,他们将在同一个文件中。

    -- 更新以包含更多细节 - 主要来自书中:

    分区器只是将键排序到桶中。 0 到 n 表示您工作中的减速器数量。 reduce 任务有少量的复制线程,因此它可以并行获取映射输出。因此,对于给定的作业,jobtracker 知道地图输出和主机之间的映射。 reducer 中的一个线程会定期向 master 请求 map 输出主机,直到它全部检索到它们为止。

    如果 map 输出足够小,则将其复制到 reduce 任务 JVM 的内存中(缓冲区的大小由 mapred.job.shuffle.input.buffer.percent 控制,它指定用于此目的的堆的比例);否则,它们将被复制到磁盘。当内存缓冲区达到阈值大小(由 mapred.job.shuffle.merge.percent 控制)或达到映射输出的阈值数量(mapred.inmem.merge.threshold)时,它被合并并溢出到磁盘。如果指定了组合器,它将在合并期间运行以减少写入磁盘的数据量。

    随着副本在磁盘上的累积,后台线程会将它们合并为更大的排序文件。这节省了稍后合并的时间。请注意,必须在内存中解压缩(由 map 任务)压缩的任何 map 输出,以便对它们执行合并。

    当所有 map 输出都被复制后,reduce 任务进入排序阶段(应该正确地称为合并阶段,因为排序是在 map 端进行的),它合并 map 输出,保持它们的排序排序。这是轮流进行的。例如,如果有 50 个地图输出并且合并因子为 10(默认值,由 io.sort.factor 属性控制,就像在地图的合并中一样),则将有五轮。每轮将10个文件合并为一个,所以最后会有5个中间文件。

    与将这五个文件合并为一个排序文件的最后一轮不同,合并通过在最后一个阶段:reduce 阶段直接提供 reduce 函数来节省磁盘行程。最终合并可能来自内存和磁盘段的混合。

    【讨论】:

    • 那么这是否意味着分区器联系了作业跟踪器,然后能够知道哪个键去哪个任务跟踪器减速器?如果是,请告诉我过程。
    【解决方案2】:

    如果我们配置了多个reducer,那么在partition的时候如果我们得到不同reducer的key,它们会被存储在reducer对应的单独文件中,并且在map任务结束时完整的文件会被发送到reducer而不是单个key .

    【讨论】:

      【解决方案3】:

      假设您有 3 个减速器正在运行。然后,您可以使用分区器来决定哪些键进入三个减速器中的哪个。您可能可以在分区器中执行 X%3 来决定哪个键进入哪个减速器。 Hadoop 默认使用HashPartitioner.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-18
        • 1970-01-01
        • 1970-01-01
        • 2019-02-18
        • 1970-01-01
        • 2018-09-07
        • 2019-07-24
        • 2016-01-01
        相关资源
        最近更新 更多