概述
节点属性是一种描述节点的方式没有资源保障。可以用来让应用挑选正确的节点
特性
节点属性有一下几个特性:
- 一个节点可以有多个属性
- 值可以与标记到节点的属性相关联,目前只支持字符串
- 和node label不一样,node属性不需要在集群级别显示指定,但是有api可以列出集群级别的属性
- 作为无形的资源,并不关联任何队列和对应的资源,属性也不需要授权
- 和分配tag类似,应用使用这些属性决定容器的位置
- 目前只支持等于和不等于
- 节点属性是硬限制,也就是说只有的完全符合的情况的才能分配。也就是说,请求会被一直挂起知道约束被满足。
- 操作性:
- 节点属性和对应的node会在RM重启的时候恢复
- 更新节点属性,在RM运行是,admin可以增加,删除修改属性。
- 有2种方式NM到node属性的映射
- 中心化:通过CLI,RPC,映射节点和节点属性
- 分布式:通过NM中的Node Attributes Provider映射
- 不想labels,属性可以同时使用中心化和分布式。
配置
设置ResourceManager的节点属性
配置在yarn-site.xml中
属性 | 描述 |
---|---|
yarn.node-attribute.fs-store.root-dir | 中心化节点属性映射存放的目录 |
yarn.node-attribute.fs-store.impl.class | 配置org.apache.hadoop.yarn.nodelabels.NodeAttributeStore |
注意:
- 目录需要配置成RM有权限访问的目录
- 如果是本地文件系统设置为file:///home/yarn/node-attributes ,hdfs目录:
hdfs://namenode:port/path/to/store/node-attributes/
中心化节点属性映射
- 增加:yarn nodeattributes -add “node1:attribute[(type)][=value],attribute2 node2:attribute2[=value],attribute3
- 删除:yarn nodeattributes -remove “node1:attribute,attribute1 node2:attribute2"
- 更新:yarn nodeattributes -replace “node1:attribute[(type)][=value],attribute1[=value],attribute2 node2:attribute2[=value],attribute3"
分布式属性映射
分布式映射,是通过配置的:
属性 | 描述 |
---|---|
yarn.nodemanager.node-attributes.provider | NM中node属性provider,script,config或者类名 |
yarn.nodemanager.node-attributes.provider.fetch-interval-ms | 定期获取节点属性的时间 |
yarn.nodemanager.node-attributes.provider.fetch-timeout-ms | 如果script,超时之后会被中断,超时时间 |
yarn.nodemanager.node-attributes.provider.script.path | script路径 |
yarn.nodemanager.node-attributes.provider.script.opts | 脚本需要的参数 |
yarn.nodemanager.node-attributes.provider.configured-node-attributes | 当配置为config时,从参数获取节点属性 |
指定应用的节点属性
//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();
监控
REST:http://rm-http-address:port/ws/v1/cluster/nodes/{nodeid}
web UI:还不支持
通过命令行:
- yarn cluster --list-node-attributes,从集群中获取所有属性
- yarn nodeattributes -list 获取求你中的属性
- yarn nodeattributes -attributestonodes -attributes
,单个属性配置的所有nodes - yarn nodeattributes -nodestoattributes -nodes
一个node的所有属性 - yarn node -status 关联了这个值的node的所有属性