Hadoop:YARN基本架构与工作流程
目录
YARN概述
Yarn(Yet Another Resource Negotiator)是hadoop的集群资源管理系统。
Yarn在hadoop 2中开始被引用,yarn提供了请求和使用集群资源的api,最初是为了改善mapreduce的实现,但它也支持其他分布式计算模式,如spark,tez...
可见分布式计算框架在集群计算层会作为yarn应用运行在集群存储层上,这有些类似于软件应用、操作系统和硬件的关系。
YARN的基本架构
MapReduce1
mapreduce1指代的是hadoop初始版中的MR框架,用来区别使用了yarn的mapreduce2
mapreduce1中有两类守护进程控制着作业执行过程:一个jobtracker(作业跟踪器)和多个tasktracker(任务跟踪器)
- jobtracker:负责作业调度/任务进度监控和资源管理,jobtracker将用户提交的作业分解成多个任务,通过调度tasktracker上运行的任务来协调所有运行在系统上的作业,如果其中一个任务失败,jobtracker可以在另一个tasktracker节点上重新调度该任务;同时也负责存储已完成作业的作业历史,或者用一个作业历史服务器作为一个独立的守护进程来取代jobtracker
- tasktracker:配置有若干个固定长度的slot,在运行任务的同时将运行进度报告发送给jobtracker,jobtracker由此记录每项任务作业的整体进度情况。
YARN
mapreduce2中使用了YARN
yarn的基本思想是将jobtracker的资源管理和作业的调度/监控两大功能拆分成两个独立的进程:一个全局的Resource Manager和每个应用对应的Application Master。而tasktracker对应的是每个工作节点上的Node Manager进程。
Resource Manager和每个节点上的Node Manager组成了新的数据计算框架
Resource Manager
Resource Manager是一个纯粹的调度器,它负责整个系统的资源管理和分配,本身由调度器和应用程序管理器构成
调度器(Scheduler)
调度器会根据容量、队列等限制条件将系统中的资源分配给各个正在运行中的应用程序(Application Master)。注意它只是一个纯调度器,不会参与与具体应用程序相关的工作(如监控或跟踪应用的执行状态或重启失败的任务,这些都是由Application Master来实现)。
资源分配的单位是容器(Container),容器将内存、CPU、磁盘、网络等资源封装在一起,从而限定了任务使用的资源量。注意:容器并不是物理的概念,实际上是对用来完成具体任务的软件(java类)及其所分配资源和所指派节点的描述,但是到了所指派的节点上就会落实为一个独立的进程。
Yarn提供了多种直接可用的调度器,如FIFO调度器、公平调度器和容量调度器
应用程序管理器(Application Manager)
应用程序管理器负责管理整个系统中所有应用程序。主要职责:
- 处理来自客户端的请求,如应用程序的提交
- 与调度器协商资源以启动Application Master
- 监控Application Master运行状态并在失败时重启
Application Master
Application Master与应用程序是相互对应的,它主要有以下职责:
- 将作业分解成任务,并与Resource Manager调度器协商资源,一个任务对应一个容器
- 监控该应用所含的task,如果容器出现故障,Application Master会重新向Resource Manager调度器申请其他资源
- 在Application Master出现故障后,Application Manager会重启它,但由Application Master自己从之前保存的应用程序执行状态中恢复应用程序
通常每一个应用都有自己的Application Master实例,但为一组应用提供一个Application Master也是可行的
Node Manager
Node Manager是每个节点的框架代理,它主要有以下职责:
- 启动容器,并监控容器的资源使用,并将这些信息汇报给RM调度器
- 为task构建Container环境,即资源本地化,包括二进制可执行文件.jars等
- 为所在的节点提供一个管理本地存储资源的简单服务,所以应用程序可以继续使用本地存储资源,即使它没有向Resource Manager处申请。例如mapreduce可以利用这个服务存储MapTask的输出结果,并将其发送给Reducer。
MR1与YARN比较
组成上的比较
MapReduce1 | YARN |
Jobtracker | Resource Manager、Application Master、时间轴服务器 |
Tasktracker | Node Manager |
Slot | Container |
YARN的很多设计是为了解决MR1的局限性:
- 可扩展性:YARN更适合在大规模的集群上运行;当节点数和任务数达到一定数量,MR1会遇到可扩展性的瓶颈,因为jobtracker必须同时管理作业和分配资源。而YARN利用RM和application master分离的架构克服了这个局限性。一个应用的实例对应一个application master。
- 可用性:jobtracker内存中大量快速变量的复杂状态使得其很难获得高可用性;而YARN中需要先为RM提供高可用性,再为Application Master提供高可用性。
- 利用率:MR1中,每个tasktracker都配置有若干个固定长度的slot,这些静态分配的slot在配置时就被划分成了map slot或reduce slot,比如map slot中只能用于运行map作业;YARN中NM管理一个资源池(容器),可以避免发生同步的情况。
- 多租户:用户可以在一个YARN集群上运行不同版本的MapReduce,并且YARN向MR以外的其他分布式应用开放。
RM中的调度
YARN中有三种调度器可用:FIFO调度器、容量调度器、公平调度器
FIFO调度器:将应用放置在一个队列中,按照提交顺序先进先出运行应用;但不适合共享集群,大应用占用集群中大量资源,会阻塞其他应用。后两者更适合共享集群。
容量调度器:内存会有两个队列,分别用来运行大应用和小应用,确保小作业一提交就可以启动,但会以整个集群的利用率为代价;与FIFO调度器相比,大作业执行的时间会更长。
公平调度器:不需要预留资源,调度器会在所有运行的作业之间动态平衡资源。从第二个作业启动到获取资源会有时间滞后,因为它需要等待第一个作业使用的容器释放资源。
YARN应用工作流程
下图描述了在Yarn上运行一个应用的流程
1、客户端向RM提交一个YARN作业,在RM中排入一个等待调度的队列
2、RM通过YARN调度模块进行协调集群上资源分配,以选出一个具有足够空闲资源的NM节点,并将操作系统层面的shell命令行连同所分配的资源配额等信息打包作为一个容器发送给这个节点,使其启动一个进程作为这个作业的Application Master
3、Application Master首先分析这个作业的情况,并将它分解成多个任务,有几个任务就需要几个容器,即打成几个包。若所在NM中资源无法完成整个作业,则AM需要就具体应用所含的任务逐一向RM申请容器(通过heartbeat)。而RM是通过调度器Scheduler加以调度
4、AM得到了RM分配下来的容器后,就要将容器转发给指定节点,然后NM将容器中指定的数据文件和程序映像本地化,作为一个进程启动这个任务
AM会通过心跳向RM反馈任务运行情况,当用户需要查询作业的进展情况时,用户并不知道该作业的AM在哪里,也无法与AM直接交互,所以所有的查询都要经过RM。