Yarn的NodeLabel配置

本文介绍了ApacheYARN的NodeLabels特性,如何将集群节点划分为分区进行管理,以及如何在CapacityScheduler中配置队列访问分区。重点讲解了配置步骤、使用场景和注意事项,包括高可用集群中分布式存储的必要性以及适用的场景分析。

基本介绍

YARN Node Labels特性支持将YARN NodeManager节点进行分区管理。因为一个节点只能设置属于某一个Node Label,所以可以使用 Node Label将整个YARN集群划分为不相交的节点集合。默认节点属于DEFAULT分区(partition="",空字符串)。

分区又可以配置为两类:

  • exclusive分区:只允许请求和该分区匹配的容器调度到该分区的节点上。
  • non-exclusive分区:除了分配该分区容器请求外,还允许在有空闲资源时将请求为DEFAULT分区的容器调度上来(或请求未特殊制定分区)。

目前只有Capacity Scheduler调度器支持Node Labels分区调度,您可以通过调度器配置或者计算引擎node-label-expression参数让队列上的任务容器调度到队列可访问的分区上。

更详细的Node Labels特性说明,请参见YARN Node Labels

使用方式

修改配置文件

修改yarn-site.xml配置文件,添加以下内容:

Key

Value

说明

yarn.node-labels.enabled

true

特性总开关。

yarn.node-labels.fs-store.root-dir

/tmp/node-labels

默认centralized配置模式下node label,信息存储位置可自行规划。


说明

这里只介绍Node Labels配置节点映射最方便的centralized模式,有其他需求请参见官网文档介绍。yarn.node-labels.fs-store.root-dir如果直接使用路径配置而不是URL的情况下,默认使用fs.defaultFS配置的默认文件系统,配置等价于${fs.defaultFS}/tmp/node-labels,EMR中通常为分布式的HDFS。

命令添加相关Node Labels分区并建立节点映射

如果是需要自动指定弹性节点组扩容节点的NodeManager分区,则需要在创建分区后,将replaceLabelsOnNode运维命令添加到对应节点组范围的引导操作脚本中,在组件启动后执行。

命令示例如下。

# 使用YARN默认管理员hadoop账户执行
sudo su hadoop
# 添加分区
yarn rmadmin -addToClusterNodeLabels "DEMO"
yarn rmadmin -addToClusterNodeLabels "CORE"
# 列出YARN节点列表
yarn node -list
# 配置指定节点分区映射
yarn rmadmin -replaceLabelsOnNode "core-1-1.c-XXX.cn-hangzhou.emr.aliyuncs.com=DEMO"
yarn rmadmin -replaceLabelsOnNode "core-1-2.c-XXX.cn-hangzhou.emr.aliyuncs.com=DEMO"

设置这个HDFS的Node-labels存储目录,是因为label信息默认是保存在内存中的,如果将label信息存于hdfs上,重启resourcemanager之后label信息不会因此丢失。 

执行成功后,可以在ResourceManager Web UI验证结果。

  • Nodes页面

    ResourceManager

  • Node Labels页面

    Node Labels

CapacityScheduler配置队列的可访问分区、作业使用的分区

使用CapacityScheduler:确保yarn-site.xml文件配置中参数yarn.resourcemanager.scheduler.class的值为org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler。

在capacity-scheduler.xml中使用如下配置项,配置队列可访问的分区和容量,<queue-path>替换为配置队列,<label>替换为配置分区(DEFAULT分区直接用常规的capacity或maximum-capacity配置即可)。

配置项说明
yarn.scheduler.capacity.<queue-path>.accessible-node-labels逗号分割的分区列表。指定队列的可访问分区列表。
yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.capacity值规则可参考yarn.scheduler.capacity.<queue-path>.capacity指定队列在指定可访问分区的资源容量。

重要

必须配置其所有祖先队列的容量才能生效。

yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.maximum-capacity值规则可参考yarn.scheduler.capacity.<queue-path>.maximum-capacity,默认值为100。指定队列在指定可访问分区的可超用的最大资源容量。
yarn.scheduler.capacity.<queue-path>.default-node-label-expression分区名,默认为空字符串代表DEFAULT分区。指定队列所提交作业中没有特别指定分区的容器请求所使用的默认分区。
  • 必须配置其所有祖先队列的相同分区容量才能使指定队列的实际资源量大于0,原因是包括root节点在内的yarn.scheduler.capacity.<queue-path>.accessible-node-labels.<label>.capacity的默认值为0,所以必须配置yarn.scheduler.capacity.root.accessible-node-labels.<label>.capacity=100所有的子队列这个分区的容量才有可能不为0(理论上只要大于0即可,但是配置小于100导致子队列推算的实际capacity变少了,没什么意义);如果目标队列的祖先队列capacity 配置缺失使用默认值 0,实际推算出来该队列在此分区的实际capacity还是为0。
  • yarn.scheduler.capacity.root.accessible-node-labels.<label>.capacity配置大于0后,和常规的yarn.scheduler.capacity.<queue-path>.capacity规则一样,要求直接子队列的相同分区capacity之和为100。添加配置样例如下。
    <configuration>
      <!-- 在XML中Node Label相关新增配置项 -->
      <property>
        <!-- 配置default队列可访问DEMO分区,必须 -->
        <name>yarn.scheduler.capacity.root.default.accessible-node-labels</name>
        <value>DEMO</value>
      </property>
      <property>
        <!-- 配置default队列所有祖先队列DEMO分区容量,必须 -->
        <name>yarn.scheduler.capacity.root.accessible-node-labels.DEMO.capacity</name>
        <value>100</value>
      </property>
      <property>
        <!-- 配置default队列在DEMO分区容量,必须 -->
        <name>yarn.scheduler.capacity.root.default.accessible-node-labels.DEMO.capacity</name>
        <value>100</value>
      </property>
      <property>
        <!-- 配置default队列在DEMO分区最大容量,可选,默认为100 -->
        <name>yarn.scheduler.capacity.root.default.accessible-node-labels.DEMO.maximum-capacity</name>
        <value>100</value>
      </property>
      <property>
        <!-- 配置default队列作业容器请求默认提交分区,可选,默认为DEFAULT分区"" -->
        <name>yarn.scheduler.capacity.root.default.default-node-label-expression</name>
        <value>DEMO</value>
      </property>
    <configuration>
    
                            

以上部分直接添加到capacity-scheduler.xml配置文件中,然后执行命令刷新就好了。

yarn rmadmin -refreshQueues

完成后,在YARN状态页面使用ResourceManager组件refreshQueues操作热更新调度器队列配置,在控制台上观察任务是否成功。成功后使用ResourceManager Web UI验证结果。

ResourceManager Web UI

除了调度器队列默认分区配置,计算引擎也都基本支持Node Labels特性(Tez除外),引擎提交程序Node Labels相关参数不做赘述。

引擎配置项说明
MapReducemapreduce.job.node-label-expression作业所有容器默认使用的节点分区。
mapreduce.job.am.node-label-expressionApplicationMaster使用的节点分区。
mapreduce.map.node-label-expressionmap子任务使用的节点分区。
mapreduce.reduce.node-label-expressionreduce子任务使用的节点分区。
Sparkspark.yarn.am.nodeLabelExpressionApplicationMaster使用的节点分区。
spark.yarn.executor.nodeLabelExpressionExecutor使用的节点分区。
Flinkyarn.application.node-label作业所有容器默认使用的节点分区
yarn.taskmanager.node-labelTaskManager使用的节点分区,Flink版本1.15.0开始支持,对应EMR-3.44.0(3x系列)、EMR-5.10.0 (5x系列)。

常见问题

高可用集群必须将centralized模式Node Labels数据存储在分布式文件系统中?

在高可用集群中,ResourceManager在多个节点上进行部署。开源Hadoop默认存储Node Labels数据在本地tmp目录file:///tmp/hadoop-yarn-${user}/node-labels/。主备切换后,新的Active节点无法读到本地存储的Node Labels信息,所以必须将yarn.node-labels.fs-store.root-dir配置为分布式存储路径,例如/tmp/node-labels或者${fs.defaultFS}/tmp/node-labels(EMR Hadoop默认文件系统为分布式HDFS,详情请参见使用方式)。

