【Hadoop Yarn】Hadoop Yarn 概述

简介: 【4月更文挑战第7天】【Hadoop Yarn】Hadoop Yarn 概述

image.png

Hadoop YARN(Yet Another Resource Negotiator)是Hadoop生态系统中的一个关键组件,旨在管理和调度集群中的计算资源。它作为Hadoop 2.x版本中的一个重要改进,取代了之前的MapReduce框架中的资源管理器和作业调度器。YARN的引入使得Hadoop集群可以更灵活地支持不仅仅是MapReduce作业,还可以运行各种其他类型的分布式计算框架,如Apache Spark、Apache Flink等。

YARN的核心功能包括资源管理和作业调度。它允许多个应用程序共享集群资源,并动态分配这些资源以最大化集群的利用率。下面我将详细介绍YARN的工作原理以及其关键组件,并附上一些核心代码片段来说明其实现细节。

YARN 的工作原理

YARN的核心思想是将资源管理和作业调度从MapReduce中分离出来,使得其他计算框架也可以在Hadoop集群上运行。它主要由以下几个组件组成:

  1. ResourceManager(资源管理器):集群中的一个主节点,负责整个集群的资源管理和作业调度。它接收客户端提交的应用程序,并为它们分配资源,监控它们的执行,并在必要时重新分配资源。
  2. NodeManager(节点管理器):运行在每个集群节点上的代理服务,负责监控节点资源的使用情况,并与ResourceManager通信以报告节点的可用资源。它还负责启动和监控容器,容器是运行在节点上的应用程序实例的抽象。
  3. ApplicationMaster(应用程序主管):每个应用程序在集群中启动时,都会有一个对应的ApplicationMaster被分配。ApplicationMaster负责与ResourceManager协商资源,并与NodeManager协调容器的启动、监控和状态报告。

YARN的工作流程可以概括为以下几个步骤:

  1. 客户端提交应用程序到ResourceManager。
  2. ResourceManager为应用程序分配一个唯一的应用程序ID,并为其启动一个对应的ApplicationMaster。
  3. ApplicationMaster向ResourceManager请求资源,并监控资源的分配和使用情况。
  4. ResourceManager根据集群的资源状况为应用程序分配容器。
  5. ApplicationMaster收到容器分配后,在对应的NodeManager上启动容器,并与容器进行通信。
  6. 应用程序在容器中运行,并将状态信息报告给ApplicationMaster。
  7. 当应用程序完成或失败时,ApplicationMaster通知ResourceManager释放已分配的资源。

YARN 核心代码片段

接下来,让我们看一些关键的Java代码片段,以更深入地了解YARN的实现细节。这些代码片段将包括ResourceManager、NodeManager的关键部分。

ResourceManager:

// ResourceManager.java

public class ResourceManager {
   
   
    public static void main(String[] args) {
   
   
        // 初始化ResourceManager
        ResourceManager resourceManager = new ResourceManager();
        // 启动ResourceManager
        resourceManager.start();
    }

    public void start() {
   
   
        // 初始化集群资源
        ClusterResources clusterResources = initializeClusterResources();

        // 启动RPC服务,监听客户端请求
        RPCServer rpcServer = new RPCServer();
        rpcServer.start();

        // 不断循环,处理客户端请求
        while (true) {
   
   
            // 接收客户端请求
            ClientRequest clientRequest = rpcServer.receiveRequest();
            // 根据请求类型分配资源
            if (clientRequest.getType() == RequestType.SUBMIT_APPLICATION) {
   
   
                Application application = clientRequest.getApplication();
                allocateResources(clusterResources, application);
            } else if (clientRequest.getType() == RequestType.RELEASE_RESOURCES) {
   
   
                ApplicationID applicationID = clientRequest.getApplicationID();
                releaseResources(clusterResources, applicationID);
            }
        }
    }

    private ClusterResources initializeClusterResources() {
   
   
        // 初始化集群资源信息,如节点数量、可用内存、可用CPU等
        // 返回集群资源对象
    }

    private void allocateResources(ClusterResources clusterResources, Application application) {
   
   
        // 根据应用程序的资源需求,为其分配合适的节点和资源容器
        // 更新集群资源信息
    }

    private void releaseResources(ClusterResources clusterResources, ApplicationID applicationID) {
   
   
        // 释放应用程序占用的资源容器
        // 更新集群资源信息
    }
}

NodeManager:

// NodeManager.java

public class NodeManager {
   
   
    public static void main(String[] args) {
   
   
        // 初始化NodeManager
        NodeManager nodeManager = new NodeManager();
        // 启动NodeManager
        nodeManager.start();
    }

