1. YARN架构
YARN总体上仍然是Master/Slave结构。在整个资源管理框架中,ResourceManager为Master,NodeManager为Slave,ResourceManager负责对各个NodeManager上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向ResourceManager申请资源,并要求NodeManger启动可以占用一定资源的任务。由于不同的ApplicationMaster被分布到不同的节点上,因此它们之间不会相互影响。
1.1 ResourceManager
整个集群资源的主要协调者和管理者,负责给用户提交的所有应用程序分配资源。主要包括两个组件:
-
调度器Scheduler:收来自ApplicationMaster的应用程序资源请求,把集群中的资源以“容器”的形式分配给提出申请的应用程序,容器的选择通常会考虑应用程序所要处理的数据的位置,进行就近选择,从而实现“计算向数据靠拢”。
-
应用程序管理器(Applications Manager):负责系统中所有应用程序的管理工作,主要包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控ApplicationMaster运行状态并在失败时重新启动等。
1.2 NodeManager
每个节点的管理者,主要负责该节点内所有容器的生命周期管理,监视资源和跟踪节点健康。
1.3 ApplicationMaster
在用户提交一个应用程序时,yarn会启动一个轻量级的进程ApplicationMaster负责协调来自RM的资源,通过NM监视容器内资源的使用情况。
1.4 Container
yarn中的资源抽象,封装了某个节点上的多维度的资源。当AM向RM申请资源,RM为AM返回的资源用Container表示。yarn会为每个任务分配一个Container,该任务只能使用该Container中的资源,AM可在Container内运行任何类型的任务。
2 yarn任务提交启动流程
- 客户端程序向 RM 提交应用并请求一个 AM 实例
- RM 找到一个可以运行一个 Container 的 NM,并在这个 Container 中启动 AM 实例
- AM 向 RM 进行注册,并向RM申请启动任务containr所需的资源
- RM根据NM的资源汇报情况,向AM回复资源(container)的分配情况,即给请求的任务container分配具体的NM
- AM根据任务container分配的NM,向对应的NM发送请求,要求启动任务container
- NM收到启动任务container的请求后,同样根据请求参数,先完成依赖资源的本地化,然后启动任务container进程
- NM 不断汇报任务状态和进展给 ApplicationMaster
- 一旦应用程序执行完成并且所有相关工作也已经完成,AM 向 RM 取消注册然后关闭,用到所有的 Container 也归还给系统。
3 RM HA与NN HA的区别
- RM(Resource Manager) HA 中,NM(Node Manager) 只会向 Active RM 发送心跳;NN(NameNode) HA 中,DN(DataNode)会同时向 Active NN 和 Standby NN发送心跳。
- RM HA 的选举机制内建在 RM 里(EmbeddedElectorService类),而 NN HA 是用单独的 zkfc 进程进行选举的。
4 RM脑裂问题
4.1 问题描述
脑裂是指Resource Manager由于网络闪退或者自身故障未及时对外做出响应,出现“假死”现象,导致出发了Zookeeper新一轮的主备切换,但是,对于“假死”的RM自身来说,它仍认为自己是Active,所以导致整个系统中出现多个Active的RM。
4.2 解决方案
隔离机制:在主备切换时,在RM竞争创建锁节点时,会携带zookeeper的ACL权限进行限制,目的是独占该节点。在主备切换后,原来“假死”的RM恢复后,会去更新zookeeper的节点状态,如果发现ACL不对,节点不是自己创建的,会将自己自动更新为standby状态,这样,保证了系统中只有一个Active的RM。
5 YARN资源隔离方式
- 对于内存,采用进程监控或者 Cgroups 的方案
- 对于 CPU,采用 Cgroups 方案
6. 多用户的资源调度方案
- 一个物理集群上虚拟多个 Hadoop 集群
- 扩展 Hadoop 调度器,支持多个队列多个用户
目前yarn采用的是多队列的资源调度方式。
7 资源高度器的分类
7.1 FIFO Scheduler
hadoop 1.x 默认调度器。FIFO Scheduler采用队列方式将一个一个job任务按照时间先后顺序进行服务。
7.2 Capacity Scheduler
hadoop 2.x 默认调度器。 Capacity Scheduler,主要特点是可以为每个队列设置资源最低保证和资源使用上限,而所有提交到该队列的应用程序共享这些资源。
7.3 Fair Scheduler
Facebook 开发的,主要特点是可以为每个队列单独设置调度策略(当前支持 FIFO、Fair、DRF 三个策略)
8 NameNode元数据及同步
hdfs的元数据文件分为两类:fsimage和edits,用于持久化存储。
8.1 fsimage
fsimage(镜像文件)是元数据的一个持久化的检查点,包含Hadoop文件系统中的所有目录和文件元数据信息,但不包含文件块位置的信息。文件块位置信息只存储在内存中,是在 datanode加入集群的时候,namenode询问datanode得到的,并且间断的更新。
8.2 edits
edits(编辑日志)存放的是Hadoop文件系统的所有更改操作(文件创建,删除或修改)的日志,文件系统客户端执行的更改操作首先会被记录到edits文件中。
8.3 同步
ActiveNameNode实时将fsimage和edit接入JournalNode(高效的存储系统)。StandByNameNode实时获取JournalNode内部的数据,实现两个节点的实时元数据同步。
参考