Yarn
1. Yarn 的介绍
YARN是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度,提供运算所需的资源(内存、cpu)。
- yarn 并不清楚用户提交的程序的运行机制
- yarn 只提供运算资源的调度(用户程序向 yarn 申请资源,yarn 就负责分配资源)
- yarn 与运行的用户程序完全解耦,意味着 yarn 上可以运行各种类型的分布式运算程序
- yarn 成为一个通用的资源调度平台,企业中以前存在的各种运算集群都可以整合在一个物理集群上,提高资源利用率,方便数据共享
- yarn 中的主管角色叫 ResourceManager
- yarn 中具体提供运算资源的角色叫 NodeManager
2. Yarn 的三大组件
2.1 ResourceManager
- 负责整个分布式集群的资源管理和分配,是全局的资源管理系统。
- YARN Scheduler 根据 application 的请求为其分配资源,不负责 application job 的监控、追踪、运行状态反馈、启动等工作。
- NodeManager 通过心跳机制向 ResourceManager 汇报资源使用情况(主要是 CPU 和内存的使用情况)。RM 只接受 NodeManager的资源汇报信息,对于具体的资源处理NodeManager自己处理。
2.2 NodeManager
- 为单个节点上的资源管理系统,它是管理这台机器的代理。负责该节点程序运行,以及该节点资源的管理和监控,Yarn 集群每个节点都运行一个NodeManager。
- 定时向 ResourceManager 汇报节点资源(CPU、内存)的使用情况和Container 的运行状态。当 ResourceManager 宕机时自动连接 RM 备用节点。
- 接收并处理来自 ApplicationMaster的 Container 启动、停止等各种请求。
2.3 AppMaster
- 用户提交的每个应用程序均包含一个AppMaster ,它可以运行在 ResourceManager以外的机器上。
- 负责与 ResourceManager调度器协商以获取资源(用 Container 表示【core,内存】)。
- 监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。
- 与 NodeManager通信以启动/停止任务。
- 将得到的任务进一步分配给内部的任务(资源的二次分配)。
3. Yarn 的运行流程
4. Yarn 调度器 Scheduler
Scheduler:在Yarn中负责给应用分配资源
4.1 FIFO Scheduler
先进先出调度器: 把应用按提交的顺序排成一个先进先出队列,进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配。
4.2 Capacity Scheduler
容量调度器: 允许多个组织共享整个集群,每个组织分配专门的队列,每个队列分配一定的集群资源,因此每个组织可以获得集群的一部分计算能力。整个集群可以通过设置多个队列的方式给多个组织提供服务。队列内部垂直划分,一个组织内部的多个成员共享这个队列资源,队列内部,资源的调度是采用的是先进先出(FIFO)策略。
4.3 Fair Scheduler
公平调度器: 在Fair调度器中,不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态调整系统资源。如下图,当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
从第二个任务提交到获得资源会有一定的延迟,需要等待第一个任务释放占用的Container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终效果就是Fair调度器即得到了高的资源利用率又能保证小任务及时完成。
5. Hadoop High Availability(高可用)
高可用(HA),是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,分为活动节点(Active)及备用节点(Standby)。当活动节点出现问题,导致正在运行的业务(任务)不能正常运行时,备用节点此时就会侦测到,并立即替代活动节点来执行业务,从而实现业务的不中断或短暂中断。
5.1 Namenode HA
NameNode如果出现故障,会影响整个hdfs集群的使用,叫做单点故障问题。NameNode高可用就是为了解决这个问题。
基本原理:用2N+1台 JournalNode 存储EditLog,每次写操作有>=N+1返回成功时即认为写成功,数据不会丢失了。这个算法最多能容忍有N台机器挂掉,如果多于N台挂掉,这个算法就失效了。这个原理是基于Paxos算法。
在HA架构里SecondaryNameNode已经不存在了,为了保持Standby NameNode时时的与Active NameNode的元数据保持一致,他们之间交互通过JournalNode进行操作同步。
- 当集群启动时,2个NameNode会在Zookeeper上抢临时节点,注册为Active NameNode
- 当第一个NameNode注册成功后,后续的NameNode只能为Standby NameNode
- 任何修改操作在 Active NameNode上执行时,至少半数以上的JournalNode进程会同时记录修改log,才算执行成功
- Standby NameNode 监测到JournalNode里面的同步log发生变化了,会读取 JournalNode里面的修改log,同步到自己的目录镜像树里
- Standby NameNode 会监听 Active NameNode在Zookeeper上注册的临时节点,当Active NameNode 出现故障后,临时节点会消失
- 当Standby NameNode 监听到Active NameNode的注册的临时节点消失时,会读取所有的JournalNode里的修改日志,确保与挂掉的NameNode 的目录镜像树一致,然后代替NameNode
- Standby NameNode向DataNode发送自己的状态和一个更大的序列号,DataNode会保存这个序列号,至此Standby NameNode正式成为Active NameNode
- 原来的NameNode故障修复后,会返回给DataNode的心跳信息包含active状态和原来的序列号
- DataNode需要确保同一时间有且只有一个NameNode 能命令DataNode,由于故障恢复后的NameNode返回的序列号比自己保存的序列号小,DataNode会拒绝这个NameNode的命令
- 故障修复后的NameNode,变成了Standby NameNode
5.2 Failover Controller
HA 模式下,会将 FailoverController部署在每个 NameNode的节点上,作为一个单独的进程用来监视 NameNode的健康状态。
FailoverController主要包括三个组件:
-
HealthMonitor: 监控 NameNode 是否处于 unavailable 或 unhealthy 状态。通过RPC 调用NameNode 相应的方法完成。
-
ActiveStandbyElector: 监控 NameNode 在 Zookeeper中的状态。
-
ZKFailoverController: 订阅 HealthMonitor 和 ActiveStandbyElector 的事件,并管理NameNode 的状态,另外 zkfc 还负责解决 fencing(脑裂问题)
ZKFailoverController 主要职责: | |
---|---|
健康监测: | 周期性的向它监控的 NameNode发送健康探测命令,来确定是否处于健康状态。如果机器宕机或心跳失败,那么 zkfc 就会标记它处于一个不健康的状态 |
会话管理: | 如果 NameNode是健康的,zkfc 就会在 zookeeper 中保持一个打开的会话。NameNode 处于 Active 状态时,zkfc 会在 Zookeeper 中占有一个临时节点 znode,当这个 NN 挂掉时,这个 znode 会被删除,然后备用的 NameNode将会得到这把锁,升级为主 NameNode,同时标记状态为 Active。当宕机的 NameNode 重新启动时,它会再次注册 zookeeper,发现已经有 znode 锁了,便会自动变为 Standby 状态,注意目前仅支持最多配置 2 个 NameNode |
master 选举: | 通过在 zookeeper 中维持一个临时节点 znode,来实现抢占式的锁机制,从而判断哪个 NameNode 为 Active 状态 |
5.3 Yarn HA
同NameNode HA一样,resourcemanager会出现单点故障问题,可以通过zookeeper配置resourcemanager的高可用。