【问题标题】:Is data inside mapreduce partitions sorted, if yes, how does it happen?mapreduce 分区内的数据是否已排序,如果是,它是如何发生的?
【发布时间】:2014-11-20 04:05:06
【问题描述】:

mapreduce 分区内的数据是否已排序,如果是,如何排序? AFAIK,它是根据密钥分组的。如果是内部排序,对所有分区内的所有数据进行排序不是开销很大吗?

【问题讨论】:

    标签: sorting hadoop mapreduce shuffle partition


    【解决方案1】:

    如果您谈论的是映射器作为输入接收的输入拆分,那么不是;它们没有排序,因为这确实会产生不必要的开销。

    排序在map阶段结束之前之前开始(仅当使用reducer时),因此reduce函数的输入被排序。 Partitioner 定义了指定哪个reducer 将处理映射器的输出的标准。 HashPartitioner(默认使用的 Partitioner 的实现)对映射器的输出键进行哈希处理,并将它们发送到与特定哈希值对应的化简器(所以这里是 分组 发生的时间)。

    排序实际上是reduce阶段的第二个过程,在shuffle又名copying(即获取映射器的输出)之后和之前实际运行 reduce 函数,它基于键。它可以被认为是一个类似合并排序的过程,它合并了映射器的排序输出。

    您可以在 Tom White 的书“Hadoop:权威指南”中找到更多详细信息。这是我所描述的示意图:

    【讨论】:

    • 是的,但是当不同的溢出被合并到磁盘文件中时(在洗牌阶段开始之前),合并的输出是否也排序了?如果是,如何?
    • 另外,既然你提到“它合并了映射器的 sorted 输出”,这是否意味着当溢出发生时会发生某种排序合并?说分组实际上是“分组兼排序”对吗?
    • 是的,每个mapper的合并输出也是排序的,使用merge-sort。键必须实现 WritableComparable 类,该类指定如何比较键。仅当使用减速器时才适用。使用0个reducer时,输出不排序,直接将map输出写入磁盘。
    • 我将短语“排序开始于地图阶段结束时”更改为“排序开始于地图阶段结束时正好之前”让它更清楚。
    • 在所有地图输出上运行排序不是开销,即使只是分组可能有效。无论如何,reducer 的输出都会被排序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    相关资源
    最近更新 更多