美文网首页
极客时间 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