美文网首页
极客时间 08 | MapReduce如何让数据完成一次旅行

极客时间 08 | MapReduce如何让数据完成一次旅行

作者: Wy_75ed | 来源:发表于2018-11-17 21:41 被阅读0次

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;
}

相关文章

网友评论

      本文标题:极客时间 08 | MapReduce如何让数据完成一次旅行

      本文链接:https://www.haomeiwen.com/subject/ywgifqtx.html