    public void start() {
   
   
        // 获取节点资源信息,如内存、CPU等
        NodeResources nodeResources = getNodeResources();

        // 启动RPC服务,监听ResourceManager和ApplicationMaster的请求
        RPCServer rpcServer = new RPCServer();
        rpcServer.start();

        // 不断循环,处理请求
        while (true) {
   
   
            // 接收请求
            Request request = rpcServer.receiveRequest();
            // 根据请求类型处理请求
            if (request.getType() == RequestType.START_CONTAINER) {
   
   
                Container container = request.getContainer();
                startContainer(container);
            } else if (request.getType() == RequestType.STOP_CONTAINER) {
   
   
                ContainerID containerID = request.getContainerID();
                stopContainer(containerID);
            }
        }
    }

    private NodeResources getNodeResources() {
   
   
        // 获取节点资源信息,如内存、CPU等
        // 返回节点资源对象
    }

    private void startContainer(Container container) {
   
   
        // 在节点上启动容器
    }

    private void stopContainer(ContainerID containerID) {
   
   
        // 停止指定ID的容器
    }
}
相关文章
|
1月前
|
存储 分布式计算 资源调度
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(一)
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(一)
76 5
|
1月前
|
资源调度 数据可视化 大数据
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(二)
大数据-04-Hadoop集群 集群群起 NameNode/DataNode启动 3台公网云 ResourceManager Yarn HDFS 集群启动 UI可视化查看 YarnUI(二)
36 4
|
1月前
|
XML 分布式计算 资源调度
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(一)
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(一)
155 5
|
1月前
|
XML 资源调度 网络协议
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(二)
大数据-02-Hadoop集群 XML配置 超详细 core-site.xml hdfs-site.xml 3节点云服务器 2C4G HDFS Yarn MapRedece(二)
92 4
|
1月前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
77 4
|
2月前
|
资源调度 分布式计算 Hadoop
YARN(Hadoop操作系统)的架构
本文详细解释了YARN(Hadoop操作系统)的架构,包括其主要组件如ResourceManager、NodeManager和ApplicationMaster的作用以及它们如何协同工作来管理Hadoop集群中的资源和调度作业。
134 3
YARN(Hadoop操作系统)的架构
|
2月前
|
资源调度 分布式计算 Hadoop
使用YARN命令管理Hadoop作业
本文介绍了如何使用YARN命令来管理Hadoop作业,包括查看作业列表、检查作业状态、杀死作业、获取作业日志以及检查节点和队列状态等操作。
54 1
使用YARN命令管理Hadoop作业
|
2月前
|
分布式计算 资源调度 Hadoop
Hadoop YARN资源管理-容量调度器(Yahoo!的Capacity Scheduler)
详细讲解了Hadoop YARN资源管理中的容量调度器(Yahoo!的Capacity Scheduler),包括队列和子队列的概念、Apache Hadoop的容量调度器默认队列、队列的命名规则、分层队列、容量保证、队列弹性、容量调度器的元素、集群如何分配资源、限制用户容量、限制应用程序数量、抢占申请、启用容量调度器以及队列状态管理等方面的内容。
81 3
|
2月前
|
分布式计算 资源调度 Hadoop
Hadoop YARN资源管理-公平调度器(Fackbook的Fair Scheduler)
详细介绍了Hadoop YARN资源管理中的公平调度器(Fair Scheduler),包括其概述、配置、队列结构、以及如何将作业提交到指定队列,展示了公平调度器如何通过分配文件(fair-scheduler.xml)来控制资源分配,并提供了配置示例和如何通过命令行提交作业到特定队列的方法。
152 0
Hadoop YARN资源管理-公平调度器(Fackbook的Fair Scheduler)
|
3月前
|
图形学 数据可视化 开发者
超实用Unity Shader Graph教程:从零开始打造令人惊叹的游戏视觉特效,让你的作品瞬间高大上,附带示例代码与详细步骤解析!
【8月更文挑战第31天】Unity Shader Graph 是 Unity 引擎中的强大工具,通过可视化编程帮助开发者轻松创建复杂且炫酷的视觉效果。本文将指导你使用 Shader Graph 实现三种效果:彩虹色渐变着色器、动态光效和水波纹效果。首先确保安装最新版 Unity 并启用 Shader Graph。创建新材质和着色器图谱后,利用节点库中的预定义节点,在编辑区连接节点定义着色器行为。
253 0

相关实验场景

更多