YARN 节点属性

概述

节点属性是一种描述节点属性的方法,无需资源保证。应用程序可以使用它来根据这些属性的多种表达方式选择适合其容器放置的正确节点。

功能

节点属性的显著功能如下

  • 一个节点可以与多个属性关联。
  • 值可以与标记到节点的属性相关联。目前仅支持字符串类型的值。
  • 与节点标签不同,无需在集群级别显式指定节点属性,但有 API 可列出集群级别可用的属性。
  • 由于其非有形资源,因此不与任何队列关联,因此属性不需要队列资源规划和授权。
  • 与分配标签类似,应用程序将能够使用包含一个或多个这些属性的表达式来请求容器,方法是使用放置约束
  • 等于 (=) 和不等于 (!=) 是表达式中唯一支持的操作符。AND & OR 也可以用作属性表达式的组成部分。
  • 节点属性约束是硬限制,这意味着只有当节点满足节点属性约束时才能进行分配。换句话说,请求会一直挂起,直到找到满足约束的有效节点。目前没有放松策略。
  • 可操作性
    • 节点属性及其与节点的映射可以在 RM 重新启动后恢复
    • 更新节点属性 - 当 RM 正在运行时,管理员可以在节点上添加、删除和替换属性
  • NM 到节点属性的映射可以通过两种方式完成,
    • 集中式:节点到属性的映射可以通过 RM 公开的 CLI 或 RPC(REST 尚未支持)完成。
    • 分布式:节点到属性的映射将由 NM 中配置的节点属性提供程序设置。我们在 YARN 中有两个不同的提供程序:基于脚本的提供程序和基于配置的提供程序。如果是脚本,则可以将 NM 配置为使用脚本路径,并且该脚本可以发出节点的属性。如果是配置,则可以在 NM 的 yarn-site.xml 中直接配置节点属性。在这两个选项中都支持属性映射的动态刷新。
  • 与标签不同,属性可以同时从集中式和分布式模式映射到节点。由于属性在不同模式下使用不同的前缀进行标识,因此不会发生冲突。如果是集中式属性,则使用前缀“rm.yarn.io”进行标识,如果是分布式属性,则使用前缀“nm.yarn.io”进行标识。这意味着属性由前缀名称唯一标识。

配置

为节点属性设置 ResourceManager

与节点标签不同,节点属性不需要显式启用,因为它始终存在,即使不使用该功能,也不会对性能或兼容性产生影响。

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

属性 默认值
yarn.node-attribute.fs-store.root-dir 存储集中属性映射的路径 file:///tmp/hadoop-yarn-${user}/node-attribute/
yarn.node-attribute.fs-store.impl.class 配置的类需要扩展 org.apache.hadoop.yarn.nodelabels.NodeAttributeStore FileSystemNodeAttributeStore

注释

  • 确保 yarn.node-attribute.fs-store.root-dir 是使用资源管理器进程用户创建的,并且 ResourceManager 具有访问权限。(通常来自“yarn”用户)
  • 如果用户想将节点属性存储到 RM 的本地文件系统,可以使用 file:///home/yarn/node-attributes 之类的路径,否则如果在 hdfs 中可以使用 hdfs://namenode:port/path/to/store/node-attributes/ 之类的路径。

集中节点属性映射。

集中方法中支持三种选项来将属性映射到节点

  • add 执行 yarn nodeattributes -add “node1:attribute[(type)][=value],attribute2 node2:attribute2[=value],attribute3 会将属性添加到节点,而不会影响节点上已存在的映射。

  • remove 执行 yarn nodeattributes -remove “node1:attribute,attribute1 node2:attribute2" 会将属性从节点中删除,而不会影响节点上已存在的映射。

  • replace 执行 yarn nodeattributes -replace “node1:attribute[(type)][=value],attribute1[=value],attribute2 node2:attribute2[=value],attribute3"" 会用作为此命令一部分配置的属性替换节点的现有属性。

注释

  • 不需要提及端口,属性会映射到节点中的所有 NM 实例。
  • 空格是多个节点-属性映射对的分隔符
  • “,” 用作节点的多个属性的分隔符。
  • “type” 如果未指定,则默认为字符串,这是当前支持的唯一类型。
  • 以上所有 3 个操作只能由管理员用户执行。

