MapReduce
编程模型
Mapper
Reducer
input path
outputpath
计算框架
关键问题:
如何为每个数据块分配一个 Map 计算任务,也就是代码如何发送到数据块所在的服务器上,以及如何启动,如何找到对应的 blockID
处于不同服务器的 map 输出的<key,value>,如何把相同的 key 聚合在一起发送给 Reduce 任务处理
1.应用进程 JobClient 将用户作业 JAR 包存储在 HDFS 中,将来这些 JAR 包会分发给 Hadoop 集群中的服务器执行 MapReduce 计算。
2.应用程序提交 job 作业给 JobTracker。
3.JobTracker 根据作业调度策略创建 JobInProcess 树,每个作业都会有一个自己的 JobInProcess 树。
4.JobInProcess 根据输入数据分片数目(通常情况就是数据块的数目)和设置的 Reduce 数目创建相应数量的 TaskInProcess。
5.TaskTracker 进程和 JobTracker 进程进行定时通信。
6.如果 TaskTracker 有空闲的计算资源(有空闲 CPU 核心),JobTracker 就会给它分配任务。分配任务的时候会根据 TaskTracker 的服务器名字匹配在同一台机器上的数据块计算任务给它,使启动的计算任务正好处理本机上的数据,以实现我们一开始就提到的“移动计算比移动数据更划算”。
7.TaskTracker 收到任务后根据任务类型(是 Map 还是 Reduce)和任务参数(作业 JAR 包路径、输入数据文件路径、要处理的数据在文件中的起始位置和偏移量、数据块多个备份的 DataNode 主机名等),启动相应的 Map 或者 Reduce 进程。
8.Map 或者 Reduce 进程启动后,检查本地是否有要执行任务的 JAR 包文件,如果没有,就去 HDFS 上下载,然后加载 Map 或者 Reduce 代码开始执行。
9.如果是 Map 进程,从 HDFS 读取数据(通常要读取的数据块正好存储在本机);如果是 Reduce 进程,将结果数据写出到 HDFS。
shuffle
分布式计算需要将不同服务器上的相关数据合并到一起进行下一步计算,这就是 shuffle。
版权声明: 本文为 InfoQ 作者【xujiangniao】的原创文章。
原文链接:【http://xie.infoq.cn/article/0ee425aa2515e74e3c27cd2d7】。文章转载请联系作者。
评论