Map | Reduce |
- 映射、变换、过滤 | - 分解、缩小、归纳 |
- 1进N出 | - 1组进N出 |
Map的并行度由切片的数量来决定,Reduce的并行度由人决定
MR计算的原理:
数据以一条记录为单位经过Map方法映射成KV,相同的key为一组,这一组数据调用一次Reduce方法,在方法内迭代计算这组数据
角色:
- JobTracker
- 资源管理
- 任务调度
- TaskTracker
- 任务管理
- 资源汇报
计算向数据移动的流程,Hadoop1.x
- Cli
- 会根据每次的计算任务,咨询NameNode元数据,通过block块酸楚切片(split),得到一个切片清单
- split是逻辑的,block是物理的,block身上有(offset、locations),split与block形成映射关系,指引split对应的map任务应该移动到哪些节点(即:计算向数据移动)
- 生成未来运行时的计算程序的相关配置文件
- cli会将jar、配置xml、split清单上传到HDFS的目录中
- cli会调用JobTacker通知要启动一个计算程序了,并且告知文件都放在了hdfs的哪些地方
- JobTracker收到启动程序之后:
- 从hdfs中取回split清单
- 根据已收到的TaskTracker汇报的资源数据,确定最终每一个split对应的map应该去哪个节点
- 当后面TaskTacker再汇报的时候就会取回分配给自己的任务信息
- TaskTacker:
- 在心跳取回任务后,从HDFS中下载jar、xml等资源到本机
- 最终启动任务描述中的MapTask/ReduceTask执行相关逻辑
Hadoop1.x 中JobTracker的三大问题
- 容易出现单点故障
- 压力过大(调度可能会有延迟)
- 集成了资源管理、任务调度两者耦合,带来的弊端是:
- 未来新的计算框架不能复用资源管理
- 因为各自实现资源管理,当部署在同一批硬件上时,因为隔离,所以不能感知对方的使用情况,造成资源争抢!
Hadoop2.x淘汰了以上的处理流程,出现了yarn架构
yarn架构:将1.x中JobTracker的资源管理功能独立出来,进行独立的资源管理
- 模型:
- container容器
- 虚的:对象、属性、nodeManager、cpu、内存、io
- 物理:
- jvm进程->操作系统进程
- NodeManager会有线程监控container资源情况,若有超额,会由NM直接kill掉
- 通过cgroup(内核级)技术,在启动jvm进程的时候,由kernel约束死
*整合docker
- 架构/框架
- ResourceManager
- 负责整体资源的管理
- NodeManager
- 向ResourceManager汇报心跳,提交自己的资源情况
- 运行流程(MapReduce On Yarn)
- MR-cli(切片清单、配置、jar、商出单hdfs)
- MR-cli 访问ResourceManager申请AppMaster
- ResourceManager选择一台节点,通知NodeManager启动一个Container,在里面反射一个MapReduce AppMaster
- 启动MapReduce AppMaster,从hdfs下载切片清单,向ResourceManager申请资源
- 由ResourceManager根据自己掌握的资源情况得到一个确定清单,通知NodeManager来启动container
- container启动后会反向注册到已经启动的ResourceManager AppMaster进程
- ResourceManager AppMaster(曾经的JobTasker阉割版不带资源管理的)最终将任务发送给container
- container会反射相应的Task类为对象,调用方法执行,其结果就是我们的业务逻辑代码的执行
- 计算框架都有Task失败重试的机制
- 结论:
- 单点故障:曾经时全局的,即JobTracker挂了,整个计算层都没有了调度
- 现在,每一个App有一个自己的AppMaster调度,yarn也支持AppMaster失败重试
- 压力过大:yarn每个计算程序自有AppMaster,每个AppMaster只负责自己计算程序的任务调度,轻量了;AppMaster是在不同的节点中启动的,有了负载
- 集成了资源管理、任务调度两者耦合:
- yarn只是资源管理框架,不负责具体的任务调度,进行了解耦
- 是公共的,只要计算框架继承了yarn的AppMaster的接口,大家都可以使用一个统一视图的资源管理层。
从1.x到2.x:1.x的JobTacker、TaskTracker是MR的常服务,2.x之后没有了这些服务,相应的:MR的cli、调度、任务都变成了临时服务