0

这是一个非常基本的问题Hadoop

假设我有 3mappers和 2 reducers。映射器产生以下输出:

映射器 1 输出:{1 -> "a1", 2 -> "b1"},
映射器 2 输出:{2 -> "b2", 3 -> "c2"},
映射器 3 输出:{1 -> "a3", 3 -> "c3"}  

现在,据我了解,框架将输出分成 2 部分(每个部分reducer)。框架是否在分区之前对所有输出进行排序?是否有可能获得以下输入?reducers

减速器 1 输入:{1 -> "a1", 2 -> "b1", "b2"}
减速器 2 输入:{1 -> "a3", 3 -> "c2", "c3"}
4

1 回答 1

2

假设你的符号Key -> Value在上面,那么这应该是不可能的,因为你有 key 1 去 reducer 1 和 reducer 2 (也许这是错字?)。

至于操作的顺序:

  • K,V 对被写入输出收集器/映射上下文(K,V 对被序列化到内存中的缓冲区)
  • 一旦内存缓冲区的大小达到阈值,缓冲区数据就会溢出到磁盘+缓冲区清除
  • 对于每次泄漏:
    • 缓冲区按键排序(再次在内存中)
    • 该缓冲区针对每个分区进行迭代,并且该分区的 K,V 对被写入溢出文件(单个溢出文件按顺序包含所有分区,并且一些索引元数据也被写入关于每个分区在文件)。

因此,在地图任务结束时,您将有 1 个或多个排序溢出(按分区排序,然后按键排序)。

如果您有组合器,则组合器可能会在为该分区写下 K,V 对之前运行(如果该分区中的对数超过某个阈值)。

于 2013-09-22T15:20:39.253 回答