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