Yarn的NodeLabel配置

基本介绍

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配置文件,添加以下内容:


说明

这里只介绍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页面

    Yarn的NodeLabel配置_第1张图片

  • Node Labels页面

    Yarn的NodeLabel配置_第2张图片

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

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

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

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

重要

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

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

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

yarn rmadmin -refreshQueues

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

Yarn的NodeLabel配置_第3张图片

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

引擎 配置项 说明
MapReduce mapreduce.job.node-label-expression 作业所有容器默认使用的节点分区。
mapreduce.job.am.node-label-expression ApplicationMaster使用的节点分区。
mapreduce.map.node-label-expression map子任务使用的节点分区。
mapreduce.reduce.node-label-expression reduce子任务使用的节点分区。
Spark spark.yarn.am.nodeLabelExpression ApplicationMaster使用的节点分区。
spark.yarn.executor.nodeLabelExpression Executor使用的节点分区。
Flink yarn.application.node-label 作业所有容器默认使用的节点分区
yarn.taskmanager.node-label TaskManager使用的节点分区,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的场景包括集群同时运行批作业和流作业,使用分区隔离;存在需要重保的作业,分区后运行在非弹性节点;实例规格差异过大,用分区管理的方式分别运行作业避免不均衡等。

你可能感兴趣的:(wpf)