mapreduce 分区内的数据是否已排序,如果是,如何排序? AFAIK,它是根据 key 分组的。如果它在内部排序,那么对所有分区内的所有数据进行排序不是一种开销吗?
最佳答案
如果您谈论的是映射器作为输入接收的输入拆分,那么不是;它们没有排序,因为这确实会产生不必要的开销。
排序在 map 阶段结束之前开始(仅当使用 reducer 时),因此 reduce 函数的输入已排序。 Partitioner 定义了指定哪个 reducer 将处理映射器输出的标准。 HashPartitioner(默认使用的 Partitioner 的实现)对映射器的输出键进行哈希处理,并将它们发送到与特定哈希值相对应的缩减器(所以这里是发生分组的时候)。
排序 实际上是 reduce 阶段的第二个过程,在 shuffling a.k.a. copying(即获取映射器的输出)之后和之前实际上运行 reduce 函数,它是基于键的。它可以被认为是一个类似合并排序的过程,它合并映射器的排序输出。
您可以在 Tom White 的书“Hadoop:权威指南”中找到更多详细信息。这是我所描述内容的示意图:
关于sorting - mapreduce 分区内的数据是否已排序,如果是,它是如何发生的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26037627/