1. 整体思路
YARN Node Labels特性支持将YARN NodeManager节点进行分区管理,通过创建新的exclusive分区,将每次要下线的节点剥离出DEFAULT分区,添加到exclusive分区,不再调度任务上去,待存量任务运行结束后,执行nodemanager和datanode的下线,ecs宿主机迁移,nodemanager和datanode上线,移出exclusive分区作为集群计算资源使用。
2. 操作及验证过程
2.1. 集群环境
EMR版本:EMR-3.44.1(不适用控制台管理yarn分区,详见:https://help.aliyun.com/zh/emr/emr-on-ecs/user-guide/manage-yarn-partitions-in-the-emr-console?spm=a2c4g.11186623.0.0.5b551bc8FQTfVZ)
调度器:yarn.resourcemanager.scheduler.class=org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
数据存储位置:oss or hdfs
数据副本数量:dfs.replication=2(如果数据都存在oss,由oss负责数据的高可用,可以忽略这个限制,不然每次最多下线dfs.replication-1台节点,防止点儿背导致某一个block的数据一次性被下掉)
2.2. yarn参数配置
新增配置项:
yarn.node-labels.enabled=true
yarn.node-labels.fs-store.root-dir=/tmp/node-labels
yarn.node-labels.configuration-type=centralized(默认就是这个)
添加后滚动重启yarn resourcemanager适配新的参数
2.3. 创建分区-映射节点
# 登录master节点 ssh root@master-1-1的ip # 切换yarn默认管理员hadoop账户执行 sudo su hadoop # 添加DEMO分区 默认为exclusive(见下图) yarn rmadmin -addToClusterNodeLabels "DEMO"
yarn ui上验证Node Labels是否添加成功(见下图)
# 列出所有节点 yarn node -list -all # 根据要下线节点的ecs id 匹配到节点名称core-x-x 添加到该分区中 # 样例命令如下 # 注意如果复制上面list中的node名不要加端口号 会报找unknown nodes yarn rmadmin -replaceLabelsOnNode "core-1-1.集群id.cn-beijing.emr.aliyuncs.com=DEMO" -failOnUnknownNodes
yarn ui上可以验证Nodes及其Node Labels(见下图1)
在Node Labels页签下可以看到“DEMO”的Label下active的 NMs数量已经从0变为1
配置分区容量及默认分区:
- 根据文档需要在EMR管控台上配置capacity-scheduler.xml,主要是用来配置队列在label分区的容量,默认提交分区等配置。
- 因为我们配置DEMO分区主要是分配要下线的节点,且分区为exclusive的模式,不会让任务调度上去,验证了下不做配置也可以。配置的话 yarn.scheduler.capacity.root.default.default-node-label-expression 千万不能配置到DEMO,不然会有任务发上去。
2.4. 下线节点
EMR控制台:
- Yarn nodamanager 下线
- HDFS datanode 停止
2.5. ECS迁移
ECS迁移
2.6. 添加节点
EMR控制台:
- HDFS datanode启动
- Yarn nodemanager recommission
2.7. 节点移出分区
# ssh登录master节点 yarn rmadmin -replaceLabelsOnNode "core-1-1.c-75d9260b2816cfbe.cn-beijing.emr.aliyuncs.com=" -failOnUnknownNodes # 观察该节点在yarn ui上的label是否为空(DEFAULT) # 观察一段时间后yarn ui上该节点是否有container 运行(有任务发到该节点)
3. 验证运行中的任务
验证1:节点手动切换到DEMO分区上面的任务是否会failed
将某个节点从DEFAULT分区修改为DEMO分区时,如果该节点上在DEFAULT分区中还有正在RUNNING的任务,切换节点到DEMO分区:
- 窗口1执行(提交到default分区)
# 在map=100 reduce=0时候 (大约使用16核资源) hadoop jar hadoop-mapreduce-examples-2.8.5.jar wordcount /tmp/input /tmp/output18
- 窗口2 执行
# (将节点core-1-2剥离default分区) yarn rmadmin -replaceLabelsOnNode "core-1-2.集群id.cn-beijing.emr.aliyuncs.com=DEMO" -failOnUnknownNodes
- yarn队列上可以观察到 default分区 over capacity 。demo分区有使用
- wordcount任务执行成功
验证2:wordcount运行时间整体较小,约10分钟,所以用mr的sleep进行了2次验证,看节点被移动到DEMO分区任务是否会failed
- 执行sleep mr任务
hadoop jar hadoop-mapreduce-client-jobclient-2.8.5-tests.jar sleep -m 10 -r 10 -mt 1000 -rt 15000000
- 任务跑满(93%)DEFAULT队列时进行节点分区切换
yarn rmadmin -replaceLabelsOnNode "core-1-2.c-75d9260b2816cfbe.cn-beijing.emr.aliyuncs.com=DEMO" -failOnUnknownNodes # (将节点core-1-2剥离default分区),也出现over capacity的情况
- 第二天观察任务没有failed,还在running,DEMO分区没有资源占用,执行了约12小时,可以验证执行的任务不会短时间内(1小时)被驱逐致使任务failed