Hadoop 文档

General

Common

HDFS

MapReduce

MapReduce REST APIs

YARN

YARN REST APIs

YARN Service

Submarine

Hadoop Compatible File Systems

Auth

Tools

Reference

Configuration

总览

节点标签是对具有相似特征的节点进行分组的一种方法,应用程序可以指定在何处运行。

现在我们仅支持节点分区,即:

  • 一个节点只能有一个节点分区,因此一个群集按节点分区划分为几个不相交的子群集。默认情况下,节点属于DEFAULT分区(partition =“”)
  • 用户需要配置每个分区可以由不同的队列使用多少资源。有关更多详细信息,请参阅下一节。
  • 节点分区有两种:
    • 独占:容器将分配给节点分区完全匹配的节点。(例如,将询问分区=“ x”分配给分区=“ x”的节点,询问默认分区将分配给DEFAULT分区节点)。
    • 非排他性:如果分区是非排他性的,则它向请求DEFAULT分区的容器共享空闲资源。

用户可以指定每个队列可以访问的一组节点标签,一个应用程序只能使用包含应用程序的队列可以访问的节点标签的子集。

特征

节点标签支持以下,现在的特点:

  • 分区群集-每个节点可以分配一个标签,因此群集将被划分为几个较小的不相交的分区。
  • 队列上节点标签的ACL-用户可以在每个队列上设置可访问节点标签,因此只有某些节点只能由特定队列访问。
  • 指定可以由队列访问的分区资源的百分比-用户可以设置百分比,例如:队列A可以访问具有label = hbase的节点上30%的资源。这样的百分比设置将与现有资源管理器一致
  • 在资源请求中指定所需的节点标签,仅当节点具有相同标签时才分配。如果未指定节点标签要求,则仅在属于DEFAULT分区的节点上分配这种资源请求。
  • 可操作性
    • 可以在RM重新启动期间恢复节点标签和节点标签映射
    • 更新节点标签-当RM运行时,管理员可以更新节点上的标签和队列上的标签
  • NM到节点标签的映射可以通过三种方式完成,但是在所有方法中,Partition Label应该是RM中配置的有效节点标签列表之一。
    • 集中式:节点到标签的映射可以通过RM公开的CLI,REST或RPC完成。
    • 分布式:节点到标签的映射将由NM中配置的节点标签提供程序设置。YARN中有两个不同的提供程序:基于脚本的提供程序和基于配置的提供程序。如果使用脚本,则可以使用脚本路径配置NM,并且脚本可以发出节点的标签。如果是配置,则可以在NM的yarn-site.xml中直接配置节点标签。在这两个选项中,都支持标签映射的动态刷新。
    • Delegated-Centralized:节点到标签的映射将由RM中配置的Node Labels Provider设置。当由于安全问题而无法由每个节点提供标签映射时,这将很有帮助,并且可以避免大型集群中每个节点通过RM接口进行交互。在NM注册期间将从该接口获取标签,并且还支持定期刷新。

组态

设置ResourceManager以启用节点标签

yarn-site.xml中设置以下属性

属性
yarn.node-labels.fs-store.root-dir hdfs:// namenode:port / path / to / store / node-labels /
yarn.node-labels.enabled 真正
yarn.node-labels.configuration-type 设置节点标签的配置类型。管理员可以指定“集中式”,“授权下放式”或“分布式”。默认值为“集中”。

笔记:

  • 确保已创建yarn.node-labels.fs-store.root-dir,并且ResourceManager有权访问它。(通常来自“ yarn”用户)
  • 如果用户要将节点标签存储到RM的本地文件系统(而不是HDFS),则可以使用诸如file:/// home / yarn / node-label之类的路径

向YARN添加/修改节点标签列表

  • 添加集群节点标签列表:
    • 执行yarn rmadmin -addToClusterNodeLabels“ label_1(exclusive = true / false),label_2(exclusive = true / false)”以添加节点标签。
    • 如果用户未指定“(exclusive =…)”,则默认情况下,exclusive为true
    • 运行yarn cluster --list-node-labels以检查添加的节点标签在群集中是否可见。

