Yarn
Hadoop 1.x 中包括 HDFS、MapReduce,其中 MapReduce 既是计算框架又是资源管理框架,它的架构为主从架构。
JobTracker 作为主节点,接受客户端提交的作业 Job,然后为该 Job 在 TaskTracker 上分配资源,之后将 Job 拆分为 Task 调度到不同 TaskTracker 中运行,后者会不断汇报任务执行进度和状态。
这样导致 Job Tracker 主节点压力过大,而且早期没有实现高可用 JobTracker 存在单点问题。其次资源模型划分较为简单,JobTracker 在分配资源时仅仅考虑 Task 数量,没有考虑 CPU 和内存。
Yarn 的引入,它是一个分布式通用资源管理系统,摒弃了 JobTracker 的任务调度管理,专注于资源管理。
Yarn 架构
Yarn 整体上包含 Resource Manager(Active/StandBy)
、NodeManager
、ApplicationManger
。
ResourceManger
:主节点,作为资源管理的核心,包括主备两个节点实现高可用。客户端向 ResourceManager 提交作业后,ResourceManager 会在 NodeManager 上为当前作业分配资源;NodeManager
:封装了进程相关资源,负责运行具体任务。- 作业提交后,ResourceManager 会找到一个空闲 NodeManager 并分配一个 Container 资源容器(可以理解为 Docker 容器,已经分配了 CPU/内存 等资源);
- 然后该任务会在当前容器内生成
ApplicationMaster
(作业管理程序),由该程序调用代码生成具体 Task 任务; - 接着
ApplicationMaster
根据生成的 Task 数量,向ResourceManager
申请资源; ResourceManager
再分配容器资源给作业管理程序,作业管理程序将任务调度到容器进程中执行。执行过程中会实时向作业管理程序汇报任务的运行状态。
Container
:任务运行的基本单位,理解为 docker 的容器进程;ApplicationMaster
:作业管理程序,负责生成具体任务、向 ResouceManager 申请计算资源、收集 Container 中作业运行状态和进度。
上述结构减轻了主节点 ResourceManager 的负载,它只需要专注于资源分配,作业的生成、运行、监控都由 ApplicationMaster 负责。
Yarn 资源调度策略
FIFO 调度器
FIFO Scheduler,先进先出调度策略。将所有的任务放到队列中,队尾入队,队头出队。
无法处理紧急任务,所有任务只能按到达顺序执行。
容量调度器
提前做预算,在预算的指导下分配共享资源,Yarn 默认的调度策略。
如图划分出多个队列,用于提交不同任务,并对这些任务提前分配资源。比如两个队列 A 和 B,队列A 用来提交大任务,由于大任务消耗资源多,所以分配多一些资源;而小任务提交到队列B,这样既保证了总体任务执行效率,又保证了小任务/紧急任务能及时得到执行。
同时考虑到大队列可能存在空闲期,所以可以动态调整队列容量,尽最大比例使用资源。
公平调度器
同样为多队列划分,但是不会为每个队列预先分配资源,比如 任务A 先提交此时占用所有计算资源,假如又提交了 B任务,就要开始抢占计算资源,任务A 需要划分出一半资源给任务B。
实际使用时可以不用平分计算资源,而是按照加入任务的复杂程度按权重分配资源。
Yarn 基本使用命令
# 查看 Yarn 中所有未完成的任务
yarn application -list# 查看某个任务的执行状态
yarn applicatin -status <Application ID># 强制结束某个任务
yarn application -kill <Application ID>
Yarn 对应的基本配置文件包括 yarn-site.xml
,其中核心配置包括:
ResourceManager 相关配置:
# 是否开启 ACL
yarn.acl.enable# ResourceManager 配置
## 设置 RM 主机名
yarn.resourcemanager.hostname## 设置 RM IP+Port,开放给客户端提交任务
yarn.resourcemanager.address## Application 获取资源的 IP+Port
yarn.resourcemanager.scheduler.address## 设置 RM IP+Port,用于 NodeManager 寻址
yarn.resourcemanager.resource-tracker.address## 设置 RM IP+Port,用于管理员命令
yarn.resourcemanager.admin.address## 设置 RM IP+Port,用于Web UI
yarn.resourcemanager.webapp.address## Yarn 全局资源调度策略
yarn.resourceManager.scheduler.class## Container 中最小申请的资源
yarn.scheduler.minimum-allocation-mb## Container 中最大申请的资源
yarn.scheduler.maximum-allocation-mb## 控制 NameNode 列表
yarn.resourcemanager.nodes.include-path
yarn.resourcemanager.nodes.exclude-path
NodeManager 相关配置:
# NodeManager 数据保存位置
yarn.nodemanager.local-dirs# NodeManager 日志保存位置
yarn.nodemanager.log-dirs# 配置 NodeManager 节点内存资源,用于分配给 Container 计算任务使用
yarn.nodemanager.resource.memory-mb# 任务的虚拟内存使用量
yarn.nodemanager.vmem-pmem-ratio# 日志保存时间
yarn.nodemanager.log.retain-seconds