Yarn
一、Yarn 资源调度器
Yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源。
相当于一个分布式的操作系统平台,而 MapReduce
等运算程序则相当于运行于操作系统之上的应用程序。
1.1、Yarn 基础架构
YARN 主要由 ResourceManager
、NodeManager
、ApplicationMaster
和 Container
等组件构成。
RecourceManager
相当于是整个资源管理器的老大。NodeManager
相当于是一个节点的资源管理器的老大。ApplicationMaster
相当于是控制一次任务的管理器老大。Contaier
相当于是执行任务的环境。
1.2、Tarn 工作机制
MapReduce
程序提交到客户端所在的节点。YarnRunner
向ResourceManager
申请一个Application
。ResourceManager
将该应用程序的资源路径返回给YarnRunner
。- 该程序将运行所需资源提交到
HDFS
上。 - 程序资源提交完毕后,申请运行
mrAppMaster
。 ResourceManager
将用户的请求初始化成一个 Task。- 其中一个
NodeManager
领取到 Task 任务。 - 该
NodeManager
创建容器 Container,并产生MRAppmaster
。 Container
从HDFS
上拷贝资源到本地。MRAppmaster
向 RM 申请运行MapTask
资源。- RM 将运行
MapTask
任务分配给另外两个NodeManager
,另两个NodeManager
分 别领取任务并创建容器。 - MR 向两个接收到任务的
NodeManager
发送程序启动脚本,这两个NodeManager
分别启动MapTask
,MapTask
对数据分区排序。 MrAppMaster
等待所有MapTask
运行完毕后,向 RM 申请容器,运行ReduceTask
。ReduceTask
向MapTask
获取相应分区的数据。- 程序运行完毕后,MR 会向 RM 申请注销自己。
1.3、作业提交全过程
1.3.1、流程图
HDFS、Yarn、MapReduce三者关系:
作业提交过程之Yarn:
作业提交过程之 HDFS & MapReduce
1.3.2、作业提交全过程详解
作业提交
- Client 调用
job.waitForCompletion
方法,向整个集群提交MapReduce
作业。 - Client 向 RM 申请一个作业 id。
- RM 给 Client 返回该 job 资源的提交路径和作业 id。
- Client 提交 jar 包、切片信息和配置文件到指定的资源提交路径。
- Client 提交完资源后,向 RM 申请运行
MrAppMaster
。
- Client 调用
作业初始化
- 当 RM 收到 Client 的请求后,将该 job 添加到容量调度器中。
- 某一个空闲的 NM 领取到该 Job。
- 该 NM 创建 Container,并产生
MRAppmaster
。 - 下载 Client 提交的资源到本地。
任务分配
MrAppMaster
向 RM 申请运行多个MapTask
任务资源。- RM 将运行
MapTask
任务分配给另外两个NodeManager
,另两个NodeManager
分别领取任务并创建容器。
任务运行
- MR 向两个接收到任务的
NodeManager
发送程序启动脚本,这两个NodeManager
分别启动MapTask
,MapTask
对数据分区排序。 MrAppMaster
等待所有MapTask
运行完毕后,向RM申请容器,运行ReduceTask
。ReduceTask
向MapTask
获取相应分区的数据。- 程序运行完毕后,MR 会向 RM 申请注销自己。
- MR 向两个接收到任务的
进度和状态更新
Yarn中的任务将器进度和状态(包括 counter )返回给应用管理器,客户端每秒(通过
mapreduce.client.progressmonitor.pollinterval
设置)向应用管理器请求进度更新,展示给用户。作业完成
除了向应用管理器请求作业进度外, 客户端每 5 秒都会通过调用
waitForCompletion()
来 检查作业是否完成。时间间隔可以通过mapreduce.client.completion.pollinterval
来设置。作业 完成之后, 应用管理器和 Container 会清理工作状态。作业的信息会被作业历史服务器存储 以备之后用户核查。
1.4、Yarn 调度器和调度算法
目前,Hadoop 作业调度器主要有三种:
- 先进先出调度器(FIFO)
- 容量(Capacity Scheduler)
- 公平(Fair Scheduler)
Apache Hadoop3.3.3 默认的资源调度器是 容量(Capacity Scheduler)。
CDH 框架默认调度器是 公平(Fair Scheduler)
具体设置详见:yarn-default.xml文件
1 | <property> |
1.4.1、先进先出调度器(FIFO)
FIFO 调度器(First In First Out):单队列,根据提交作业的先后顺序,先来先服务。
优点:简单易懂
缺点:不支持多队列,生产环境很少使用
1.4.2、容量调度器(Capacity Scheduler)
Capacity Scheduler 是 Yahoo 开发的多用户调度器。
1.4.2.1、特点
- 多队列:每个队列可配置一定的资源量,每个队列采用FIFO调度策略
- 容量保证:管理员可为每个队列设置资源最低保证和资源使用上限
- 灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用 程序提交,则其他队列借调的资源会归还给该队列。
- 多租户:
- 支持多用户共享集群和多应用程序同时运行。
- 为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定
1.4.2.2、分配算法
- 队列资源分配 从root开始,使用深度优先算法,优先选择资源占用率最低的队列分配资源。
- 作业资源分配 默认按照提交作业的优先级和提交时间顺序分配资源。
- 容器资源分配按照容器的优先级分配资源, 如果优先级相同,按照数据本地性原则:
- 任务和数据在同一节点
- 任务和数据在同一机架
- 任务和数据不在同一节点也不在同一机架
1.4.3、公平调度器(Fair Scheduler)
Fair Schedulere 是 Facebook 开发的多用户调度器。
1.4.3.1、特点
1.4.3.2、缺额
1.4.3.3、队列资源分配方式
1.4.3.4、资源分配算法
1.4.3.5、队列资源分配方式
1.5、Yarn 常用命令
Yarn 状态的查询,除了可以在 hadoop103:8088 页面查看外,还可以通过命令操作。常 见的命令操作如下所示:
需求:执行 WordCount 案例,并用 Yarn 命令查看任务运行情况。