0010 - YARN入门指南

网友投稿 265 2022-11-22

0010 - YARN入门指南

1 - YARN简介

Apache YARN(Yet Another Resource Negotiator)是 Hadoop-2.x 版本提出的一个全新的分布式资源调度引擎。最初是为了解决 MapReduce 的诸多问题,虽说 YARN 提供的是通用的资源管理框架,但 MapReduce 依然是运行在它之上的标准应用。这种运行在 YARN 上的 MapReduce 被称为是 V2 版本(简称:MR2) 。

2 - YARN架构演进

图片来自《Hadoop: The Definitive Guide》

随着分布式系统集群的规模和其工作负载的增长,MapReduce V1 架构主要暴露的问题如下:

可靠性差。 JobTracker 存在单节点故障; 扩展性差。 JobTracker 同时兼备资源管理和作业控制两大功能,且最多管理 4000 节点数; 资源利用率低。 MRv1 采用基于槽位的资源分配模型,且 MapTask 和 ReduceTask 之间不能共享资源,只能运行其中一个; 源代码逻辑复杂。 当框架更改时,客户端强制同步更新; 无法支持多种计算框架。

Hadoop-2.x 版本之后,其架构发生了如下变化:
版本 运行时环境 数据处理引擎
MRv1 JobTracker/TaskTracker MapTask/ReduceTask
MRv2 YARN(ResourceManager/NodeManager)和 MRAppMaster MapTask/ReduceTask

3 - YARN架构设计

3.1 - ResourceManager(RM)

ResourceManager 是一个全局的资源管理器,负责整个 Hadoop 集群中所有资源的管理和分配。包括:

处理客户端请求,接收来自各个节点(NodeManager)的资源汇报信息; 根据应用程序优先级、队列容量、ACLs、数据位置等信息,做出决策; 以共享的、安全的、多租户的方式制定分配策略,调度集群资源。

它主要由两个组件构成:

Scheduler(调度器) - 根据集群的容量、队列等限制条件将系统中的资源分配给各个正在运行的应用程序。 ApplicationsManager(应用程序管理器) - 负责管理整个集群中所有的 Job 应用程序,包括 Job 应用程序提交、与调度器协商资源、启动和监控 ApplicationMaster 运行状态,并在任务失败时重新启动任务等。

3.2 - NodeManager(NM)

NodeManager 是运行在 YARN 集群中的每个节点上的管理者,与 HDFS 分布式文件系统中 DataNode 的角色类似。主要负责该节点内所有 Container 的生命周期管理,监控每个 Container 的资源(CPU、内存、磁盘、网络)使用情况,追踪节点健康状况。

具体如下:

启动时向 ResourceManager 注册并定时发送心跳信息,等待 ResourceManager 的指令; 管理本节点上 Container 的生命周期和资源使用情况; 接收并处理来自 ApplicationMaster 的 Container 启动、停止等请求; 管理任务运行时的相关依赖,在 Container 启动之前将需要的程序及其依赖拷贝到本地。

3.3 - ApplicationMaster(AM)

ApplicationMaster 就像一个全职保姆,负责一个 Application 生命周期内的所有工作。

例如:当用户提交一个应用程序时,YARN 会先启动一个 ApplicationMaster 进程;然后向 ResourceManager 申请资源,并通过 NodeManager 监控 Container 内资源的使用情况;最后,跟踪监控任务的执行状态。

当任务执行失败时,重新为其申请资源以重启任务; 当任务执行完成后,ApplicationMaster 会自动关闭并释放 Container。

3.4 - Container

Container 是 YARN 中最底层的计算单元,也是执行计算任务的基本单位。它封装了某个节点上的多维度资源(CPU 和内存),例如:MapTask、ReduceTask 都在 Container 中执行。

在 YARN 中,当 ApplicationMaster 向 ResourceManager 申请系统资源时,ResourceManager 为 ApplicationMaster 返回的资源便是使用 Containers 表示。

YARN 会为每个任务分配一个 Container,且该任务只能使用该 Container 中描述的资源。任何一个 Job 或 Application 最终都是在一个或多个 Container 中完成分析计算任务的。

4 - YARN工作机制

对上图过程的 8 个步骤如下:-(1)Client 向 YARN 中提交一个应用程序,其中包括用户程序、启动 ApplicationMaster 命令等;-(2)ResourceManager 的 ApplicationManager 为该应用程序分配第一个 Container,并与对应的 NodeManager 通信,要求在 Container 中启动应用程序的 ApplicationMaster;-(3)ApplicationMaster 向 ResourceManager 注册后,为各个应用程序申请所需的系统资源,并监控它们的运行状态,直到结束;-(4)ApplicationMaster 采用轮询的方式,通过 RPC 协议向 ApplicationManager 申请资源,Scheduler 将资源封装好后发送给 ApplicationMaster;-(5)ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求它启动 Container,执行 MapTask 或 ReduceTask 等具体任务;-(6)NodeManager 为任务设置好运行环境(环境变量、JAR 文件、二进制程序等)后,将任务启动命令写到脚本中,并通过运行该脚本启动任务;-(7)各个任务通过 RPC 协议向 ApplicationMaster 汇报其状态和进度,并在任务失败时重新启动任务;-(8)在应用程序运行完成后,ApplicationMaster 向 ApplicationManager 注销并关闭自己。

5 - YARN应用提交流程

