hadoop中mapreduceMap器的分区输出

mxg2im7a  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(301)

这是一个非常基本的问题 Hadoop :
假设我有3个 mappers 和2 reducers . Map器产生以下输出:

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"}
wnavrhmk

wnavrhmk1#

假设你的符号是 Key -> Value 在上面的话,这应该是不可能的,因为你有1号键都要减速器1和减速器2(可能这是打字错误?)。
至于操作顺序:
k、 v对被写入输出收集器/Map上下文(k,v对被序列化到内存中的缓冲区)
一旦内存缓冲区的大小达到阈值,缓冲区数据将溢出到磁盘+缓冲区清除
每次泄漏:
缓冲区按键排序(同样在内存中)
对每个分区迭代这个缓冲区,并将该分区的k,v对写入一个溢出文件(一个溢出文件按顺序包含所有分区,还将写入一些索引元数据,说明每个分区在文件中的起始位置)。
因此,在Map任务结束时,您将有1个或多个已排序溢出(按分区排序,然后按键排序)。
如果您有一个组合器,那么组合器可能会在为该分区写下k,v对之前运行(如果该分区中的对数超过某个阈值)。

相关问题