分布式节点属性映射。

分布式模式下将属性配置到节点

属性
yarn.nodemanager.node-attributes.provider 管理员可以通过在 NM 中配置此参数来配置节点属性的提供程序。管理员可以配置提供程序的“config”“script”类名。配置的类需要扩展 org.apache.hadoop.yarn.server.nodemanager.nodelabels.NodeAttributesProvider。如果配置了“config”,则会使用 “ConfigurationNodeAttributesProvider”,如果配置了“script”,则会使用 “ScriptBasedNodeAttributesProvider”
yarn.nodemanager.node-attributes.provider.fetch-interval-ms “yarn.nodemanager.node-attributes.provider” 配置为 “config”“script”配置类 扩展 NodeAttributesProvider 时,将定期从节点属性提供程序检索节点属性。此配置用于定义间隔周期。如果配置为 -1,则仅在初始化期间从提供程序检索节点属性。默认为 10 分钟。
yarn.nodemanager.node-attributes.provider.fetch-timeout-ms “yarn.nodemanager.node-attributes.provider” 配置为 “script” 时,此配置提供超时周期,在此之后它将中断查询节点属性的脚本。默认为 20 分钟。
yarn.nodemanager.node-attributes.provider.script.path NM 运行的节点属性脚本用于收集节点属性。脚本输出中以 “NODE_ATTRIBUTE:” 开头的行将被视为节点属性记录,属性名称、类型和值应以逗号分隔。每行都将被解析为一个节点属性。
yarn.nodemanager.node-attributes.provider.script.opts 传递给节点属性脚本的参数。
yarn.nodemanager.node-attributes.provider.configured-node-attributes 当 “yarn.nodemanager.node-attributes.provider” 配置为 “config” 时,ConfigurationNodeAttributesProvider 从此参数中获取节点属性。

为应用程序指定节点属性

应用程序可以使用放置约束 API 来指定节点属性请求,如 放置约束文档 中所述。

以下是一个使用节点属性表达式的创建调度请求对象的示例

//expression : AND(python!=3:java=1.8)
SchedulingRequest schedulingRequest =
    SchedulingRequest.newBuilder().executionType(
        ExecutionTypeRequest.newInstance(ExecutionType.GUARANTEED))
        .allocationRequestId(10L).priority(Priority.newInstance(1))
        .placementConstraintExpression(
            PlacementConstraints.and(
                PlacementConstraints
                    .targetNodeAttribute(PlacementConstraints.NODE,
                        NodeAttributeOpCode.NE,
                        PlacementConstraints.PlacementTargets
                            .nodeAttribute("python", "3")),
                PlacementConstraints
                    .targetNodeAttribute(PlacementConstraints.NODE,
                        NodeAttributeOpCode.EQ,
                        PlacementConstraints.PlacementTargets
                            .nodeAttribute("java", "1.8")))
                .build()).resourceSizing(
        ResourceSizing.newInstance(1, Resource.newInstance(1024, 1)))
        .build();

上述 SchedulingRequest 请求 1 个容器,该容器必须满足以下约束

  1. 节点属性 rm.yarn.io/python 不存在于节点上,或存在但其值不等于 3

  2. 节点属性 rm.yarn.io/java 必须存在于节点上,且其值等于 1.8

监控

通过 REST 监控

作为 http://rm-http-address:port/ws/v1/cluster/nodes/{nodeid} REST 输出的一部分,可以获取映射到给定节点的属性及其值。

通过 Web UI 监控

尚未支持

通过命令行监控

  • 使用 yarn cluster --list-node-attributes 获取集群中的所有属性
  • 使用 yarn nodeattributes -list 获取集群中的属性
  • 使用 yarn nodeattributes -attributestonodes -attributes <Attributes> 为每个属性列出所有映射的节点以及为每个节点配置的属性值。我们还可以使用 -attributes 为指定属性指定。
  • 使用 yarn nodeattributes -nodestoattributes -nodes <Host Names> 列出映射到节点的所有属性及其值。我们还可以使用 -nodes 为指定节点指定。
  • yarn node -status 获取的节点状态/详细信息将列出与节点关联的所有属性及其值。

有用的链接