系列文章目录
一、yarn总体架构
二、yarn核心组件及功能
三、yarn资源分配与调度
四、yarn提交和执行流程
五、yarn调度算法
六、yarn安全性与容错性
文章目录
- 系列文章目录
- 前言
- 一、总体架构
- 二、核心组件及功能
- 1. ResourceManager(RM)
- 2. NodeManager(NM)
- 3. ApplicationMaster(AM)
- 三、资源分配与调度
- 四、yarn提交和执行流程
- 五、调度算法
- 1. FIFO(先进先出)调度器
- 2. Capacity Scheduler(容量调度器)
- 3. Fair Scheduler(公平调度器)
- 六、安全性与容错性
前言
本文主要详解了Hadoop中的Yarn的底层原理。
一、总体架构
Yarn的总体架构遵循主从模式(Master/Slave),主要由两个核心组件构成:ResourceManager(RM)和NodeManager(NM)。
- ResourceManager(RM):全局资源管理器,负责整个集群的资源管理和调度。它接收来自客户端的作业请求,并为其分配资源。RM内部包含调度器(Scheduler)和应用程序管理器(ApplicationMaster,简称AM)管理器。
- NodeManager(NM):节点资源任务管理器,负责具体服务器上的资源和任务管理。每个集群节点都会运行一个NM进程,它向RM注册自己的资源信息,并接收RM分配的任务来执行。
二、核心组件及功能
1. ResourceManager(RM)
RM是Yarn集群的资源管理中心,负责资源的分配和调度。它主要包括以下两个组件:
- 调度器(Scheduler):资源分配算法的实现,根据应用程序的资源需求和集群的资源状况进行资源分配。Yarn内置了几种资源调度算法,如Fair Scheduler、Capacity Scheduler等,用户也可以根据需要开发自己的调度算法。
- 应用程序管理器(AM管理器):负责应用程序的提交、监控应用程序的运行状态等。当应用程序提交到Yarn时,RM会为其启动一个ApplicationMaster进程,并通过AM管理器进行管理和监控。
2. NodeManager(NM)
NM是Yarn集群的节点管理器,负责具体节点上的资源和任务管理。它主要执行以下任务:
- 资源注册:启动时向RM注册自己的资源信息,包括CPU、内存、磁盘等。
- 任务执行:接收RM分配的任务,在本地启动Container来执行这些任务。Container是Yarn中的资源抽象,封装了节点的多维度资源。
- 状态汇报:定期向RM汇报本节点的资源使用情况和任务执行情况。
3. ApplicationMaster(AM)
AM是应用程序的管理者,每个提交到Yarn的应用程序都会启动一个AM进程。AM的主要职责包括:
- 资源申请:与RM的调度器协商获取执行资源,即向RM申请Container。
- 任务分发:获得资源后,将应用程序的代码和数据分发到相应的NodeManager上,并在Container中启动任务。
- 状态监控:监控任务的执行情况,如果任务失败则重新申请资源并启动任务。
三、资源分配与调度
Yarn的资源分配和调度过程是一个复杂的交互过程,主要包括以下几个步骤:
- 作业提交:客户端将作业提交到RM,包括作业的配置信息、资源需求等。
- 资源申请:RM的调度器根据作业的资源需求和集群的资源状况进行资源分配,为作业分配一个或多个Container。
- 任务分发:AM获得资源后,将作业的任务分发到相应的NM上,并在Container中启动任务。
- 任务执行与监控:任务在Container中执行,NM监控任务的执行情况,并定期向RM汇报。
- 资源释放:任务执行完毕后,AM向RM申请注销自己并释放占用的资源。
四、yarn提交和执行流程
1.客户端提交一个MR程序给ResourceManager(校验请求是否合法...)
2.如果请求合法,ResourceManager随机选择一个NodeManager用于生成appmaster(应用程序控制者,每个应用程序都单独有一个appmaster)
3.appmaster会主动向ResourceManager的应用管理器(application manager)注册自己,告知自己的状态信息,并且保持心跳
4.appmaster会根据任务情况计算自己所需要的container资源(cpu,内存...),主动向ResourceManager的资源调度器(resource scheduler)申请并获取这些container资源
5.appmaster获取到container资源后,把对应指令和container分发给其他NodeManager,让NodeManager启动task任务(maptask任务,reducetask任务)
6.NodeManager要和appmaster保持心跳,把自己任务计算进度和状态信息等同步给appmaster,(注意当maptask任务完成后会通知appmaster,appmaster接到消息后会通知reducetask去maptask那儿拉取数据)直到最后任务完成
7.appmaster会主动向ResourceManager注销自己(告知ResourceManager可以把自己的资源进行回收了,回收后自己就销毁了)
五、调度算法
YARN(Yet Another Resource Negotiator)是Hadoop生态系统中的一个关键组件,主要负责资源管理和作业调度。YARN提供了三种主要的调度方案:FIFO(先进先出)调度器、Capacity Scheduler(容量调度器)和Fair Scheduler(公平调度器)。每种调度方案都有其独特的特征和适用场景。以下是对这三种调度方案的详细解析。
- FIFO(先进先出):按照作业提交的先后顺序进行调度,简单但不够灵活。
- Capacity Scheduler(容量调度器):支持多队列管理,每个队列可以配置一定的资源量,并可以嵌套子队列。它提供容量保证和资源隔离,适合多用户共享集群的场景。
- Fair Scheduler(公平调度器):设计目标是实现资源在时间尺度上的公平分配。它会根据作业的缺额比例来优先为缺额大的作业分配资源,适合对作业执行时间有严格要求的场景。
1. FIFO(先进先出)调度器
FIFO Scheduler: 把应用按提交的顺序排成一个队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
好处: 能够保证每一个任务都能拿到充足的资源, 对于大任务的运行非常有好处
弊端: 如果先有大任务后有小任务,会导致后续小任务无资源可用, 长期处于等待状态
应用: 测试环境。因为在生产环境里面,我们需要能够同时运行多个SQL
- 特征详解:
- 单队列管理:
FIFO调度器采用单队列的方式来管理所有提交的作业。作业按照提交的顺序被放入队列中,先提交的作业先被调度。 - 简单易懂:
FIFO调度器的策略非常简单,不需要复杂的配置,易于理解和使用。这种简单性使得它适合用于测试环境或小型集群。 - 不支持多队列:
由于只有一个队列,FIFO调度器不支持多队列管理,无法根据不同的用户或作业类型进行资源隔离和优先级设置。 - 资源利用率低:
在大型或繁忙的集群中,FIFO调度器可能会导致资源利用率低下。因为大作业可能会长时间占用大量资源,导致后续的小作业长时间等待。 - 不支持优先级:
FIFO调度器默认按照作业提交的顺序进行调度,不支持根据作业的优先级进行资源分配。 - 适用场景:
FIFO调度器适用于资源需求相对简单、作业提交频率不高的场景。例如,在测试环境中,可以使用FIFO调度器来简化资源管理和作业调度的复杂性。
2. Capacity Scheduler(容量调度器)
Capacity Scheduler: 为每个组织分配专门的队列和一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。在每个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
好处: 可以保证多个任务都可以使用一定的资源, 提升资源的利用率
弊端: 如果遇到非常的大的任务, 此任务不管运行在那个队列中, 都无法使用到集群中所有的资源, 导致大任务执行效率比较低,当任务比较繁忙的时候, 依然会出现等待状态
应用: apache开源版本的hadoop
-
示例:
调度器的使用是通过yarn-site.xml配置文件中的
yarn.resourcemanager.scheduler.class参数进行配置的,默认采用Capacity Scheduler调度器
下面是一个简单的Capacity调度器的配置文件,文件名为capacity-scheduler.xml。
prod由于没有设置maximum-capacity属性,它有可能会占用集群全部资源。
dev的maximum-capacity属性被设置成了75%,所以即使prod队列完全空闲dev也不会占用全部集群资源,也就是说,prod队列仍有25%的可用资源用来应急。 -
特征详解:
- 多队列管理:
Capacity Scheduler通过多队列的方式来管理资源。每个队列可以配置一定的资源量(如CPU、内存等),并可以嵌套子队列以形成层次结构。 - 容量保证:
管理员可以为每个队列设置资源的最低保证(Minimum Guarantee)和资源使用上限(Maximum Limit)。这可以确保每个队列在资源紧张时仍能获得一定的资源份额,同时防止单个队列占用过多的资源。 - 灵活性:
当一个队列的资源有剩余时,Capacity Scheduler可以将这些资源暂时共享给其他需要资源的队列。一旦该队列有新的作业提交,被借用的资源将归还给原队列。 - 多租户支持:
Capacity Scheduler支持多用户共享集群和多应用程序同时运行。为了防止单个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。 - 优先级调度:
Capacity Scheduler支持根据作业的优先级进行调度。默认情况下,它会按照作业的优先级和提交时间顺序来分配资源。 - 资源隔离:
通过配置不同的队列和子队列,Capacity Scheduler可以实现资源的有效隔离,确保不同用户或作业类型之间的资源使用互不影响。 - 适用场景:
Capacity Scheduler适用于需要多用户共享集群资源、对资源有严格隔离要求的场景。例如,在大型企业或云计算环境中,可以使用Capacity Scheduler来管理不同用户或租户的作业和资源。
3. Fair Scheduler(公平调度器)
Fair Scheduler :不需要保留集群的资源,因为它会动态在所有正在运行的作业之间平衡资源 , 当一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当后面有小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
好处: 保证每个任务都有资源可用, 不会有大量的任务等待在资源分配上
弊端: 如果大任务非常的多, 就会导致每个任务获取资源都非常的有限, 也会导致执行时间会拉长
应用: CDH商业版本的hadoop
- 特征详解:
- 多队列管理:
与Capacity Scheduler类似,Fair Scheduler也支持多队列管理。每个队列可以配置一定的资源量,并可以嵌套子队列以形成层次结构。 - 容量保证:
管理员同样可以为每个队列设置资源的最低保证和资源使用上限,以确保每个队列在资源紧张时仍能获得一定的资源份额。 - 公平性:
Fair Scheduler的设计目标是实现资源在时间尺度上的公平分配。它会根据作业的缺额比例(即应获资源和实际获取资源的差距)来优先为缺额大的作业分配资源。 - 灵活的资源分配策略:
Fair Scheduler允许为每个队列单独设置资源分配方式。除了默认的公平策略外,还可以选择FIFO或DRF(Dominant Resource Fairness)等策略。 - 多租户支持:
与Capacity Scheduler一样,Fair Scheduler也支持多用户共享集群和多应用程序同时运行。为了防止单个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。 - 资源抢占:
Fair Scheduler支持资源抢占机制。当一个队列的资源被过度占用时,其他需要资源的队列可以通过抢占机制来获取必要的资源。 - 适用场景:
Fair Scheduler适用于需要实现资源公平分配、对作业执行时间有严格要求的场景。例如,在科研或数据分析领域,可以使用Fair Scheduler来确保不同项目或团队之间的资源使用公平且高效。
六、安全性与容错性
-
Yarn在设计和实现过程中也充分考虑了安全性和容错性。它提供了多种安全机制来保护集群的安全性和数据的完整性,如身份验证、授权、加密通信等。同时,Yarn也提供了容错机制来应对节点故障、任务失败等情况,确保作业的可靠执行。
-
综上所述,Yarn的底层原理实现涉及多个关键组件和复杂的交互过程。它通过ResourceManager、NodeManager和ApplicationMaster等组件的协同工作,实现了集群资源的有效管理和作业的高效调度。同时,Yarn也提供了多种调度算法和安全容错机制来满足不同的需求。