这是我参与「第四届青训营」笔记创作活动的第 15 天
YARN架构
1 RM(ResourceManager) + N NM(NodeManager)
ResourceManager的职责
一个集群active状态的RM只有一个,负责整个集群的资源管理和调度
1)处理客户端的请求(启动/杀死)
2)启动/监控ApplicationMaster(一个作业对应一个AM)
3)监控NM
4)系统的资源分配和调度
NodeManager的职责
整个集群中有N个,负责单个节点的资源管理和使用以及task的运行情况
1)定期向RM汇报本节点的资源使用请求和各个Container的运行状态
2)接收并处理RM的container启停的各种命令
3)单个节点的资源管理和任务管理
ApplicationMaster的职责
每个应用/作业对应一个,负责应用程序的管理
1)数据切分
2)为应用程序向RM申请资源(container),并分配给内部任务
3)与NM通信以启停task, task是运行在container中的
4)task的监控和容错
Container的职责
对任务运行情况的描述:cpu、memory、环境变量
YARN执行流程
1)用户向YARN提交作业
2)RM为该作业分配第一个container(AM)
3)RM会与对应的NM通信,要求NM在这个container上启动应用程序的AM
- AM首先向RM注册,然后AM将为各个任务申请资源,并监控运行情况
5)AM采用轮训的方式通过RPC协议向RM申请和领取资源
6)AM申请到资源以后,便和相应的NM通信,要求NM启动任务
7)NM启动我们作业对应的task
YARN环境搭建
mapred-site.xml中设置mapreduce.framework.name为yarn
yarn-site.xml中设置yarn.nodemanager.aux-services为mapreduce_shuffle
yarn的启动与停止
开启yarn:sbin/start-yarn.sh
通过jps命令,验证是否启动成功,出现ResourceManager、NodeManager表示成功
提交一个 Application 到 Yarn 的流程
1、提交一个MR应用程序
- Client 向 Yarn 提交 Application之后
- ResourceManager 向 NodeManager 通信,为该 Application 分配第一个容器。
- 并在这个容器中运行这个应用程序对应的 ApplicationMaster
2 、ApplicationMaster 资源请求
- ApplicationMaster 启动以后,对作业(也就是 Application) 进行拆分,拆分 task 出来
- 这些 task 可以运行在一个或多个容器中
- ApplicationMaster 然后向 ResourceManager 申请要运行程序的容器
- 并定时向 ResourceManager 发送心跳
3、容器分配
- ApplicationMaster 向 ResourceManager 申请要运行程序的容器,
- ApplicationMaster 定时向 ResourceManager 发送心跳
4、ApplicationMaster 分发task
- ApplicationMaster 申请到容器后,它会去和容器对应的 NodeManager 通信
- 随后将作业分发到对应的 NodeManager 中的容器去运行
- 对应容器中运行的可能是 Map 任务,也可能是 Reduce 任务
5、 运行过程中
容器中运行的任务会向 ApplicationMaster 发送心跳,汇报自身情况
当程序运行完成后, ApplicationMaster 再向 ResourceManager 注销并释放容器资源