重要

自定义的分布式路径必须确保文件系统服务正常且hadoop用户能正常读写访问,否则ResourceManager会启动失败。

添加节点分区映射时为什么不指定NodeManager端口?

EMR集群一个节点上最多只有一个NodeManager进程,所以指定端口没有太大的意义。如果因为不了解导致写错端口,或者配置端口为随机的情况下,带端口执行replaceLabelsOnNode不能正确建立节点分区映射。您可以使用命令yarn node -list -showDetails查看节点当前分区。

Node Labels适用的场景?

通常情况下,EMR集群不需要使用Node Labels特性。目前开源Hadoop YARN很多指标都没考虑到分区,只统计DEFAULT分区的状态数据,带来管理运维上的复杂性;分区调度可能无法充分利用集群资源,造成资源浪费。使用到Node Labels的场景包括集群同时运行批作业和流作业,使用分区隔离;存在需要重保的作业,分区后运行在非弹性节点;实例规格差异过大,用分区管理的方式分别运行作业避免不均衡等。

YARN节点标签介绍_Yarn_大数据知识库 (saoniuhuo.com)

弹性 MapReduce YARN 标签调度实践-EMR 开发指南-文档中心-腾讯云 (tencent.com)

<think>好的,用户现在想了解在Flink任务中使用YARN的application模式启动时需要配置哪些参数。之前用户询问过如何指定容器大小和CPU核数,现在他们可能希望更全面地了解所有相关配置,特别是针对YARN application模式的参数。 首先,我需要回忆Flink在YARN上的部署模式。YARN application模式与session模式和per-job模式不同,它允许每个应用单独启动集群,适合生产环境。用户可能在使用这种模式时,需要配置资源参数、日志设置、高可用性等。 接下来,我需要整理配置参数的分类。可能包括基础资源参数(JobManager和TaskManager的内存、CPU)、并行度、高可用配置、日志配置、动态属性,以及命令行示例。同时,用户可能想知道每个参数的具体作用和示例值。 然后,要注意用户之前的问题中提到的内存和CPU配置,所以需要详细说明这些部分,包括JVM堆内存、堆外内存等。此外,YARN的vcores配置也很重要,需要解释清楚如何设置CPU核数。 另外,高可用性配置对于生产环境来说很关键,应该包括ZooKeeper的配置和恢复策略。日志配置也是用户可能需要的,尤其是调试时,需要指导如何设置日志级别和路径。 还需要考虑动态参数,用户可能有自定义需求,需要举例如何传递这些参数。最后,提供一个完整的命令行示例,帮助用户整合所有配置。 在验证部分,用户可能需要知道如何确认配置是否生效,比如通过YARN的Web UI或命令行查看应用状态。常见问题如内存不足或CPU竞争,需要给出解决方案,比如调整内存大小或vcores数量。 需要确保回答结构清晰,分点列出,参数用代码块表示,符合用户之前接受的格式。同时,避免使用Markdown,但保持内容的结构化。确保覆盖所有重要参数,并且语言简洁明了,便于用户理解和应用。</think>在 Flink on YARN 的 **Application 模式**(`yarn-application`)下,任务的资源分配和参数配置主要通过 **命令行参数** 和 **Flink 配置文件**(`flink-conf.yaml`)实现。以下是核心参数的分类说明和典型配置方法: --- ### 一、基础资源参数(**必须配置**) #### 1. **JobManager (JM) 资源** | 参数 | 作用 | 示例值 | |--------------------------|----------------------------------------------------------------------|--------------| | `-D jobmanager.memory.process.size` | JM 进程总内存(含堆内存、堆外内存、JVM 开销等) | `2048m` 或 `2g` | | `-yjm` 或 `--yarnjobManagerMemory` | JM 容器的总内存(等效于 `jobmanager.memory.process.size`) | `2048`(单位 MB) | #### 2. **TaskManager (TM) 资源** | 参数 | 作用 | 示例值 | |--------------------------|----------------------------------------------------------------------|--------------| | `-D taskmanager.memory.process.size` | TM 进程总内存(含堆内存、堆外内存、网络缓存等) | `4096m` 或 `4g` | | `-ytm` 或 `--yarntaskManagerMemory` | TM 容器的总内存(等效于 `taskmanager.memory.process.size`) | `4096`(单位 MB) | | `-D yarn.containers.vcores` | 每个 TM 容器的 CPU 虚拟核数(vCores) | `2` | | `-D taskmanager.numberOfTaskSlots` | 每个 TM 的 Slot 数量(需与 vCores 匹配,建议 `slots ≤ vcores`) | `2` | --- ### 二、YARN 集群参数 | 参数 | 作用 | 示例值 | |--------------------------|----------------------------------------------------------------------|--------------| | `-Dyarn.application.name` | YARN 上显示的应用名称 | `Flink-Job-Example` | | `-Dyarn.application.queue`| 指定 YARN 队列 | `default` | | `-Dyarn.application.node-label` | 指定 YARN 节点标签(用于特定节点组) | `gpu-cluster`| --- ### 三、并行度与任务参数 | 参数 | 作用 | 示例值 | |--------------------------|----------------------------------------------------------------------|--------------| | `-p` 或 `--parallelism` | 任务的默认并行度(全局生效) | `4` | | `-c` 或 `--class` | 主类全限定名 | `com.example.MainJob` | --- ### 四、高可用性(HA)配置(可选) | 参数 | 作用 | 示例值 | |--------------------------|----------------------------------------------------------------------|--------------| | `-D high-availability` | 启用 HA(需依赖 ZooKeeper) | `zookeeper` | | `-D high-availability.zookeeper.quorum` | ZooKeeper 集群地址 | `zk1:2181,zk2:2181` | | `-D high-availability.storageDir` | HA 元数据存储路径(如 HDFS) | `hdfs:///flink/ha` | --- ### 五、日志与调试参数 | 参数 | 作用 | 示例值 | |--------------------------|----------------------------------------------------------------------|--------------| | `-D yarn.log-config-file` | 自定义日志配置文件路径 | `/path/to/log4j.properties` | | `-D log.level` | 设置日志级别(全局) | `INFO` 或 `DEBUG` | | `-D env.java.opts` | 附加 JVM 参数(如 GC 调优) | `-XX:+UseG1GC` | --- ### 六、动态参数(通过 `-D` 传递) | 参数格式 | 说明 | |--------------------------|----------------------------------------------------------------------| | `-D key=value` | 覆盖 `flink-conf.yaml` 中的配置或传递自定义参数到 Flink 任务。 | --- ### 七、完整启动命令示例 ```bash ./bin/flink run-application \ -t yarn-application \ -D jobmanager.memory.process.size=2048m \ -D taskmanager.memory.process.size=4096m \ -D yarn.containers.vcores=2 \ -D taskmanager.numberOfTaskSlots=2 \ -D yarn.application.name=Flink-Example \ -D high-availability=zookeeper \ -D high-availability.zookeeper.quorum=zk1:2181,zk2:2181 \ -p 4 \ -c com.example.MainJob \ /path/to/job.jar ``` --- ### 八、参数验证方法 1. **YARN Web UI**: - 访问 `http://<yarn-resourcemanager>:8088`,查看应用资源分配(内存、vCores)。 2. **Flink Web UI**: - 通过 YARN 提供的 Tracking URL 进入 Flink Dashboard,检查 TaskManager 的 Slot 和内存。 3. **日志定位**: - 检查 YARN Container 日志(通过 Web UI 下载或 `yarn logs -applicationId <app_id>`)。 --- ### 九、常见问题与解决 1. **资源不足导致任务失败**: - 现象:YARN 无法分配容器(`Exit code: 137`)。 - 解决:增大 `-yjm`/`-ytm` 并预留 10%~20% 的系统开销。 2. **Slot 与 vCores 不匹配**: - 现象:CPU 利用率低或线程竞争。 - 解决:确保 `taskmanager.numberOfTaskSlots ≤ yarn.containers.vcores`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值