- 将计算过程分为两个阶段,Map和Reduce
Map阶段并行处理输入数据
Reduce阶段对Map结果进行汇总 - Shuffle链接Map和Reduce两个阶段
Map Task将数据写入到本地磁盘
Reduce Task从每个Map Task上读取一份数据 - 仅适合离线批处理
具有很好的容错性和扩展性
适合简单的批处理任务 - 缺点明显
启动开销大、过多使用磁盘导致效率地下等
延迟高:完全基于磁盘的计算,每个环节的数据都是落地的硬盘上。
MR架构图
(1)、Master/Slave 架构
(2)、JobTracker
- Master节点,每个Hadoop集群只有一个JobTracker,管理所有作业,作业/任务的监控、错误处理等;将任务分解成一系列任务,并分派给TaskTracker。
- 整个MapReduce计算框架中的主服务(进程),运行作业的“管理者”,负责整个集群的作业控制和资源分配。
- 不一定必须运行在Namenode上,可以运行在任何节点上。通常不和NN放在一台机器上
- 通常部署JobTracker的节点,不开启TaskTracker进程。就像NN节点上不开启DataNode进程一样
(3)、TaskTracker
- Slave节点,运行Map Task和Reduce Task;并与JobTracker交互,汇报任务状态。
- TaskTracker位于子节点(即Datanode上),独立管理各自的task。
- 每个TaskTracker负责独立执行具体的task,而JobTracker负责分配task。每个TaskTracker可并行处理多个map以及reduce任务。
- TaskTracker的一个重要职责就是与JobTracker交互。如果JobTracker无法准时地获取TaskTracker提交的信息,JobTracker就判定TaskTracker已经崩溃,并将任务分配给其他节点处理。
- Map Task:解析每条数据记录,传递给用户编写的map(),并执行,将输出结果写入本地磁盘(如果为map-only作业,直接写入HDFS)。
- Reducer Task:从Map Task的执行结果中,远程读取输入数据,对数据进行排序,将数据按照分组传递给用户编写的reduce函数执行。
(4)、水平扩容
- 增加TaskTracker节点数,达到水平扩容(HDFS是增加Datanode节点数进行扩容),通常运行在Datanode上。
Mapreduce处理流程,以wordCount为例
MR计算流程解读
计算过程阶段:Map-combine-shuffle-Reduce
Map阶段并行处理输入数据
Reduce阶段对Map结果进行汇总
先看每个
Map阶段默认逐行读入,<key,value> 对;
Reduce阶段输出, <key , values> 对 。
假如有100台服务器,最终目的是计算出abc总出现次数。
可以如下做:
1、把100T文件分成100份,每份1T存储到每个节点上。并各逐行读取文件得到众多:<abc, 1>, <abc, 1>, <abc, 1>… ,即Map阶段。
如果计算过程很慢,可以对此阶段进行压缩
2、要得到全局abc总出现次数的话,而每个节点上都有abc,怎么办? 想到一个办法,先每个节点上局部汇总各自得到一个总数如<abc, 1000> (即Combine阶段),然后再进行全局汇总。
3、把每个节点上Combine的结果进行混淆(网络传输至公共存储HDFS的临时目录/tmp下),为进行全局汇总做准备,即Shuffle阶段。
4、要进行abc的全局汇总,必须单线程!所以相同的key必须发给同一个reduce线程进行汇总,即Reduce阶段,得到abc的全局汇总值。
其中:1、如果需要代码里不设置Combiner类的话,就没有Combine阶段。会带来什么影响? Shuffle阶段网络传输量增大,增加作业执行时长,增大网络IO负载。所以设置Combiner类是优化利器之一。
2、相同的key必须发给同一个reduce线程进行汇总,处理大key的reduce势必比较慢。这就是数据倾斜。后边课程里会讲如何解决数据倾斜的问题。
3、由于100T不可能平均存储在每个节点上,直接导致每个阶段处理的数据量不同,这是Map阶段数据倾斜。这个无法避免!
相同的KEY必须交给同一个reduce来执行,由于数据在不同节点上分布不均衡如(节点1分配3M、节点2分配3T)。