图片来自《Hadoop: The Definitive Guide》

5.1 - 作业的提交

Client 调用 job.waitForCompletion() 方法创建一个内部的 JobSummiter 实例,提交 MapReduce 作业(第 1 步)。通过 waitForCompletion() 每秒循环轮询作业的进度,如果发现与上次报告有改变,则把进度报告到控制台。

JobSummiter 向 ResourceManager 请求一个新应用 ID(第 2 步)。ResourceManager 检查作业的输出说明、计算作业的输入分片。将运行作业所需的资源(包括作业 JAR 文件、配置文件和输入分片)复制到一个以作业 ID 命名的 HDFS 共享目录中(第 3 步)。最后,通过调用 submitApplication() 方法提交作业到 ResourceManager(第 4 步)。

5.2 - 作业的初始化

当 ResourceManager 收到 submitApplication() 消息后,便将该请求发送给 YARN 的调度器(Scheduler)。调度器为其分配一个容器(Container),然后 ResourceManager 在 NodeManager 的管理下,在容器中启动 ApplicationMaster 的进程(第 5a 和 5b 步)。

MapReduce 作业的 ApplicationMaster 是一个主类为 MRAppMaster 的 Java 应用程序。ApplicationMaster 对作业的初始化是通过创建多个 bookkeeping 对象来监控作业的进度,得到任务的进度和完成报告(第 6 步)。然后通过分布式文件系统(如:HDFS)得到由客户端计算的输入分片(第 7 步),然后为每个分片创建一个 MapTask,根据 mapreduce.job.reduces 创建 ReduceTask 对象,同时分配任务 ID。

5.3 - 任务的分配

如果作业很小(小于 10 个 Mapper 且只有 1 个 Reducer 且输入大小小于一个 HDFS 块的作业),ApplicationMaster 会选择在其自己的 JVM 中运行任务。

如果不是小作业,那么 ApplicationMaster 向 ResourceManager 请求更多的 Container 资源来运行所有的 MapTask 和 ReduceTask(第 8 步)。这些请求是通过心跳来传输的,包括每个 MapTask 的数据位置。例如:存放输入分片的主机名和机架(Rack),调度器利用这些信息来调度任务,尽量将任务分配给存储数据的节点,或者分配给和存放输入分片的节点相同机架的节点。

默认情况下,每个 Mapper 和 Reducer 都会分配到 1024 MB 内存和 1 个虚拟内核。只有 MapTask 完成 5% 时(mapreduce.job.reduce.slowstart.completedmaps,默认 0.05),ReduceTask 才会开始运行,以减少 ReduceTask 的等待时间。

分别通过以下 4 个参数来设置 CPU 和内存:

mapreduce.map.memory.mb mapreduce.reduce.memory.mb mapreduce.map.cpu.vcores mapreduce.reduce.cpu.vcores

5.4 - 任务的执行

当一个任务由 ResourceManager 的调度器分配给一个 Container 后,ApplicationMaster 通过与 NodeManager 通信来启动 Container(第 9a 和 9b 步)。该任务由一个主类为 YarnChild 的 Java 应用程序执行(在指定的 JVM 中运行)。在运行任务之前首先将任务需要的资源本地化,例如:作业的配置、JAR 文件以及来自分布式缓存的所有文件(第 10 步)。最后,运行 MapTask 或 ReduceTask(第 11 步)。

5.5 - 进度和状态的更新

MapReduce 作业是长时间(从数秒到数小时)运行的批量作业。因此,在作业运行期间,客户端每秒轮询一次 ApplicationMaster 以接收最新状态(轮询间隔通过 mapreduce.client.progressmonitor.pollinterval 设置,以毫秒为单位)。客户端也可以使用 Job 的 getStatus() 方法得到一个 JobStatus 的实例。例如:作业或任务的状态(运行中、成功完成、失败)、MapTask 和 ReduceTask 的进度、作业计数器的值、状态消息或描述等实时信息(第 12 步)。

5.6 - 作业的完成

除了向 ApplicationMaster 请求作业进度外,客户端每 5 分钟(通过 mapreduce.client.completion.pollinterval 设置,以毫秒为单位)通过调用 waitForCompletion() 来检查作业是否完成。当作业完成后,状态自动设置为 “SUCCEEDED”,同时调用 OutputCommiter 的 commitJob() 方法清理 ApplicationMaster 和 Container 其工作状态。作业信息由 JobHistory 存储以便日后需要时可以查询。

6 - YARN应用实例

以提交一个 Hadoop Examples 中计算 Pi 的 MapReduce 程序为例。

提交格式示例:

hadoop jar jar包路径 主类名称 主类参数

6.1 - Apache Hadoop 版本

Hadoop 安装目录的 share/hadoop/mapreduce 目录下:

# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.10.1.jar pi 2 3

6.2 - CDH Hadoop 版本

# hadoop jar /opt/cloudera/parcels/CDH/jars/hadoop-examples.jar pi -D mapreduce.job.queuename=root.B 2 3 # 或者如下: # hadoop jar /opt/cloudera/parcels/CDH/jars/hadoop-mapreduce-examples-2.6.0-cdh5.14.2.jar pi -D mapreduce.job.queuename=root.B 2 3

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:hadoop加载fs.hdfs.impl
下一篇:带你认知主板上的主要芯片
相关文章

 发表评论

暂时没有评论,来抢沙发吧~