4.4 YARN 高级特性与扩展


文档摘要

4.4 YARN 高级特性与扩展 4.4 YARN 高级特性与扩展 4.4.1 节点标签与资源分区 (Node Labels and Resource Partitioning) 在大型 Hadoop 集群中,往往存在多种类型的节点,例如配备 GPU 的节点、拥有高速 SSD 的节点、或者专门用于特定类型计算任务的节点。为了更好地利用这些异构资源,并实现工作负载隔离,YARN 引入了节点标签 (Node Labels) 和资源分区 (Resource Partitioning) 特性。 概念解释: 节点标签 (Node Labels): 管理员可以为集群中的节点打上标签,例如 "gpu"、"ssd"、"high-memory" 等。这些标签是对节点硬件或软件特性的描述。

4.4 YARN 高级特性与扩展

4.4 YARN 高级特性与扩展

4.4.1 节点标签与资源分区 (Node Labels and Resource Partitioning)

在大型 Hadoop 集群中,往往存在多种类型的节点,例如配备 GPU 的节点、拥有高速 SSD 的节点、或者专门用于特定类型计算任务的节点。为了更好地利用这些异构资源,并实现工作负载隔离,YARN 引入了节点标签 (Node Labels)资源分区 (Resource Partitioning) 特性。

概念解释:

  • 节点标签 (Node Labels): 管理员可以为集群中的节点打上标签,例如 "gpu"、"ssd"、"high-memory" 等。这些标签是对节点硬件或软件特性的描述。

  • 资源分区 (Resource Partitioning): 资源分区是基于节点标签创建的逻辑资源集合。每个资源分区关联一组节点标签,并可以配置独立的调度策略和队列。

优势:

  • 资源隔离: 可以将不同类型的应用隔离到不同的资源分区,避免资源争抢,提高系统稳定性。例如,可以将对 GPU 资源需求高的深度学习任务分配到 "gpu" 分区,将对 I/O 性能敏感的任务分配到 "ssd" 分区。

  • 资源优化利用: 可以根据应用的资源需求,将应用调度到最合适的节点分区,充分利用集群的异构资源。

  • 简化管理: 通过标签和分区,可以更方便地管理和监控集群资源,并针对不同类型的应用配置不同的资源策略。

代码实践与详解:

1. 节点标签配置:

节点标签的配置通常在 capacity-scheduler.xmlfair-scheduler.xml 等调度器配置文件中进行。以下以 Capacity Scheduler 为例,展示如何配置节点标签:

<property> <name>yarn.node-labels.enabled</name> <value>true</value> </property> <property> <name>yarn.node-labels.configuration.type</name> <value>centralized</value> </property> <property> <name>yarn.node-labels.am.default-node-label-expression</name> <value></value> <!-- 默认标签表达式,为空表示不限制 --> </property>
  • yarn.node-labels.enabled: 启用节点标签功能。

  • yarn.node-labels.configuration.type: 指定节点标签配置类型,centralized 表示集中式管理,标签信息存储在 ResourceManager 中。

  • yarn.node-labels.am.default-node-label-expression: 为 Application Master 设置默认的节点标签表达式。应用在提交时如果没有指定标签,将使用此默认表达式。

2. 创建资源分区:

资源分区也需要在调度器配置文件中定义。例如,在 capacity-scheduler.xml 中创建名为 "gpu-partition" 的分区,并关联 "gpu" 标签:

<property> <name>yarn.scheduler.capacity.node-label-expression.gpu-partition</name> <value>gpu</value> </property> <property> <name>yarn.scheduler.capacity.maximum-am-resource-percent.gpu-partition</name> <value>0.1</value> </property> <property> <name>yarn.scheduler.capacity.maximum-application-master-resource-percent.gpu-partition</name> <value>0.1</value> </property>
  • yarn.scheduler.capacity.node-label-expression.gpu-partition: 定义分区 "gpu-partition" 关联的节点标签表达式为 "gpu"。

  • yarn.scheduler.capacity.maximum-am-resource-percent.gpu-partitionyarn.scheduler.capacity.maximum-application-master-resource-percent.gpu-partition: 为 "gpu-partition" 分区设置 AM 资源的最大百分比限制。

3. 为节点打标签:

可以使用 YARN 命令行工具 yarn node -updateNodeResource 为节点添加标签。例如,为节点 node1.example.com 添加 "gpu" 标签:

yarn node -updateNodeResource node1.example.com '[{"resourceType":"NODE_LABELS","value":"gpu"}]'

4. 应用提交时指定标签:

