2个关键问题
- 如何为每个数据块分配一个Map,也就是代码怎么发送到数据块所在服务器,发送后如何启动,启动后如何直到数据在什么位置
- 处于不同服务器的map输出的<Key, Value>,如何把相同的Key聚合在一起发送给Reduce任务
MapReduce作业启动和运行机制
MapReduce数据合并与连接机制
shuffle
每个 Map 任务的计算结果都会写入到本地文件系统,等 Map 任务快要计算完成的时候,MapReduce 计算框架会启动 shuffle 过程,在 Map 任务进程调用一个 Partitioner 接口,对 Map 产生的每个 <Key, Value> 进行 Reduce 分区选择,然后通过 HTTP 通信发送给对应的 Reduce 进程。这样不管 Map 位于哪个服务器节点,相同的 Key 一定会被发送给相同的 Reduce 进程。Reduce 任务进程对收到的 <Key, Value> 进行排序和合并,相同的 Key 放在一起,组成一个 <Key, Value 集合 > 传递给 Reduce 执行。
map 输出的 <Key, Value>shuffle 到哪个 Reduce 进程是这里的关键,它是由 Partitioner 来实现,MapReduce 框架默认的 Partitioner 用 Key 的哈希值对 Reduce 任务数量取模,相同的 Key 一定会落在相同的 Reduce 任务 ID 上。从实现上来看的话,这样的 Partitioner 代码只需要一行。
public int getPartition(K2 key, V2 value, int numReduceTasks){
return (key.hashCode()) & Integer.MAX_VALUE) % numReduceTasks;
}
网友评论