sorting - mapreduce 分区内的数据是否已排序,如果是,它是如何发生的?

标签 sorting hadoop mapreduce shuffle partition

mapreduce 分区内的数据是否已排序,如果是,如何排序? AFAIK,它是根据 key 分组的。如果它在内部排序,那么对所有分区内的所有数据进行排序不是一种开销吗?

最佳答案

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

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

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

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

enter image description here

关于sorting - mapreduce 分区内的数据是否已排序,如果是,它是如何发生的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26037627/

相关文章:

c++ - 结构比较器访问 C++ 中的另一个字段

json - 错误1066:无法打开别名的迭代器-PIG SCRIPT

hadoop - hadoop配置是如何工作的

java - 迭代的MapReduce作业具有NumberFormatException错误

windows - 运行 MapReduce 作业时出错 : not a valid Inet address

java - "Unable to execute HTTP Request: Broken Pipe"与 Amazon EMR 上的 Hadoop/s3

java - Quicksort - 排序数组较慢?

winforms - 将实体绑定(bind)到 Windows DataGridView

c - 如何按名称(字符串)搜索和排序 BST?按队列打印并缩进?

java - 配置 Hadoop 日志记录以避免日志文件过多