Hadoop Yarn 提交流程、资源管理及核心参数

Apache Hadoop Yarn,全称为:Yet Another Resource Negotiator。是 Apache Hadoop 生态中的一个子项目,用于资源管理和作业调度。Hadoop 是一个用于处理大规模数据的开源框架,而 Yarn 则负责在 Hadoop 集群中管理资源以及协调作业的执行。

一、Yarn 的由来

在早期版本的 Hadoop 中,资源管理和作业调度是由一个称为 MapReduce 的组件来处理的。然而,随着 Hadoop 的发展和不断增长的应用需求,MapReduce 的限制变得显而易见,它不能很好地支持多种类型的计算模式,如批处理、交互式查询、流处理等,这导致了 Yarn 的引入。

Yarn 的主要目标是将资源管理和作业调度功能从 MapReduce 中分离出来,使 Hadoop 能够更好地支持多样化的计算模式和应用。Yarn 的架构允许多个应用程序共享集群资源,同时提供更灵活的资源管理策略。

二、Yarn 的组成

Yarn 的基本思想是将资源管理和作业调度/监控的功能分解为独立的守护进程。核心思想是拥有一个全局的资源管理器(RM)和每个应用程序的应用程序管理器(AM)。一个应用程序可以是单个作业,也可以是作业的有向无环图(DAG)。

每个应用的 Application Master 其实就是一个特定框架的库,它是由 Resource Manager 来进行资源协调,并且使用 NodeManager 来执行和监控任务。
借用官网的一张图,我们可以看到 Yarn 主要由以下组件构成:

1. Resource Manager

全局资源管理器,负责整个集群中的资源分配和调度。它接收来自应用程序的资源请求,并根据可用资源的情况进行分配。

2. Node Manager

在集群的每个节点上运行,负责监控节点上的资源使用情况,并向 ResourceManager 报告资源的可用性。它还负责启动和监控容器,容器是运行应用程序的隔离环境。

3. Application Master

每个应用程序都有自己的应用程序管理器,负责协调应用程序内的资源请求、任务调度和执行。它与ResourceManager 通信以获取资源,并与 NodeManager 合作监控任务的进度和状态。

4. Container

容器是一个虚拟化的运行环境,用于托管应用程序的任务。每个应用程序的任务都在一个容器中运行,容器提供隔离和资源限制。
通过这些组件的协作,Yarn 实现了资源的高效分配和作业的灵活调度,使得 Hadoop 集群能够同时支持多种类型的应用程序和计算模式。

三、任务提交到 Yarn 的流程

借用网上一张图,觉得画的挺好的。

  1. client 向 RM(Resource manager) 发起请求,RM 将提交的作业封装成 Task,并为 client 返回一个 JOB ID 和资源上传的路径。此时 JOB 的状态为:NEW。
  2. client 继续将任务所需的依赖和配置文件提交给 RM 指定的资源路径,RM 会将这些信息保存下来。此时 JOB 的状态为:SUBMIT。
  3. client 提交完资源后,会向 RM 申请运行 Application Master。
  4. RM 收到请求后,将作业信息提交给 Scheduler 来调度,Scheduler 会检查 Application Master 对应的队列是否有足够的资源。此时 JOB 的状态为:ACCEPT。
  5. 某个 NM 分配到任务后,RM 为 AM(Application Master) 创建运行所需的 Container,并启动 AM。此时 JOB 的状态为:RUNNING。
  6. AM 启动后,会向 RM 申请资源,并对任务进行监控。如果任务正常结束,状态为:FINISHED,如果运行失败,状态为:FAILED,如果用户手动终止任务,状态为:KILLED。

四、Yarn 调度器类型

目前,Yarn 的调度器主要有三种:

1. FIFO

  • 特点
    FIFO(First-In-First-Out)调度器是最简单的调度器,它按照作业提交的顺序进行调度,先提交的作业会被优先处理,不考虑作业的资源需求或优先级。
  • 适用场景
    适用于非常简单的环境,其中没有特定的资源分配要求,或者只有一个应用程序在使用集群资源。

2. Capacity Scheduler

  • 特点
    容量调度器允许多个作业队列共享集群资源,并为每个队列分配一定的资源容量。队列之间可以根据需求和优先级进行资源分配。Apache 版本 Yarn 默认使用的是 Capacity 调度器。
  • 适用场景
    适用于多个用户或多个应用程序共享集群的情况,可以根据业务需求为不同队列分配不同的资源份额。

3. Fair Scheduler

  • 特点
    公平调度器通过使用公平分配策略,根据作业的资源需求和优先级来分配资源。它努力确保每个应用程序获得公平的共享资源,不管作业提交的顺序如何。
  • 适用场景
    适用于多个用户或应用程序需要公平竞争资源的情况,可以避免某个应用程序长时间占用大量资源。
每种调度器都有其适用的场景和优缺点,选择合适的调度器取决于集群的需求和使用情况。在实际应用中,可以根据资源需求、优先级和公平性要求来决定使用哪种调度器,以最优化地管理集群资源。

五、Yarn 资源管理

在 Yarn 中,资源管理由 ResourceManager 和 NodeManager 共同完成,其中,ResourceManager 中的调度器负责资源的分配,而 NodeManager 则负责资源的供给和隔离。
  • 资源调度
    ResourceManager 将某个 NodeManager 上资源分配给任务。
  • 资源隔离
    NodeManager 按照要求为任务提供相应的资源,甚至保证这些资源应具有独占性,为任务运行提供基础的保证。
Hadoop Yarn 同时支持 memory 和 cpu 两种资源的调度。
  • memory 的多少会决定任务的生死,如果内存不够,任务可能会运行失败。
  • cpu 的多少只会决定任务运行的快慢。

1. Memory 资源

Yarn 允许用户配置每个节点上可用的物理内存资源。配置参数主要有:
# 该节点上 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 被称为成虚拟 CPU(CPU virtua* Core),是 Yarn 自己引入的概念,初衷是,考虑到不同节点的 CPU 性能可能不同,每个 CPU 具有的计算能力也是不一样的,比如某个物理 CPU 的计算能力可能是另外一个物理 CPU 的2倍,此时可以通过为第一个物理 CPU 多配置几个虚拟 CPU 弥补这种差异。用户提交作业时,可以指定每个任务需要的虚拟 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 核心参数

针对 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 核心参数

当应用程序提交运行至 Yarn 上时,NM 将会把任务封装在 Container 中运行,以便管理和监控。
# 单个任务可申请的最少物理内存量,默认是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




请使用浏览器的分享功能分享到微信等