在提交 YARN 应用时,可以使用 --node-label-expression 参数指定应用所需的节点标签表达式。例如,提交一个需要 "gpu" 标签的应用:

yarn jar your-application.jar MainClass --node-label-expression "gpu"

Graph TD 图示:

图示解释:

  • YARN 集群包含多个 NodeManager,每个 NodeManager 可能具有不同的硬件资源(CPU, Memory, GPU, SSD)。

  • 通过资源分区,我们将集群资源划分为 CPU 分区、GPU 分区、SSD 分区等。

  • 应用可以根据自身需求选择合适的资源分区进行运行,例如 Application 2 需要 GPU 资源,因此被调度到 GPU 分区。

总结:

节点标签和资源分区是 YARN 高级资源管理的重要特性,它们为异构集群的资源管理和工作负载隔离提供了强大的支持,使得 YARN 能够更好地适应多样化的应用场景。

4.4.2 容量调度器高级特性 (Capacity Scheduler Advanced Features)

Capacity Scheduler 作为 YARN 默认的调度器,除了基础的队列管理和容量保证功能外,还提供了许多高级特性,进一步提升了资源利用率和调度灵活性。

高级特性:

  • 队列映射 (Queue Mapping): 允许根据用户、组、应用类型等条件,自动将应用分配到不同的队列,实现精细化的队列管理。

  • 队列放置规则 (Queue Placement Rules): 基于规则引擎,可以根据更复杂的条件动态决定应用应该被放置到哪个队列。

  • 资源抢占 (Preemption): 允许高优先级队列抢占低优先级队列的资源,保证重要应用的资源需求。

  • 延迟调度 (Delayed Scheduling): 允许调度器等待一段时间,尝试将任务调度到更合适的节点,提高数据本地性。

  • 容器大小调整 (Container Resize): 允许在应用运行过程中动态调整容器的资源大小,提高资源利用率和应用性能。

代码实践与详解 (以队列映射为例):

1. 队列映射配置:

队列映射配置在 capacity-scheduler.xml 中,使用 yarn.scheduler.capacity.queue-mappings 属性定义映射规则。

<property> <name>yarn.scheduler.capacity.queue-mappings</name> <value> u:user1:queueA, g:group1:queueB, a:application-type:queueC, root.default:root.default </value> </property> <property> <name>yarn.scheduler.capacity.queue-mappings-override.enable</name> <value>false</value> </property>
  • yarn.scheduler.capacity.queue-mappings: 定义队列映射规则,多个规则之间用逗号分隔。

    • u:user1:queueA: 用户 "user1" 提交的应用被映射到队列 "queueA"。

    • g:group1:queueB: 组 "group1" 的用户提交的应用被映射到队列 "queueB"。

    • a:application-type:queueC: 应用类型为 "application-type" 的应用被映射到队列 "queueC"。

    • root.default:root.default: 默认规则,如果没有匹配到其他规则,则应用被映射到 "root.default" 队列。

  • yarn.scheduler.capacity.queue-mappings-override.enable: 是否允许用户在提交应用时覆盖队列映射规则,设置为 false 表示不允许覆盖。

2. 提交应用并验证队列映射:

用户 "user1" 提交应用:

yarn jar your-application.jar MainClass -Dmapreduce.job.queuename=root.default

根据配置,该应用应该被自动映射到队列 "queueA",而不是用户指定的 "root.default" 队列,因为队列映射规则优先级更高。

Graph TD 图示 (队列映射):

图示解释:

  • Capacity Scheduler 中配置了队列映射规则。

  • 当应用提交时,队列映射规则根据用户、组、应用类型等信息,将应用自动分配到相应的队列 (QueueA, QueueB, QueueC) 或默认队列 (DefaultQueue)。

总结:

Capacity Scheduler 的高级特性,如队列映射、资源抢占等,进一步增强了其资源管理能力,使得 YARN 能够更好地支持复杂的工作负载和多租户环境,提升集群的效率和灵活性。

4.4.3 YARN Federation (联邦)

随着数据规模和计算需求的不断增长,单个 YARN 集群可能难以满足大规模应用的需求。为了解决这个问题,YARN 引入了 Federation (联邦) 特性。

概念解释:

YARN Federation 将多个独立的 YARN 子集群 (Sub-Cluster) 联合起来,形成一个逻辑上的大型集群。应用可以提交到联邦集群,由联邦层 (Federation Layer) 将应用路由到合适的子集群执行。

优势:

  • 扩展性: 通过联邦,可以突破单个 YARN 集群的规模限制,支持更大规模的应用和数据处理。

  • 资源隔离: 不同的子集群可以独立管理,实现资源隔离,提高系统稳定性。

  • 地理位置优化: 可以将子集群部署在不同的地理位置,实现数据本地性和跨区域容灾。

