Apache Hadoop Yarn,全称为:Yet Another Resource Negotiator。是 Apache Hadoop 生态中的一个子项目,用于资源管理和作业调度。Hadoop 是一个用于处理大规模数据的开源框架,而 Yarn 则负责在 Hadoop 集群中管理资源以及协调作业的执行。
一、Yarn 的由来
Yarn 的主要目标是将资源管理和作业调度功能从 MapReduce 中分离出来,使 Hadoop 能够更好地支持多样化的计算模式和应用。Yarn 的架构允许多个应用程序共享集群资源,同时提供更灵活的资源管理策略。
二、Yarn 的组成
每个应用的 Application Master 其实就是一个特定框架的库,它是由 Resource Manager 来进行资源协调,并且使用 NodeManager 来执行和监控任务。

1. Resource Manager
2. Node Manager
3. Application Master
4. Container
通过这些组件的协作,Yarn 实现了资源的高效分配和作业的灵活调度,使得 Hadoop 集群能够同时支持多种类型的应用程序和计算模式。
三、任务提交到 Yarn 的流程

client 向 RM(Resource manager) 发起请求,RM 将提交的作业封装成 Task,并为 client 返回一个 JOB ID 和资源上传的路径。此时 JOB 的状态为:NEW。 client 继续将任务所需的依赖和配置文件提交给 RM 指定的资源路径,RM 会将这些信息保存下来。此时 JOB 的状态为:SUBMIT。 client 提交完资源后,会向 RM 申请运行 Application Master。 RM 收到请求后,将作业信息提交给 Scheduler 来调度,Scheduler 会检查 Application Master 对应的队列是否有足够的资源。此时 JOB 的状态为:ACCEPT。 某个 NM 分配到任务后,RM 为 AM(Application Master) 创建运行所需的 Container,并启动 AM。此时 JOB 的状态为:RUNNING。 AM 启动后,会向 RM 申请资源,并对任务进行监控。如果任务正常结束,状态为:FINISHED,如果运行失败,状态为:FAILED,如果用户手动终止任务,状态为:KILLED。
四、Yarn 调度器类型
1. FIFO
特点
FIFO(First-In-First-Out)调度器是最简单的调度器,它按照作业提交的顺序进行调度,先提交的作业会被优先处理,不考虑作业的资源需求或优先级。适用场景
适用于非常简单的环境,其中没有特定的资源分配要求,或者只有一个应用程序在使用集群资源。
2. Capacity Scheduler
特点
容量调度器允许多个作业队列共享集群资源,并为每个队列分配一定的资源容量。队列之间可以根据需求和优先级进行资源分配。Apache 版本 Yarn 默认使用的是 Capacity 调度器。适用场景
适用于多个用户或多个应用程序共享集群的情况,可以根据业务需求为不同队列分配不同的资源份额。
3. Fair Scheduler
特点
公平调度器通过使用公平分配策略,根据作业的资源需求和优先级来分配资源。它努力确保每个应用程序获得公平的共享资源,不管作业提交的顺序如何。适用场景
适用于多个用户或应用程序需要公平竞争资源的情况,可以避免某个应用程序长时间占用大量资源。
每种调度器都有其适用的场景和优缺点,选择合适的调度器取决于集群的需求和使用情况。在实际应用中,可以根据资源需求、优先级和公平性要求来决定使用哪种调度器,以最优化地管理集群资源。
五、Yarn 资源管理
资源调度
ResourceManager 将某个 NodeManager 上资源分配给任务。资源隔离
NodeManager 按照要求为任务提供相应的资源,甚至保证这些资源应具有独占性,为任务运行提供基础的保证。
Hadoop Yarn 同时支持 memory 和 cpu 两种资源的调度。
memory的多少会决定任务的生死,如果内存不够,任务可能会运行失败。cpu的多少只会决定任务运行的快慢。
1. Memory 资源
# 该节点上 Yarn 可使用的物理内存总量,默认是8192(MB),如果设置为-1,并且yarn.nodemanager.resource.detect-hardware-capabilities 为true时,将会自动计算操作系统内存进行设置。
yarn.nodemanager.resource.memory-mb
# 任务每使用 1MB 物理内存,最多可使用虚拟内存量,默认是2.1
yarn.nodemanager.vmem-pmem-ratio
# 是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
yarn.nodemanager.pmem-check-enabled
# 是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
yarn.nodemanager.vmem-check-enabled
# 单个任务可申请的最少物理内存量,默认是 1024(MB),如果一个任务申请的物理内存量少于该值,则该对应的值改为这个数。
yarn.scheduler.minimum-allocation-mb
# 单个任务可申请的最多物理内存量,默认是8192(MB)
yarn.scheduler.maximum-allocation-mb
2. CPU 资源
# 该节点上 Yarn 可使用的虚拟 CPU 个数,默认是8,注意,目前推荐将该值设值为与物理 CPU 核数数目相同。如果你的节点 CPU 核数不够8个,则需要调减小这个值。如果设置为-1,并且yarn.nodemanager.resource.detect-hardware-capabilities为true时,将会自动计算操作系统CPU 核数进行设置。
yarn.nodemanager.resource.cpu-vcores
# 单个任务可申请的最小虚拟 CPU 个数,默认是1,如果一个任务申请的 CPU 个数少于该数,则该对应的值改为这个数。
yarn.scheduler.minimum-allocation-vcores
# 单个任务可申请的最多虚拟CPU个数,默认是4。
yarn.scheduler.maximum-allocation-vcores
六、Yarn 核心参数
1. RM 核心参数
# 设置 Yarn 的调度器
yarn.resourcemanager.scheduler.class
# RM 处理调度器请求的线程数量,默认50,如果 Yarn 运行任务比较多,可以适当将值调大。
yarn.resourcemanager.scheduler.client.thread-count
2. NM 核心参数
# 是否让 Yarn 自己检测硬件进行配置,默认 false,如果设为 true,就会自动检测 NodeManager 所在机器的 memory 和 cpu。
yarn.nodemanager.resource.detect-hardware-capabilities
# 此参数,仅当上述参数为 true 和参数为 -1 时,设置才生效
yarn.nodemanager.resource.system-reserved-memory-mb
# 是否将虚拟核数当作 cpu 核数,默认为 false。
yarn.nodemanager.resource.count-logical-processors-as-cores
# 虚拟核数和物理核数乘数,例如:4核8线程,该参数就应设为2,默认1.0。
yarn.nodemanager.resource.pcores-vcores-multiplier
# NodeManager 使用内存,默认8G
yarn.nodemanager.resource.memory-mb
# NodeManager 使用 cpu 核数,默认8个
yarn.nodemanager.resource.cpu-vcores
# 是否开启物理内存检查限制,默认为 true。
yarn.nodemanager.pmem-check-enabled
# 是否开启虚拟内存检查限制,默认为 true。
yarn.nodemanager.vmem-check-enabled
# 虚拟内存物理内存比例,默认2.1
yarn.nodemanager.vmem-pmem-ratio
3. Contanier 核心参数
# 单个任务可申请的最少物理内存量,默认是1024(MB),如果一个任务申请的物理内存量少于该值,则该对应的值改为这个数。
yarn.scheduler.minimum-allocation-mb
# 单个任务可申请的最多物理内存量,默认是8192(MB)
yarn.scheduler.maximum-allocation-mb
# 单个任务可申请的最小虚拟 cpu 个数,默认是1,如果一个任务申请的 cpu 个数少于该数,则该对应的值改为这个数。
yarn.scheduler.minimum-allocation-vcores
# 单个任务可申请的最多虚拟 cpu 个数,默认是4。
yarn.scheduler.maximum-allocation-vcores