文章目录
一、Yarn简介
在 Hadoop2.x 时代,分离了 MapReduce 部分功能,将资源调度和运算分开,增加了 Yarn。Yarn 只负责资源的调度,MapReduce 只负责运算。而且 Yarn 不仅仅能运行 MapReduce 程序,还可以运行后面会学习的 Spark 应用程序。可以说Yarn 目前发展成为一个通用的资源调度框架。很多计算框架都支持在 Yarn 上运行。
二、Yarn基本架构
1.ResourceManager
ResourceManager 是 YARN 中的全局资源管理器,相当于将集群中各个机器可用的资源看做一个整体,然后进行统一管理和分配,它会接收来自各个节点(NodeManager)的资源回报信息,并将这些信息按照一定的策略分配给应用程序。
ResourceManager 主要作用
➢ 处理客户端请求,Cline 提交 Job,首先是由 ResourceManager 来反馈。
➢ 监控 NodeManager,监控 NodeManager 心跳,发送指令给 NodeManager。
➢ 启动或监控 ApplicationMaster。
➢ 资源的分配和调度。
ResourceManager 核心组成:
1.Resource Scheduler(资源调度器),主要负责协调集群中各个应用的资源分配,保证整个集群的运行效率。Resouce Scheduler 只是一个纯调度器,只负责给用户提交的应用分配 Container(资源),它不会关注应用程序监控及其运行状态等信息,它不做监控以及应用程序的状态跟踪,并且不负责应用程序的容错,也就是说,当应用程序失败时,它不负责重启应用程序。
2.ApplicationManager(应用管理器),主要负责接收用户应用的提交请求,为应用程序分配第一个 Container 来运行 ApplicationMaster,还有就是负责监控ApplicationMaster,并在遇到失败时重启 ApplicationMaster 运行的 Container。ApplicationMaster 每一个程序都会有一个,运行在 Container 中,可以看做是每一个应用的管理者。
2.NodeManager
NodeManager 运行在集群的节点上,这一点从前面安装分布式环境中可以看出,一般 NodeManager 会与 DataNode 在同一个节点。NodeManager 在集群中会有多个,负责管理每个节点上的资源。它主要负责接收来自 ResouceManager 的资源分配请求,分配具体的 Container 给具体的任务,同时,它还负责监控并报告 Container 使用信息给 ResouceManager。NodeManager 只负责管理自身节点上的 Container,并不关心运行在 Container 上的任务的运行信息,任务的运行信息由 ApplicationMaster 来管理。
NodeManager 主要作用:
➢ 管理单个节点上的资源
➢ 监控 Container 生命周期和使用的资源
➢ 处理来自 ResourceManager 的指令
➢ 处理来自 ApplicationMaster 的指令
在 NodeManager 注册到 ResourceManager 之后,它就会不间断的向ResourceManager 发送心跳(heartbeat),如果 ResourceManager 有需要它执行的指令,就作为响应发送给它。在 NodeManager 加载一个 Container 之前,它需要本地化需要的资源,包括数据文件,可执行文件,shell script 等。这些 Resource可能有能够在不同用户之间共享的资源,有能够在相同用户不同应用之间共享的资源,以及只能够被这一个 Container 使用的资源。NodeManager 也可以在ResourceManager 的指示下,杀掉 Container。当处于下面的几种场景中时,NodeManager 就可能 Kill 掉一个 Container。
➢ ResourceManager 告诉它,Application 已经完成了。
➢ Scheduler 决定抢占这个 Container,并将它分配给另一个 Application 或者用户。
➢ NodeManager 检测到,这个 Container 使用的资源已经超过指定的资源限制。当一个 Container 完成时,NodeManager 会清除它在本地存储的数据。当一个应用完成时,NodeManager 会删除全部跟它相关的 Container 的数据。
3.ApplicationMaster
ApplicationMaster 运行在 Container 中,它主要功能是向 ResourceManager申请资源和 NodeManager 协同工作,运行应用的各个任务(比如 MapTask、ReduceTask),然后跟踪它们状态及监控各个任务的执行,遇到失败的任务还负责重启它。YARN 中运行的每个应用程序都有一个自己独立的 ApplicationMaster。ApplicationMaster(AM)的主要作用:
➢ 负责数据的切分。比如 MapReduce 任务会根据 InputSplit 信息来进行数据切分。
➢ 为应用程序申请资源,并进一步分配给内部任务。比如 MapReduce 任务,主要是为 MapTask 和 ReduceTask 申请运行资源来运行 Task
➢ 内部任务的监控和容错。
➢ 负责协调来自 ResourceManager 的资源,并通过 NodeManager 监视任务的执行和资源使用情况。
ApplicationMaster 启动后会和 ResourceManager 保 持 连 接 , 定 期 向ResourceManager 发送心跳(heartbeat),回报自己的健康信息。然后计算应用(Application)需要的资源,然后跟 ResourceManager 沟通,让 ResourceManager给它分配 Container,分配了 Container 后,ApplicationMaster 和 NodeManager 沟
通来加载 Container 运行任务。
4.Container
Container 是 YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。
Container 是 YARN 框架的计算单元,是具体运行 Task(如 MapTask、ReduceTask)的基本单位。
Container 是一个动态资源分配单位,将内存、CPU、磁盘、网络等资源封装在一起,限定了每个任务使用的资源量。
从上面的描述可以看出,Container 很像我们使用的虚拟机系统,就是在NodeManager 节点机器上分配一块独立的空间来运行任务。
Container 与集群节点的关系:一个节点可以运行多个 Container,但是需要明确的是 Container 不能跨多个机器。任何一个用户提交的应用拆分后的任务都必须运行在一个或多个 Container 中。
三、Yarn执行流程
1.作业提交
(1)client 调用 job.waitForCompletion 方法,向整个集群提交 MapReduce作业。
(2)client 向 ResourceManager 申请一个作业 Id。
(3)ResourceManager 给 Client 返回该 job 资源的提交路径(HDFS 路径)和作业 Id,每一个作业都有一个唯一的 Id。
(4)Client 发送 jar 包、切片信息和配置文件到指定的资源提交路径。
(5)Client 提交完资源后,向 ResourceManager 申请运行 MrAppMaster(针对该 job 的 ApplicationMaster)。
2.作业初始化
(6)当 ResourceManager 收到 Client 的请求后,将该 job 添加到容量调度器(Resouce Scheduler)中。
(7)某一个空闲的 NodeManager 领取到该 job。
(8)该 NodeManager 创建 Container,并产生 MrAppMaster。
(9)下载 Client 提交的资源到本地,根据分片信息生成 MapTask 和ReduceTask。
3.任务分配
(10)MrAppMaster 向 ResouceManager 申请运行多个 MapTask 任务资源。
(11)ResourceManager 将运行 MapTask 任务分配给空闲的多个NodeManager,NodeManager 分别领取任务并创建容器(Container)。
4.任务运行
(12)MrAppMaster 向两个接收到任务的 NodeManager 发送程序启动脚本,每个接收到任务的 NodeManager 启动 MapTask,MapTask 对数据进行处理,并分区排序。
(13)MrAppMaster 等待所有 MapTask 运行完毕后,向 ResourceManager申请容器(Container),运行 ReduceTask。
(14)程序运行完毕后,MrAppMaster 会向 ResourceManager 申请注销自己。
(15)进度和状态更新
YARN 中的任务将其进度和状态(包括 counter)返回给应用管理器, 客户端每秒(通过mapreduce.client.progressmonitor.pollinterval 设置)向应用管理器请求进度更新, 展示给用户。可以使用 YARN WebUI 查看任务执行状态。
5.作业完成
除了向应用管理器请求作业进度外, 客户端每 5 分钟都会通过调用 waitForCompletion() 来检查作业是否完成。
时间间隔可以通过mapreduce.client.completion.pollinterval 来设置。
作业完成之后, 应用管理器和container 会清理工作状态。作业的信息会被作业历史服务器存储以备之后用户核查。
四、Yarn资源调度器
FIFO:先进先出调度器
Capacity Scheduler:容量调度器
Fair Scheduler:公平调度器
五、Yarn常用命令
查看正在运行的任务列表
yarn application -list
杀掉正在运行的任务
yarn application -kill 任务 id
查看节点列表
yarn node -list
查看节点状况
yarn node -status 节点 id
查看 yarn 依赖 jar 的环境变量
yarn classpath