0. 前言
YARN的基本内容我已经在下面这篇文章中进行了较为详细的说明。
YARN简介
对于一般的使用者来说已经足够了,但是对于资源管理和调度系统的研究人员和研发人员来说,了解其内部实现时必须的。
认真看过YARN源码的人会被其内部的设计思想所震惊,对于并发的处理可以说做到了极致,服务、事件、状态机、异步处理器等等,下面将针对YARN中包含的模块进行较为详细的说明,旨在理清楚其中的关系,为大家阅读源码提供一些指导。
1. yarn产生背景
- 1.0版本局限:扩展性差,jobtracker兼备资源管理和任务调度,成为瓶颈;可靠性差,jobtracker单点问题;资源利用率低,基于槽位的资源分配模型,粗粒度槽位;无法支持多种计算框架,因为需要进行任务调度。
- 2.0优势:资源利用率提高,多个框架共享一个集群,削峰填谷;运维成本低;数据共享,跨集群间的数据移动。
2. 组成简介
- RM:全局资源管理器,资源管理和分配,包含调度器和应用程序管理器(管理所有AM)。资源管理系统主要做资源抽象,资源调度,资源隔离。
- AM:与RM协商获取资源,分配资源给子任务,与NM通信启动任务,监控任务运行状态。
- NM:向RM汇报本节点上的资源使用情况和容器运行情况,处理来自AM的请求。
- 容器:动态资源划分单位,支持CPU和内存,使用Cgroups进行资源隔离。
3. 通信协议
- 总是client去联系server采取pull-based方式。作业客户端和RM之间applicationclientprotocol;admin和RM之间resourcemanageradministratorprotocol,管理黑白名单和用户队列权限;AM与RM之间applicationmasterprotocol,注册申请资源;AM与NM之间containermanagerprotocol启动停止容器并获取容器信息;NM与RM之间resourtracker节点的资源和容器信息;序列化框架采用PB向后兼容,采用avro作为RPC框架;客户端和MRAppMaster之间的协议MRClientProtocol。
4. 基础库
- PB:平台无关;语言无关;高性能;体积小;使用简单;兼容性好;步骤:定义消息格式文件,PB编译器生成特定语言代码文件,使用API编写应用程序。
- 通讯库:通信模块,stub程序,调度程序,客户程序和服务过程。RPC特点透明性,高性能,可控性(RMI重量级过大,网络连接,超时,缓冲等均难以定制或者修改)。
- RPC总体架构:序列化层;函数调用层,采用java反射机制和动态代理实现;网络传输层,基于tcp/ip的socket机制;服务器端处理框架,基于reactor设计模式的事件驱动IO模型。
- RPC使用过程:定义RPC协议,是一个接口;实现RPC协议;构造并启动RPC Server,RPC.Builder并调用start()启动该server;构造client发送RPC请求,RPC.getProxy。 对于客户端远程调用过程:创建一个Connection对象,将远程方法调用信息封装成call对象放入哈希表中;发送call对象;接受返回结果;从call对象哈希表中删除。Server端:接受请求(通过listener建立连接,轮询的方式找reader,通过reader将call类放入共享队列);处理请求(handler线程读取call对象执行完后发给responder线程);返回结果(responder线程发送结果,一次发送不完会注册selector)
- YARN RPC应用实例:定义通讯协议接口;为通信协议接口提供PB定义和实现(resourcetrackerservice);提供参数和返回值的PB定义;为参数和返回值提供java定义;实现客户端和服务端;
- 服务库:被服务化的对象分为被创建、已初始化、已启动、已停止。
- 事件库:基于事件驱动的并发模型,增加并发性。将操作变成事件,并由事件处理器完成,异步过程。
- 状态库:每个状态可以接受一组特定的事件,根据事件转换到下一个状态。状态机使用:定义作业类型;定义作业状态机;
5. AM编写
- client编写流程:创建一个RPC client与RM通信获得一个ID;通过client将AM提交至RM。
- AM-RM:注册;申请资源(请求:资源量,优先级,数据本地性,期望的结点,黑名单;响应:分配的资源信息,结点状况和资源抢占信息);运行完毕退出;
- AM-NM:与NM通信启动容器;获取容器运行情况;释放容器资源;
6. RM相关
- 基本职能:resourcetracker与NM之间通信(注册,汇报健康,容器运行并领取命令),applicationmasterprotocol与AM之间通信(注册,申请,释放资源),applicationclientprotocol与客户端通信(产看应用执行状态,下达命令)。
- 内部架构:用户交互模块(为普通客户提供服务、为管理员提供服务,webapp);NM管理模块(监控NM是否存活,维护正常和异常节点,resourcetrackerservice处理来自NM的请求包括注册和心跳);AM管理模块(监控AM活着,启动AM,AMS处理来自AM的请求);application管理模块(管理应用程序访问权限;管理应用程序启动和关闭;容器超时回收);状态机管理模块(RMApp维护同一个应用所有实例的生命周期;RMAppAttempt维护一次运行尝试的生命周期;RMContainer维护一个容器生命周期;RMNode维护NM的生命周期);安全管理模块;资源分配模块(按照一定约束进行资源分配)
- 用户交互模块:clientRMService中保留了一个RMContext对象,保存了集群信息以便进行快速信息响应;adminservice的管理员在yarn.admin.acl中设置;
- AM管理:launcher,monitor,AMS。AM启动过程(申请资源;在NM上启动,创建一个containermanagerprotocol客户端;将AM注册到AMLivelinessmonitor启动心跳;向AMS注册;向AMS周期性心跳;AMMonitor更新心跳时间;注销;注销监控;)
- NM管理:monitor,nodeslistmanager,resourcetrackerservice。
- Application管理:acl,RMAppManager(管理应用的启动和关闭),containerallocationexpirer。
- 状态机管理:RMApp(9种基本状态和12中事件)RMAppAttempt(13种基本状态scheduled,allocated_saving,allocated和15种事件)RMContainer(9种状态8个事件)RMNode(6种基本状态和8个事件)
- 启动AM过程:提交任务;创建RMAppImpl对象;记录日志;创建RMAppAttemptImpl;RMContainer;NM:
- 容器分配过程:AM向RM申请资源;RMS进行状态维护;AMS通过allocate函数将AM所需资源汇报给RS;RS读取待释放容器列表; NM向RM汇报自己信息;RTS向RS发送Node_update事件;进行资源分配。
- HA注意问题:脑裂,切换不彻底导致认为有两个RM,采用隔离机制解决;切换对外透明。
7. 资源调度器对比
- 资源调度模型:双层,RM第一层分配,AM第二层分配;
- Fair调度器:资源公平共享、支持资源抢占、负载均衡、调度策略灵活配置,提高小应用程序响应时间。最大最小公平算法(先平均分配,然后将多余的资源再平均分配给后续的用户),带权重,每次分配的时候都按照权重进行分配。
- 自适应调度器,根据已经完成作业的时间来进行后续作业分配
- 自学习调度器,基于贝叶斯分类算法的资源感知调度器,选取若干特征进行分类。
- 资源调度框架:(1)MESOS:资源分配到任务运行过程
- 资源调度策略
8. NM
- 基本职能:通过resourcetracker与RM通信,注册(发送自己的资源和端口信息,返回各种Token,下一步操作,RM标识) ,心跳;containermanagement协议,AM通过其启动、杀死和获取容器的执行状态信息。
- 内部架构:nodestatusupdater与RM通信。Containermanager负责管理容器,包括:RPC Server与AM通信;resourcelocalizationservice负责将容器所需资源本地化;containerslauncher启动或杀死容器;containermonitor监控容器使用量;containerexecutor与底层操作系统交互,启动容器;deletionservice文件删除功能服务化;
- 节点健康检查:一种通过自定义脚本,一种通过定时检查磁盘损坏情况。优点:可以作为节点负载的反馈,目前仅支持对CPU和内存的隔离;人为暂时维护NM。
- 分布式缓存:应用提交时将所需文件放在HDFS上,启动的时候先去下载缓存,如果本地有了则直接使用。
- Cgroups:限制进程组使用的资源量;进程组优先级控制;对进程组使用的资源进行记账;进程组控制;
9. 未来考虑的一些改进点
(1)动态修改NM的资源,目前修改后需要重启;
(2)容器重用;
(3)RM单点故障问题。
版权声明:本文为Kaiyang_Shao原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。