基础篇
MRv1到YARN
- MRv1主要是以MR为主的计算框架,而MRv2主要是针对MRv1的缺陷改进而来的,以YARN为主的轻量级弹性计算平台;
- MRv1的缺陷:
- 扩展性差:JobTracker兼备资源管理和作业控制;
- 可靠性差:master单点故障;
- 资源利用率低:粗粒度的划分单位,任务之间不共享;
- 无法支持多种计算框架:只有基于磁盘的离线计算框架MR,不能满足多种需求;
- YARN的诞生背景:
- 基于数据密集型应用的计算框架层出不穷:
- MR:离线处理;
- Storm:在线处理;
- Spark:迭代式处理;
- S4:流式处理;
- 各种框架各有所长,在同一个公司中,多种框架可能被同时采用,如网页建立索引用MR,自然语言处理/数据挖掘用Spark等,考虑到成本等,又希望把所有框架部署在一个共享集群中,而非各占一个独立集群,而且需要在对共享资源统一管理使用的同时,保证各个任务的隔离性,急需轻量级弹性计算平台。
- 基于数据密集型应用的计算框架层出不穷:
- 共享集群的好处:
- 资源利用率高:多种框架共享资源,统一管理,不会出现分配不均或某些紧缺而某些空闲的问题;
- 运维成本低:管理员成本和硬件成本;
- 数据共享:减小数据移动带来的成本;
- 一个框架一个集群 到 多个框架共享集群:
YARN的组成结构和流程
- YARN基本组成结构:
- ResourceManager(RM):全局资源管理器,负责资源管理和分配;
- Schduler:纯调度器,只负责根据各个应用程序的资源需求进行资源分配;
- ApplicationManager(ASM):负责管理整个系统中所有应用程序;
- ApplicationMaster(AM):用户提交的每个应用程序均包含一个AM,主要功能:
- 与Scheduler协商获取资源(Container);
- 将得到的任务进一步分配给内部的任务;
- 与NM通信以启动/停止任务;
- 监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务;
- NodeManager(NM):每个节点上的资源和任务管理器,主要功能:
- 定时向RM汇报本节点上的资源使用情况和各个Container的运行状态;
- 接受并处理来自AM的Container启动/停止等请求;
- Container:资源抽象,封装某个节点上的多维度资源,如内存、CPU、磁盘等
- ResourceManager(RM):全局资源管理器,负责资源管理和分配;
- YARN工作流程:
- 步骤1:用户向YARN提交应用程序,其中包括AM程序、启动AM的命令、用户程序等;
- 步骤2:RM为该应用程序分配第一个Container,并与对应的NM通信,要求它在这个Container中启动该AM;
- 步骤3:AM首先向RM注册,这样用户可以通过RM查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它们的运行状态,直到运行结束,即重复步骤4~7;
- 步骤4:AM采用轮询的方式,通过RPC协议向RM申请和领取资源;
- 步骤5:一旦AM申请到资源后,便与对应的NM通信,要求它启动任务;
- 步骤6:NM为任务设置好运行环境后,将任务启动命令写到一个脚本中,通过运行该脚本启动任务;
- 步骤7:各个任务通过某个RPC协议向AM汇报自己的状态和进度,以便AM随时掌握各个任务的运行状态,从而可以在任务失败时重启任务;
- 步骤9:应用程序运行完成后,AM向RM注销并关闭自己;
- 如下图:
- YARN的理解角度:
- 多线程并行编程:
- YARN:云操作系统,为应用程序启动AM;
- AM:主线程,负责应用程序内部的数据切分、任务分配等,并启动各个Task;
- Task:子线程,仅负责自己的计算任务,完成即结束退出;
- 当所有子线程(Task)结束以后,主线程(AM)结束退出;
- 资源管理器;
- 云计算:YARN可以看做PAAS层,为不同类型的应用程序提供统一的管理和调度;
- 多线程并行编程:
YARN基础库
RPC
- Hadoop RPC(集群各组件之间的通信方式)总体架构:
- 序列化层:结构化对象转为字节流便于网络传输或持久存储,主要用于请求中的参数和应答跨机器传输;
- 函数调用层:定位要调用的函数并执行该函数,Hadoop RPC采用Java反射机制和动态代理实现;
- 网络传输层:描述了Client和Server之间消息传输的方式,Hadoop RPC采用基于TCP/IP的Socket机制;
- 服务器端处理框架:描述了Client和Server之间信息交互的方式,直接决定服务器端的并发处理能力,Hadoop RPC采用基于Reactor设计模式的事件驱动I/O模型;
- YARN RPC:可以集成多种RPC框架,如Protocol Buflers、Thrift、Avro等;
- 对RPC的理解和实现,可以通过查看具体的例子进行理解,比如NM的心跳函数;
服务库(使得YARN低耦合、高内聚、设计简单、易维护)
- 对于生命周期较长的对象,YARN采用了基于服务的对象管理模型对其进行管理,几个特点:
- 每个被服务化的对象分为4个状态:NOTINITED、INITED、STARTED、STOPPED;
- 任何服务状态变化都可以触发另外一些动作;
- 可以通过组合的方式对任意服务进行组合,以便统一管理;
- 在YARN中,RM和NM属于组合服务,它们内部包含多个单一服务和组合服务,以实现对内部多种服务的统一管理;
事件库(使得YARN低耦合、高内聚、设计简单、易维护)
- 为了构建基于事件驱动的并发模型,YARN将各种处理逻辑抽象成事件和对应的事件调度器,并把每类事件的处理过程分割成多个步骤,用有限状态机表示;
- 处理过程:
- 处理请求作为事件进入系统;
- 由中央异步调度器负责传递给对应的事件调度器;
- 事件调度器有两种处理:
- 可能将该事件转发给另外一个事件调度器;
- 也可能交给一个带有有限状态机的事件处理器,其处理结果也以事件的形式输出给中央异步调度器;
- 新的事件会再次被中央异步调度器转发给下一个事件调度器,直至处理完成(到达终止条件)。
- 在YARN中,所有核心服务实际上都是一个中央异步调度器,包括RM、NM、AM等,它们维护了事先注册的事件和事件处理器,并根据接收的事件类型驱动服务的运行;
状态机库(使得YARN设计架构更清晰)
- 如上所述,在YARN中,事件的处理过程被分割成多个步骤,用有限状态机表示,换言之,有限状态机维护着有状态对象的生命周期;
- 在YARN中,每种状态转换由一个四元组表示,分别是转换前状态preState、转换后状态postState、事件event和回调函数hook,表示状态机在preState状态下,接收到事件event后,执行回调函数hook,并在执行完成后将状态转换为postState。
- YARN定义了三种状态转换方式:
- 一个初态、一个终态、一种事件;
- 一个初态、多个终态、一种事件,终态由hook返回值确定;
- 一个初态、一个终态、多种事件;