架构:

架构解释:

  • Router: 联邦集群的入口点,接收应用提交请求,并将请求路由到 Global ResourceManager。

  • Global ResourceManager (GRM): 联邦层的资源管理器,负责全局资源管理和应用调度。GRM 并不直接管理 NodeManager,而是管理多个子集群的 ResourceManager。

  • Sub-Cluster: 独立的 YARN 子集群,每个子集群有自己的 ResourceManager 和 NodeManager。

代码实践与详解:

YARN Federation 的配置相对复杂,涉及到多个组件的协同工作。这里仅简要介绍配置的关键步骤:

1. 配置 Global ResourceManager (GRM):

GRM 需要配置子集群的信息,例如子集群的 ResourceManager 地址。

<property> <name>yarn.federation.am.home-sub-cluster</name> <value>subcluster1</value> </property> <property> <name>yarn.federation.subclusters.subcluster1.rm.address</name> <value>subcluster1-rm:8032</value> </property> <property> <name>yarn.federation.subclusters.subcluster2.rm.address</name> <value>subcluster2-rm:8032</value> </property>
  • yarn.federation.am.home-sub-cluster: 指定 Application Master 的默认 home 子集群。

  • yarn.federation.subclusters.subcluster1.rm.addressyarn.federation.subclusters.subcluster2.rm.address: 配置子集群 "subcluster1" 和 "subcluster2" 的 ResourceManager 地址。

2. 配置 Router:

Router 需要配置 GRM 的地址,以便将应用请求转发给 GRM。

<property> <name>yarn.federation.router.client.rm.address</name> <value>grm:8030</value> </property>
  • yarn.federation.router.client.rm.address: 配置 GRM 的客户端地址。

3. 应用提交到联邦集群:

应用提交时,需要将请求发送到 Router 的地址。

yarn jar your-application.jar MainClass --resourceManagerAddress router:8030

总结:

YARN Federation 为构建超大规模 Hadoop 集群提供了解决方案,通过将多个子集群联合起来,实现了集群规模的线性扩展,并支持更灵活的资源管理和应用调度。

4.4.4 容器化支持 (Containerization Support)

随着容器技术的兴起,YARN 也开始支持容器化应用。通过集成 Docker 等容器运行时,YARN 可以更方便地部署和管理容器化的应用,并提供更好的隔离性和可移植性。

优势:

  • 环境一致性: 容器镜像保证了应用运行环境的一致性,避免了环境差异导致的问题。

  • 快速部署: 容器镜像可以快速部署和启动,缩短应用上线时间。

  • 资源隔离: 容器提供了更强的资源隔离性,避免应用之间的相互影响。

  • 简化依赖管理: 容器镜像包含了应用的所有依赖,简化了依赖管理和部署过程。

代码实践与详解 (Docker 集成):

1. 配置 NodeManager 启用 Docker 容器运行时:

yarn-site.xml 中配置 NodeManager 使用 Docker 容器运行时:

<property> <name>yarn.nodemanager.container-executor.class</name> <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.resources-handler.class</name> <value>org.apache.hadoop.yarn.server.nodemanager.util.CgroupsCpuResourceHandler</value> </property> <property> <name>yarn.nodemanager.container-executor.docker.privileged-containers.allowed</name> <value>false</value> </property> <property> <name>yarn.nodemanager.container-executor.docker.image-name</name> <value>your-docker-registry/your-docker-image:latest</value> </property>
  • yarn.nodemanager.container-executor.class: 指定容器执行器为 LinuxContainerExecutor

  • yarn.nodemanager.linux-container-executor.resources-handler.class: 配置资源处理器,可以使用 Cgroups 进行资源限制。

  • yarn.nodemanager.container-executor.docker.privileged-containers.allowed: 是否允许运行特权容器,一般设置为 false 以提高安全性。

  • yarn.nodemanager.container-executor.docker.image-name: 指定默认的 Docker 镜像名称,应用可以覆盖此配置。

2. 应用提交时指定 Docker 镜像:

在提交 YARN 应用时,可以使用 --container-launch-command 参数指定 Docker 镜像和容器启动命令。

yarn jar your-application.jar MainClass \ --container-launch-command "docker run your-docker-registry/your-docker-image:latest your-application-entrypoint"

Graph TD 图示 (Docker 容器化):

图示解释:

  • YARN 集群中,NodeManager 通过 Container Executor 与 Docker Runtime 交互。

  • 当应用需要启动容器时,Container Executor 调用 Docker Runtime 创建和管理 Docker 容器。

  • 应用最终运行在 Docker 容器中。

