Yarn 【分布式资源管理框架】
Yarn 的引入
在 MapReduce 应用程序的启动过程中,最重要的就是要把 MapReduce 程序分发到大数据集群的服务器上,然而随着大数据技术的发展,各种新的计算框架不断出现,我们不可能为每一种计算框架部署一个服务器集群,而且就算能部署新集群,数据还是在原来集群的 HDFS 上。
所以我们需要把 MapReduce 的资源管理和计算框架分开,这也是 Hadoop 2 最主要的变化,就是将 Yarn 从 MapReduce 中分离出来,成为一个独立的资源调度框架。
YARN(Yet Another Resource Negotiator)核心思想:将资源管理和任务的监控和调度分离
Yarn 的核心组件:
资源管理器(ResourceManager)
ResourceManager的功能:
处理客户端请求
监控NodeManager
启动和监控ApplicationMaster,进行必要的重启
负责整个集群的资源调度管理,通常部署在独立的服务器上。
资源管理器包括两个主要组件:
一个是资源调度器(ResourceScheduler),
ResourceScheduler 其实就是一个资源分配算法,根据应用程序(Client)提交的资源申请和当前服务器集群的资源状况进行资源分配。
一个是应用程序管理器(ApplicationManager),
负责接受Client端传输的job请求。
节点管理器(NodeManager)
NodeManager 进程负责具体服务器上的资源和任务管理,在集群的每一台计算服务器上都会启动,基本上跟 HDFS 的 DataNode 进程一起出现。
定时向 ResourceManager 汇报本节点上的资源使用情况和各个Container的运行情况。
接收和处理来自 ResourceManager 的 Container 启动和停止的各种命令。
处理来自 ApplicationMaster 的指令,比如启动 MapTask 和 ReduceTask 指令。
ApplicationMaster
每个应用程序对应一个ApplicationMaster,负责单个应用程序的管理
负责数据切片
为应用程序向 ResourceManager 申请资源(Container),并分配内部任务(MapTask和ReduceTask)
与NodeManager通信来启动/停止任务(Task都是运行在 Container 中的)
负责任务的监控和容错,当某些Task运行出错,进行容错处理
Container
Yarn 进行资源分配的单位是容器(Container),每个容器包含了一定量的内存、CPU 等计算资源,默认配置下,每个容器包含一个 CPU 核心。
容器由 NodeManager 进程启动和管理,NodeManger 进程会监控本节点上容器的运行状况并向 ResourceManger 进程汇报。
Yarn 执行流程
(1)提交作业(Submit Job):
用户或应用程序通过客户端(Client)提交作业,并申请一个 jobID。这个作业包含了执行所需的所有信息,比如 JAR 包、配置信息和分片信息等。
(2)上传资源到 HDFS(Upload Resources to HDFS):
客户端将运行作业所需的资源(如 JAR 包、配置信息等)上传到 HDFS(Hadoop Distributed File System)上的一个特定路径。
(3)创建 ApplicationMaster(Create ApplicationMaster):
客户端在上传资源后,创建一个 ApplicationMaster 的实例,ApplicationMaster 是作业管理的守护进程,负责协调整个作业的执行。
(4)向 ResourceManager 发送请求(Send Request to ResourceManager):
客户端向 ResourceManager 发送执行作业的请求,并提供 HDFS 上传资源的路径。ResourceManager 是 YARN 中负责资源管理和作业调度的组件。
(5)ResourceManager 返回作业ID(ResourceManager Returns JobID):
ResourceManager 处理客户端的请求,并返回一个作业ID。同时,它将资源路径返回给客户端。
调度器分配资源(Scheduler Allocates Resources):
ResourceManager 将请求转发到调度器(Scheduler),调度器根据资源请求和集群状态,决定分配给作业的资源。
(6)开辟资源(Container):
一旦调度器决定了资源分配,它会通知 NodeManager 开辟资源(Container)。Container 是 YARN 中的一个概念,它提供了作业执行所需的资源环境。
(7)ApplicationMaster 获取文件(ApplicationMaster Retrieves Files):
ApplicationMaster 从 HDFS 上获取提交的文件和资源。
(8)ApplicationMaster 创建 MapTask 和 ReduceTask(Create Map and Reduce Tasks):
ApplicationMaster 根据作业的需求和 HDFS 上的数据切片信息(InputSplit),创建 MapTask 和 ReduceTask。
(9)通知 NodeManager 启动任务(Notify NodeManager to Start Tasks):
ApplicationMaster 通知 NodeManager 启动 MapTask 和 ReduceTask。
(10)NodeManager 启动任务(NodeManager Starts Tasks):
NodeManager 在 Container 中启动 MapTask 和 ReduceTask。
(11)MapTask 和 ReduceTask 接受数据(Tasks Accept Data):
MapTask 和 ReduceTask 接受共享文件数据,开始执行任务。
(12)任务执行(Task Execution):
MapTask 读取输入数据,处理后输出结果。ReduceTask 接收来自 MapTask 的输出,并进行进一步的处理。
(13)任务完成(Task Completion):
当所有任务完成后,ApplicationMaster 会向 ResourceManager 请求释放资源,并最终完成整个作业。
Yarn 资源调度器
先进先出调度器(FIFO)(First In, First Out) 【单队列的先进先出】
按照任务到达的顺序来分配资源,不考虑任务的优先级或其他属性
FIFO 调度器将所有的任务放入一个队列中。这个队列遵循先入先出的原则,即最先进入队列的任务将最先被处理
FIFO 调度器不考虑任务的紧急性或重要性,因此可能不适合需要优先处理某些任务的场景
容器调度器(Capacity Scheduler) 【预定义的分层多队列】
容量调度器是一种较为传统的调度策略,它提供了一种分层队列的资源管理方式,允许管理员预定义队列结构并为每个队列分配资源容量。
Capacity Scheduler 支持队列间的资源隔离,并且可以为不同的队列设置不同的调度策略,如 FIFO、Fair 或者其他自定义策略。
这种策略的优点在于能够保证长期运行的任务获得稳定的资源供应,但缺点是在资源紧张时可能会限制新任务的执行。
公平调度器(Fair Scheduler) 【动态调整】
不需要事先配置队列容量,而是根据应用程序的需求和资源的可用性来动态分配资源
适用于多个小型作业或用户数量较多的场景