6.1 YARN的架构

本文介绍了YARN集群架构,包括资源管理器、节点管理器、ApplicationMaster等核心组件的工作原理及职责,阐述了资源分配和应用执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6.1 YARN的架构

  下图展示了基于YARN的集群的架构,这个集群的模块主要有以下5种类型。

  • 资源管理器(Resource Manager,RM):每个集群里面都有一个RM守护进程,专门负责集群中可用资源的分配和管理。
  • 节点管理器(Node Manager,NM):每个节点都有一个NM守护进程,负责节点的本地资源管理。在RM中,NM代表本地节点。
  • Application Master(AM):每个应用都有一个AM的守护进程,它封装了应用的所有逻辑结构和依赖的库信息。AM负责于RM进行资源协商,并协同NM工作以完成应用的功能。
  • 容器(container):这是分配给具体应用的资源的抽象表现形式。AM是一个用来启动和管理整个应用生命周期的特殊容器。
  • 客户端(client):这是集群中的一个能向RM提交应用的实例,并且指定了执行应用所需要的AM类型。

这里写图片描述

6.1.1 资源管理器

  资源管理器有以下两个主要组件:

  • 调度器(scheduler)
  • 应用管理器(ApplicationsManager)

  调度器负责为集群中执行的各种应用分配资源,而且它执行纯粹的分配资源功能,不会关注应用内部状态相关的任何信息。在应用失败或者硬件故障的时候,调度器不保证能够重启应用。调度是基于RM所了解的集群的全局状态进行的,分配资源的过程中使用了配置的队列和容量参数信息。

  调度的策略可以作为插件参与到调度器中。Hadoop 1.x中,容量调度器(CapacityScheduler)和公平调度器(FairScheduler)是两种很受欢迎的调度策略,它们同样存在于Hadoop 2.x中。

  应用管理器这种组件负责处理客户端提交的应用。另外,它还根据应用的要求和AM协商所需要的容器,并启动应用程序。在应用失败的情况,应用管理器还提供重启AM的服务。

  RM的耦合度是很低的,它使用两个公共接口和一个私有接口与其他组件通信,接口包括:

  • 为客户端提交作业的公共接口(Application-Client Protocol)
  • 为AM请求资源的公共接口(Application-Master Protocol)
  • 与NM交互使用的内部接口

  资源是动态分配的,并且不感知应用的内部状态或者优化措施,这样便可以实现对集群资源的有效利用。AM使用如下参数发送资源申请的请求:

  • 请求的容器的数量,例如,100个容器
  • 每个容器的详细资源规格信息,例如,2个CPU和4GB内存
  • 容器在主机或机架上位置分布的偏好
  • 提出的请求在当前应用中的优先级

  RM的调度器获得请求后,基于心跳信息获得的集群状态为AM分配容器,然后将容器转交给AM。在集群资源不足的情况下,RM可能要求AM归还一些容器。如果等待超过一定时间后依然没有容器释放,RM可以终止容器的运行。RM请求AM释放资源可以看成是警告正在执行的AM保存关键数据和工作状态。

6.1.2 Application Master

  当一个应用被提交时,应用管理器(ApplicationsManager)与调度器协商得到一个容器,这个容器为这个特定的应用启动一个AM。AM生成后,会定期向RM发送心跳信息,以实现下面两个操作:

  • 通知RM这个AM是否处于活动状态
  • 为这个应用申请资源

  在回应心跳信息时,RM分配容器给AM,并且AM可以自由使用这些容器。AM完全负责对容器终止的解释和处理,以及其他应用相关的故障。

  AM使用Application-Master协议与RM进行交互,并且AM直接从NM处获取容器的状态。AM也能通过与NM的交互来启动和停止分配给它的容器。AM与NM之间的交互是通过ContainerManager协议完成的。

  在YARN中,资源管理器使用了延时绑定的模式。容器的产生可能和AM的请求没有关系,而仅仅是与AM给出的一个租约(lease)绑定。AM请求所获得的资源状态可能会随着时间而变化,且申请的资源可用于各种目的而不仅仅是原来计划的用途。

  让我们通过一个虚构的例子,使用MapReduce的AM来展示资源的延时绑定。我们都知道HDFS是在集群的节点之间复制文件的每个块。一个Map任务优先选择在输入数据所在的节点执行。到那个MapReduce的AM请求容器后,它分配一个Map任务到该容器,并且该容器的主机和数据所在的主机是同一台,或离得很近。这个决定仅在AM获得容器后才发生,并且是以一种动态的方式进行的。Hadoop 1.x的JobTracker有一个Web接口(通常是50030端口),由于在Hadoop 2.x中JobTracker已经不存在了,所以这个Web接口也就不可用了。