总结:

YARN 的容器化支持使得用户可以更加方便地部署和管理容器化的应用,并充分利用容器技术的优势,提升应用的部署效率、资源隔离性和可移植性。

4.4.5 Timeline Service v2 (时间轴服务 v2)

YARN Timeline Service v2 是 YARN 的一个重要组件,用于收集和存储 YARN 应用的历史信息,例如应用运行状态、资源使用情况、容器日志等。 Timeline Service v2 相比 v1 版本,在可扩展性、可靠性和性能方面有了显著提升。

优势:

  • 改进的可扩展性: v2 版本采用分布式架构,可以水平扩展,支持更大规模的集群和应用。

  • 增强的可靠性: v2 版本使用 HBase 等持久化存储,提高了数据可靠性。

  • 更好的性能: v2 版本在数据写入和查询性能方面进行了优化,可以更快地访问应用历史信息。

  • 更丰富的数据: v2 版本收集更多类型的应用数据,例如容器指标、任务日志等,提供更全面的应用监控和诊断信息.

功能:

  • 应用历史信息查询: 用户可以通过 Web UI 或 API 查询应用的运行状态、资源使用情况、容器列表、日志等信息。

  • 应用监控和诊断: Timeline Service v2 收集的数据可以用于应用监控和性能分析,帮助用户发现和解决应用问题。

  • 审计和追踪: 应用历史信息可以用于审计和追踪,了解应用的运行轨迹和资源使用情况。

架构:

架构解释:

  • Timeline Collector: 负责收集来自 ResourceManager 和 NodeManager 的应用数据。

  • Timeline Store (HBase): 使用 HBase 作为持久化存储,存储应用历史信息。

  • Timeline Client (Web UI, API): 提供 Web UI 和 API 接口,供用户查询和访问应用历史信息。

代码实践与详解:

Timeline Service v2 的配置主要涉及到 HBase 的集成和 Timeline Collector 的配置。

1. 配置 Timeline Service v2 使用 HBase:

yarn-site.xml 中配置 Timeline Service v2 使用 HBase 作为存储:

<property> <name>yarn.timeline-service.store.class</name> <value>org.apache.hadoop.yarn.server.timeline.HBaseTimelineStore</value> </property> <property> <name>yarn.timeline-service.webapp.address</name> <value>0.0.0.0:8188</value> </property>
  • yarn.timeline-service.store.class: 指定 Timeline Store 的实现类为 HBaseTimelineStore

  • yarn.timeline-service.webapp.address: 配置 Timeline Service Web UI 的地址和端口。

2. 启动 Timeline Service v2:

启动 Timeline Service v2 服务:

yarn-daemon.sh start timelineserver

3. 访问 Timeline Service Web UI:

通过浏览器访问 http://<TimelineServiceHost>:8188 可以查看 Timeline Service Web UI,并查询应用历史信息。

总结:

Timeline Service v2 为 YARN 提供了强大的应用历史信息收集、存储和查询能力,为应用监控、诊断、审计和追踪提供了重要的数据支持,是 YARN 可观察性和可管理性的重要组成部分。

4.4.6 其他扩展与展望

除了上述高级特性外,YARN 还在不断扩展和演进,例如:

  • 自定义资源类型 (Custom Resource Types): YARN 支持管理自定义资源类型,例如 GPU、FPGA 等硬件加速器,使得 YARN 可以支持更多类型的计算任务。

  • Pluggable Scheduler (可插拔调度器): YARN 允许用户开发和集成自定义调度器,满足特定的调度需求。

  • 安全增强 (Security Enhancements): YARN 不断增强安全特性,例如 Kerberos 集成、ACLs (访问控制列表) 等,保障集群的安全运行。

展望:

未来,YARN 将继续朝着以下方向发展:

  • 云原生化: 更好地集成云原生技术,例如 Kubernetes,支持容器化应用的更灵活和高效的管理。

  • 智能化调度: 引入机器学习和人工智能技术,实现更智能化的资源调度和应用优化。

  • 异构计算支持: 进一步增强对异构计算资源的支持,例如 GPU、FPGA 等,支持更多类型的计算任务。

总结:

YARN 作为 Hadoop 生态系统的资源管理核心,通过不断引入高级特性和扩展机制,已经发展成为一个功能强大、灵活高效的资源管理平台。理解和应用这些高级特性,可以帮助用户更好地管理和利用 Hadoop 集群资源,支持更加复杂和多样化的应用场景。 随着技术的不断发展,YARN 将继续演进,为大数据处理和云计算领域提供更强大的支撑。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U