【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的容器
    }
}
相关文章
|
7天前
|
资源调度 分布式计算 Hadoop
Hadoop YARN 的作用
【8月更文挑战第12天】
22 4
|
1月前
|
分布式计算 资源调度 Hadoop
Hadoop配置文件yarn-site.xml
【7月更文挑战第18天】
36 3
|
1月前
|
分布式计算 资源调度 Hadoop
Hadoop配置文件yarn-env.sh
【7月更文挑战第18天】
31 1
|
3月前
|
资源调度 分布式计算 Hadoop
Hadoop Yarn 核心调优参数
这是一个关于测试集群环境的配置说明,包括3台服务器(master, slave1, slave2)运行CentOS 7.5,每台有4核CPU和4GB内存。集群使用Hadoop 3.1.3,JDK1.8。Yarn核心配置涉及调度器选择、ResourceManager线程数、节点检测、逻辑处理器使用、核心转换乘数、NodeManager内存和CPU设置,以及容器的内存和CPU限制。配置完成后,需要重启Hadoop并检查yarn配置。
|
3月前
|
SQL 分布式计算 资源调度
Hadoop Yarn 配置多队列的容量调度器
配置Hadoop多队列容量调度器,编辑`capacity-scheduler.xml`,新增`hive`队列,`default`队列占总内存40%,最大60%;`hive`队列占60%,最大80%。配置包括队列容量、用户权限和应用生存时间等,配置后使用`yarn rmadmin -refreshQueues`刷新队列,无需重启集群。多队列配置可在Yarn WEB界面查看。
|
2月前
|
资源调度 分布式计算 Hadoop
实时计算 Flink版产品使用问题之yarn session模式中启动的任务链接是http IP,想把IP映射为主机hadoop,该怎么操作
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
分布式计算 资源调度 Hadoop
Hadoop【基础知识 03+04】【Hadoop集群资源管理器yarn】(图片来源于网络)(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
【4月更文挑战第5天】Hadoop【基础知识 03】【Hadoop集群资源管理器yarn】(图片来源于网络)Hadoop【基础知识 04】【HDFS常用shell命令】(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
102 9
|
3月前
|
分布式计算 资源调度 Hadoop
Hadoop【基础知识 03】【Hadoop集群资源管理器yarn】(图片来源于网络)
【4月更文挑战第4天】Hadoop【基础知识 03】【Hadoop集群资源管理器yarn】(图片来源于网络)
57 4
|
11月前
|
分布式计算 资源调度 监控
Hadoop学习笔记(四)之YARN
Hadoop学习笔记(四)之YARN
|
3月前
|
分布式计算 资源调度 Hadoop
Hadoop【环境搭建 02】【hadoop-3.1.3 单机版YARN】(配置、启动及验证)
Hadoop【环境搭建 02】【hadoop-3.1.3 单机版YARN】(配置、启动及验证)
44 0

相关实验场景

更多