6.1.3 节点管理器

  NM是每个节点的守护进程,负责本地容器的管理,管理范围从认证到资源监控。它们使用心跳信息向RM汇报状态。容器启动上下文(Container Launch Context,CLC)记录被用于指定容器的配置信息,例如依赖、数据文件路径、环境变量等。NM可以根据CLC中的配置信息启动容器。

  同一AM(AM作为资源的承租人,或者说使用者)的容器间的资源可以共享,另外,只要提供外部资源的URL,也可以下载这些资源及其依赖。NM负责容器的终止操作,依据的是来自AM或RM的请求。如果一个容器超出了它的租约,NM还有权终止这个容器。终止容器的操作包括清理操作,例如删除容器生成的本地数据。

  NM的职责还包括监控本地的物理资源,例如CPU、内存和磁盘的健康状态,并且还将这些状态汇报给RM。RM的调度器会根据NM的负载情况和健康状态做出如何分配容器的决定。

  NM向应用提供日志聚合的服务。标准输出和错误日志会在应用完成的时候输出到HDFS上。NM也能通过配置添加插件式辅助服务(auxiliary service)。例如,一项辅助服务可以让应用的本地数据直到应用结束后才被删除,而不是在容器终止的时候就删除,这对于某些应用场景是很有用的。例如,在MapReduce使用场景下,map任务的输出需要被传输到reducer,这时就可以使用辅助服务来完成。这类服务需要的任何额外配置都可以通过CLC来指定。

6.1.4 YARN客户端

  YARN客户端负责为AM提交合适的CLC。正如之前所说,AM本身也是运行在容器中的,这个容器资源也需要有客户端与RM协商而得到。YARN客户端同时还负责AM的注册,并且可以自由提供其他服务给它的消费者。

