在Hadoop中对Mappers的输出进行分区

时间:2013-09-22 11:58:04

标签: hadoop mapreduce

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

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

Mapper 1 output : {1 -> "a1", 2 -> "b1"}, 
Mapper 2 output : {2 -> "b2", 3 -> "c2"}, 
Mapper 3 output : {1 -> "a3", 3 -> "c3"}  

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

Reducer 1 input : {1 -> "a1", 2 -> "b1", "b2"}
Reducer 2 input : {1 -> "a3", 3 -> "c2", "c3"} 

1 个答案:

答案 0 :(得分:2)

假设您的符号在上面是Key -> Value,那么这应该是不可能的,因为您将密钥1同时转到reducer 1和reducer 2(可能这是拼写错误?)。

关于操作的顺序:

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

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

如果你有一个组合器,那么组合器可以在为该分区写下K,V对之前运行(如果该分区中的对数超过某个阈值)。