从YARN移除节点标签

  • 删除集群节点标签:
    • 要删除一个或多个节点标签,请执行以下命令:yarn rmadmin -removeFromClusterNodeLabels“ <label> [,<label>,...]”。命令参数应该是要删除的节点标签的逗号分隔列表。
    • 不允许删除已与队列关联的标签,即,一个或多个队列可以访问此标签。
    • 要验证是否已成功删除指定的节点标签,请运行yarn cluster --list-node-labels

添加/修改节点到标签的映射到YARN

  • 集中式 NodeLabel设置中配置节点到标签的映射

    • 执行yarn rmadmin -replaceLabelsOnNode“ node1 [:port] = label1 node2 = label2” [-failOnUnknownNodes]。将label1添加到node1,将label2添加到node2。如果用户未指定端口,则会将标签添加到节点上运行的所有NodeManager。如果设置了选项-failOnUnknownNodes,则如果指定的节点未知,该命令将失败。
  • 分布式 NodeLabel设置中配置节点到标签的映射

属性
yarn.node-labels.configuration-type 需要在RM中设置为“分布式”,以从NM中已配置的节点标签提供程序获取节点到标签的映射。
yarn.nodemanager.node-labels.provider RM中将“ yarn.node-labels.configuration-type”配置为“ distributed”时,管理员可以通过在NM中配置此参数来配置节点标签的提供程序。管理员可以配置提供者的“ config”“ script”类名。配置的类需要扩展org.apache.hadoop.yarn.server.nodemanager.nodelabels.NodeLabelsProvider。如果配置了“ config”,则配置了“ ConfigurationNodeLabelsProvider”,如果配置了“ script”,则将使用“ ScriptNodeLabelsProvider”
yarn.nodemanager.node-labels.resync-interval-ms NM与RM同步其节点标签的时间间隔。NM将每配置x个间隔将其加载的标签以及心跳发送给RM。即使未修改标签,也需要进行此重新同步,因为admin可能已删除了NM提供的群集标签。默认值为2分钟。
yarn.nodemanager.node-labels.provider.fetch-interval-ms 当使用“ config”“ script”或“ class”扩展AbstractNodeLabelsProvider 配置“ yarn.nodemanager.node-labels.provider”时,则定期从节点标签提供者中检索节点标签。此配置用于定义间隔时间。如果配置了-1,则仅在初始化期间从提供程序中检索节点标签。默认为10分钟。
yarn.nodemanager.node-labels.provider.fetch-timeout-ms “ yarn.nodemanager.node-labels.provider”配置为“ script”时,此配置将提供超时时间,在此之后它将中断查询节点标签的脚本。默认为20分钟。
yarn.nodemanager.node-labels.provider.script.path 要运行的节点标签脚本。以“ NODE_PARTITION:”开头的脚本输出行将被视为节点标签分区。如果脚本输出的多行具有此模式,则将考虑最后一行。
yarn.nodemanager.node-labels.provider.script.opts 传递给节点标签脚本的参数。
yarn.nodemanager.node-labels.provider.configured-node-partition “yarn.nodemanager.node-labels.provider”配置有“配置”,然后取出ConfigurationNodeLabelsProvider从该参数的分区标记。
  • 委托集中的 NodeLabel设置中配置节点到标签的映射
属性
yarn.node-labels.configuration-type 需要设置为“代理集中式”,以从RM中已配置的节点标签提供程序获取节点到标签的映射。
yarn.resourcemanager.node-labels.provider 如果将“ yarn.node-labels.configuration-type”配置为“ delegated-centralized”,则管理员应配置该类,以便通过ResourceManager获取节点标签。配置的类需要扩展org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsMappingProvider
yarn.resourcemanager.node-labels.provider.fetch-interval-ms “ yarn.node-labels.configuration-type”配置为“ delegated-centralized”时,则定期从节点标签提供程序中检索节点标签。此配置用于定义间隔。如果配置了-1,则在每个节点注册后,仅从提供程序中检索节点标签一次。默认为30分钟。

节点标签调度程序的配置

  • 容量调度程序配置