<think>嗯,用户问的是如何在Docker环境中部署YARN集群。首先,我需要回忆一下YARN的基本架构和组件。YARN是Hadoop的资源管理框架,主要由ResourceManager和NodeManager组成。所以,在Docker中部署的话,可能需要创建多个容器来模拟这些组件。 用户可能已经了解Docker的基础,但需要具体的步骤和配置。我应该先考虑使用现有的Hadoop镜像,比如官方的Hadoop Docker镜像,或者社区维护的镜像,这样可以节省时间。或者,用户可能希望从头开始构建自定义的镜像,但通常使用现有镜像更高效。 接下来,需要确定集群的结构。通常,一个ResourceManager和多个NodeManager。可能还需要HDFS的支持,因为YARN依赖HDFS存储数据。不过用户的问题只提到YARN,是否需要包括HDFS呢?可能需要明确这一点,但为了简化,可能先部署YARN本身。 然后,网络配置是关键。Docker容器之间需要能够通信,可能需要使用Docker网络或者自定义桥接网络。例如,创建一个自定义网络,让ResourceManager和NodeManager容器加入同一个网络,以便通过主机名互相访问。 另外,配置文件的修改也是重点。YARN的配置文件如yarn-site.xml需要正确设置ResourceManager的地址,NodeManager的监听端口等。这些配置可能需要挂载到容器中,或者在构建镜像时进行调整。 还有环境变量的问题,比如JAVA_HOME,HADOOP_HOME,这些在容器中需要正确设置。可能需要编写Docker Compose文件来管理多个服务,定义各个容器的环境变量、端口映射、依赖关系等。 可能还需要考虑持久化存储,比如将日志或数据目录挂载到宿主机,以便查看日志或持久化数据。例如,/opt/hadoop/logs目录挂载出来,方便调试。 另外,启动顺序也很重要。ResourceManager应该先启动,然后NodeManager才能注册上去。使用Docker Compose的话,可以通过depends_on来控制启动顺序,但要注意等待机制,因为depends_on只是等待容器启动,并不保证服务就绪。 测试集群是否正常运行,可能需要访问YARN的Web界面,默认在8088端口。用户可以通过浏览器访问宿主机的8088端口查看集群状态。 最后,可能需要给出验证步骤,比如运行一个简单的MapReduce任务来测试YARN是否正常工作。例如,执行hadoop jar命令提交一个wordcount任务,观察任务是否成功运行。 用户可能还关心如何扩展集群,比如添加更多的NodeManager节点。这时候Docker Compose的scale命令可能会有帮助,或者使用Kubernetes进行编排,但用户的问题是关于Docker环境,可能只需要说明如何复制NodeManager容器。 另外,需要注意防火墙和端口映射的问题,确保容器中的端口正确映射到宿主机,并且防火墙允许这些端口通信。例如,ResourceManager的8031、8032、8033端口,以及NodeManager的45454端口等。 还有可能遇到的问题包括主机名解析,容器内部的主机名需要正确配置,以便ResourceManager和NodeManager能够通过主机名相互发现。可能需要在每个容器的/etc/hosts文件中添加条目,或者使用Docker的--hostname参数。 总结下来,步骤可能包括:拉取或构建Hadoop镜像,创建Docker网络,编写Docker Compose文件定义ResourceManager和NodeManager服务,配置YARN相关文件,启动容器,验证集群状态,运行测试任务。 需要确保所有配置正确,特别是网络和主机名部分,否则可能导致ResourceManager和NodeManager无法通信。同时,资源分配也需要考虑,比如内存和CPU限制,避免容器因资源不足而崩溃。 用户可能没有提到HDFS,但YARN通常和HDFS一起使用,所以可能需要简要说明是否需要部署HDFS,或者假设用户已经有HDFS环境。如果用户需要完整的Hadoop集群(包括HDFS和YARN),可能需要调整步骤,但问题明确是YARN,所以可能专注于YARN的部署。 最后,提供常见问题排查方法,比如查看日志、检查端口是否开放、确认主机名解析等。这有助于用户自行解决可能出现的问题。 </think>要在 Docker 环境中部署 YARN 集群,需结合 Hadoop 镜像和 Docker Compose 实现多节点模拟。以下是详细步骤和配置: --- ### **1. 架构设计** ``` YARN 集群包含以下核心组件: - ResourceManager(RM):负责全局资源调度。 - NodeManager(NM):负责单节点资源管理(可多个实例)。 ``` --- ### **2. 准备工作** #### **2.1 安装依赖** - Docker Engine:[安装指南](https://docs.docker.com/engine/install/) - Docker Compose:[安装指南](https://docs.docker.com/compose/install/) #### **2.2 拉取 Hadoop 镜像** 推荐使用社区维护的 Hadoop 镜像(如 `bde2020/hadoop-base`): ```bash docker pull bde2020/hadoop-base:latest ``` --- ### **3. 编写 Docker Compose 文件** #### **3.1 `docker-compose.yml` 配置** ```yaml version: '3' services: # ResourceManager 节点 resourcemanager: image: bde2020/hadoop-base:latest container_name: hadoop-rm hostname: resourcemanager environment: - SERVICE_TYPE=RM - HADOOP_CLUSTER_NAME=hadoop-cluster ports: - "8088:8088" # YARN Web UI - "8031:8031" # Scheduler - "8032:8032" # ApplicationsManager - "8033:8033" # NodeManager networks: - hadoop-network # NodeManager 节点(可扩展多个) nodemanager1: image: bde2020/hadoop-base:latest container_name: hadoop-nm1 hostname: nodemanager1 environment: - SERVICE_TYPE=NM - HADOOP_CLUSTER_NAME=hadoop-cluster ports: - "45454:45454" # NodeManager 通信端口 networks: - hadoop-network depends_on: - resourcemanager networks: hadoop-network: driver: bridge ``` --- ### **4. 启动集群** #### **4.1 启动容器** ```bash docker-compose up -d ``` - `-d` 表示后台运行。 #### **4.2 验证容器状态** ```bash docker ps ``` 确保 `hadoop-rm` 和 `hadoop-nm1` 状态为 `Up`。 --- ### **5. 配置 YARN 组件** #### **5.1 进入 ResourceManager 容器** ```bash docker exec -it hadoop-rm bash ``` #### **5.2 修改 YARN 配置文件** 编辑 `$HADOOP_HOME/etc/hadoop/yarn-site.xml`: ```xml <configuration> <!-- ResourceManager 地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>resourcemanager</value> </property> <!-- NodeManager 资源配置 --> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>4096</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>2</value> </property> </configuration> ``` #### **5.3 分发配置到所有节点** 将修改后的 `yarn-site.xml` 复制到所有 NodeManager 容器: ```bash docker cp yarn-site.xml hadoop-nm1:/opt/hadoop/etc/hadoop/ ``` --- ### **6. 启动 YARN 服务** #### **6.1 在 ResourceManager 中启动** ```bash # 格式化 ZooKeeper(仅首次需要) $HADOOP_HOME/bin/hdfs zkfc -formatZK # 启动 YARN $HADOOP_HOME/sbin/yarn-daemon.sh start resourcemanager ``` #### **6.2 在 NodeManager 中启动** 进入 NodeManager 容器并启动服务: ```bash docker exec -it hadoop-nm1 bash $HADOOP_HOME/sbin/yarn-daemon.sh start nodemanager ``` --- ### **7. 验证集群状态** #### **7.1 访问 YARN Web UI** 浏览器访问 `http://<宿主机IP>:8088`,查看集群节点和资源信息。 #### **7.2 运行测试任务** 提交一个 MapReduce 示例任务: ```bash # 创建 HDFS 输入目录 $HADOOP_HOME/bin/hdfs dfs -mkdir /input # 上传测试文件 $HADOOP_HOME/bin/hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml /input # 运行 WordCount 任务 $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-*.jar TestDFSIO \ -write -nrFiles 10 -size 1GB ``` --- ### **8. 常见问题排查** #### **8.1 节点无法注册** - **原因**:主机名或网络配置错误。 - **解决**:检查容器 `/etc/hosts` 是否包含 `resourcemanager` 和 `nodemanager` 的 IP 映射。 #### **8.2 端口冲突** - **原因**:宿主机端口被占用。 - **解决**:修改 `docker-compose.yml` 中的端口映射。 #### **8.3 资源不足** - **原因**:NodeManager 内存或 CPU 配置过低。 - **解决**:调整 `yarn-site.xml` 中的 `yarn.nodemanager.resource.memory-mb` 和 `yarn.nodemanager.resource.cpu-vcores`。 --- ### **9. 扩展集群** #### **9.1 添加更多 NodeManager** 修改 `docker-compose.yml`,复制 `nodemanager1` 配置并修改名称和端口: ```yaml nodemanager2: image: bde2020/hadoop-base:latest container_name: hadoop-nm2 hostname: nodemanager2 environment: - SERVICE_TYPE=NM - HADOOP_CLUSTER_NAME=hadoop-cluster ports: - "45455:45454" networks: - hadoop-network depends_on: - resourcemanager ``` --- ### **10. 关闭集群** ```bash docker-compose down ``` --- ### **关键配置参数** | 配置项 | 作用 | 推荐值 | |-----------------------|-----------------------------|---------------| | `yarn.resourcemanager.hostname` | ResourceManager 主机名 | `resourcemanager` | | `yarn.nodemanager.resource.memory-mb` | 单节点可用内存(MB) | `4096` | | `yarn.nodemanager.resource.cpu-vcores` | 单节点可用 CPU 核心数 | `2` | | `yarn.applicationmaster.wait-for-diagnostics` | 任务失败诊断等待时间 | `true` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值