Hadoop YARN 架构


Hadoop YARN代表又一个资源管理器,随着 Hadoop 2.x 的出现,YARN 成为 Hadoop 生态系统的一部分,
YARN 管理集群环境中的资源,在 Hadoop 2.x 之前我们没有任何资源管理器吗?
当然,在 Hadoop 2.x 之前我们有一个资源管理器,它被称为Job Tracker。
  
那么什么是JobTracker?
JobTracker (JT) 用于管理集群资源并执行 MapR 或 MapReduce 作业执行,这意味着数据处理。JT 配置和监控每个正在运行的任务。如果一个任务失败,它会重新分配一个新的槽让任务重新开始。任务完成后,它会释放资源并清理内存。
JT 用于执行很多任务,这种方法也有一些缺点。我没有在 Hadoop 1.x 上工作过,但试图在下面列出其中的一些。
上述方法的缺点:

  1. 它有一个组件:JobTracker 来执行许多活动,如资源管理、作业调度、作业监控、重新调度作业等,这给单个组件带来了很大的压力。
  2. JobTracker 是单点故障,这使得 JT 资源具有高可用性,因此如果 JT 失败,则所有任务都将重新启动。
  3. 静态资源分配,由于 map 和 reduce 槽是预定义和保留的,即使槽处于空闲状态,它们也不能用于其他应用程序。

以上是 Hadoop 1.x 工作方式的一些主要缺点。
所以下一个想到的问题是,YARN 如何解决这个目的?
YARN将资源管理层和数据处理组件层分开。
在 MapR1 中,所有资源管理和处理的任务都是由 JobTracker 完成的,但是随着 Hadoop 2.x 的发布,两个层都被划分了,对于资源管理层,我们有了YARN。现在 Hadoop 2.x 说,数据处理使用 MapR、Spark、Tez 和其他可用的数据处理框架,而 YARN 负责资源协商。
Hadoop 2.x 将 MapR 组件解耦为不同的组件,最终增加了整个生态系统的能力,从而实现了更高的可用性和更高的可扩展性。
 
YARN 及其组件
YARN包含两个组件:资源管理器和节点管理器。
 
资源管理器
Spark 工作在主从架构上,资源管理器存在于主节点上。RM 是主要权威,有助于管理不同作业的资源,例如 RAM、CPU 使用率、网络带宽等。资源管理器维护正在运行的应用程序列表和可用资源列表。
资源管理器有两个组件:调度程序和应用程序管理器。
  • 调度器:

调度器代表资源管理器处理资源分配部分。它根据资源的可用性将资源分配给各种 MapR 或 Spark 应用程序。
调度程序纯粹负责资源分配,不涉及任何其他活动,如监控或跟踪作业状态等。
  • 应用管理者:

Application Manager在从节点中启动特定于应用程序的Application Master。
注意:Application Manager和Application master是不同的组件。
简而言之,当资源管理器接受新的 MapR 或 Spark 应用程序提交时,调度程序所做的初始决定之一是选择一个容器来为该特定应用程序启动 Application Master,应用程序管理器负责启动相同的应用程序。
 
节点管理器
在 Hadoop 2.x 之前,使用固定数量的槽来执行 Map 和 Reduce 作业,但在 Hadoop 2.x 之后槽的概念被资源容器的动态创建/分配所取代。
一个容器是指资源,例如CPU,RAM,磁盘或硬盘,以及网络IO,类似于一个服务器的集合。
一个节点管理器负责保持容器中的每台机器的框架代理,监测他们的资源使用(CPU,内存,磁盘等),并将其报告回调度出现在资源管理器。节点管理器存在于从属系统上。
节点管理器按计划执行资源的健康检查,如果任何健康检查失败,节点管理器会将该节点标记为不健康并将其报告回资源管理器。
资源管理器 + 节点管理器 = 计算框架
 
Application master 
Application master 是特定于应用程序或每个应用程序的,由应用程序管理器启动。
Application Master 从资源管理器协商资源,并与节点管理器一起执行和监控任务。Application Master 负责应用程序的整个生命周期。
Application Master 向资源管理器发送资源请求,并要求容器运行应用程序任务。在收到来自应用程序主机的请求后,资源管理器会验证资源需求并检查资源的可用性,并授予一个容器来满足资源请求。
容器被授予后,应用程序主将请求节点管理器利用资源并启动特定于应用程序的任务。
Application Master 监视应用程序及其任务的进度。如果发生故障,它会请求一个新容器来启动任务并报告故障。
应用程序执行完成后,Application Master 自行关闭并释放其容器。因此标志着执行完成。