属性
yarn.scheduler.capacity。<queue-path> .capacity 设置可以访问属于DEFAULT分区的节点的队列百分比。每个父母下直系子女的默认能力总和必须等于100。
yarn.scheduler.capacity。<queue-path> .accessible-node-labels 管理员需要指定每个队列可以访问的标签,并用逗号分隔,例如“ hbase,storm”表示队列可以访问标签hbase和storm。所有队列都可以访问无标签的节点,用户不必指定。如果用户未指定此字段,它将从其父级继承。如果用户要明确指定一个队列,则只能访问没有标签的节点,只需在该值前放置一个空格即可。
yarn.scheduler.capacity。<queue-path> .accessible-node-labels。<label> .capacity 设置可以访问属于<label>分区的节点的队列的百分比。每个父级下直系孩子的<label>能力总和必须等于100。默认情况下为0。
yarn.scheduler.capacity。<queue-path> .accessible-node-labels。<label>。最大容量 类似于yarn.scheduler.capacity。<queue-path> .maximum-capacity,它用于每个队列的标签的最大容量。默认情况下为100。
yarn.scheduler.capacity。<队列路径> .default-node-label-expression 类似于“ hbase”的值,表示:如果应用程序提交到队列时未在资源请求中指定节点标签,它将使用“ hbase”作为default-node-label-expression。默认情况下为空,因此应用程序将从没有标签的节点获取容器。

节点标签配置的示例

假设我们有一个队列结构

                根
            / | \
     工程师销售营销

集群中有5个节点(主机名= h1..h5),每个节点都有24G内存和24个vcore。5个节点中有1个具有GPU(假设是h5)。因此,管理员在h5中添加了GPU标签。

假设用户具有如下的Capacity Scheduler配置:(在此处使用key = value以提高可读性)

yarn.scheduler.capacity.root.queues =工程,市场营销,销售
yarn.scheduler.capacity.root.engineering.capacity = 33
yarn.scheduler.capacity.root.marketing.capacity = 34
yarn.scheduler.capacity.root.sales.capacity = 33

yarn.scheduler.capacity.root.engineering.accessible-node-labels = GPU
yarn.scheduler.capacity.root.marketing.accessible-node-labels = GPU

yarn.scheduler.capacity.root.engineering.accessible-node-labels.GPU.capacity = 50
yarn.scheduler.capacity.root.marketing.accessible-node-labels.GPU.capacity = 50

yarn.scheduler.capacity.root.engineering.default-node-label-expression = GPU

您可以看到root.engineering/marketing/sales.capacity=33,因此它们每个人都可以保证等于资源的1/3 而不划分分区。因此他们每个人都可以使用h1..h4的1/3资源,即24 * 4 *(1/3)=(32G mem,32个v核)。

而且只有工程/销售队列有权访问GPU分区(请参阅root。<queue-name> .accessible-node-labels)。

每个工程/营销队列均已保证资源等于partition = GPU的资源的1/2 。因此他们每个人都可以使用h5的1/2资源,即24 * 0.5 =(12G mem,12个v-core)。

笔记:

  • 完成CapacityScheduler的配置后,执行yarn rmadmin -refreshQueues以应用更改
  • 进入RM Web UI的调度页面,查看配置是否成功。

指定应用程序的节点标签

应用程序可以使用以下Java API来指定要请求的节点标签

  • ApplicationSubmissionContext.setNodeLabelExpression(..)可以为应用程序的所有容器设置节点标签表达式。
  • ResourceRequest.setNodeLabelExpression(..)设置单个资源请求的节点标签表达式。这可以覆盖ApplicationSubmissionContext中设置的节点标签表达式
  • ApplicationSubmissionContext中指定setAMContainerResourceRequest.setNodeLabelExpression以指示应用程序主容器的预期节点标签。

监控方式

通过Web UI进行监控

在Web UI上可以看到以下与标签相关的字段:

通过命令行监控

  • 使用yarn cluster --list-node-labels获取簇中的标签
  • 使用yarn node -status <NodeId>获取节点状态,包括给定节点上的标签

有用的链接