如何在AWS EMR中为任务节点添加自定义节点标签并关联自动扩容节点
AWS EMR 配置YARN节点标签实现Spark Executor仅运行在Spot任务节点方案
通过YARN节点标签隔离Spot任务节点与其他类型节点,Spark提交时指定对应标签即可强制Executor调度到Spot实例,可有效降低集群运行成本,具体配置步骤如下:
目标1:集群启动时添加自定义YARN标签
- 第一步:在EMR集群启动的软件配置模块,新增YARN配置项,配置JSON如下:
[ { "Classification": "yarn-site", "Properties": { "yarn.node-labels.enabled": "true", "yarn.node-labels.manager-class": "org.apache.hadoop.yarn.server.resourcemanager.nodelabels.RMNodeLabelsManager", "yarn.node-labels.fs-store.root-dir": "/yarn/node-labels", "yarn.resourcemanager.node-labels.provider": "org.apache.hadoop.yarn.nodelabels.ConfiguredNodeLabelsProvider" } } ]
- 第二步:新增自定义引导操作,为所有任务节点绑定预设标签(示例标签名为
spot_executor),引导脚本内容如下:
#!/bin/bash # 提前在引导脚本中安装jq,用于解析实例元数据 sudo yum install -y jq # 仅任务节点(TASK类型)绑定标签 if [ "$(cat /mnt/var/lib/info/instance.json | jq -r '.instanceGroupType')" = "TASK" ]; then echo "<property><name>yarn.node-labels</name><value>spot_executor</value></property>" >> /etc/hadoop/conf/yarn-site.xml sudo systemctl restart hadoop-yarn-nodemanager fi
- 第三步:集群启动完成后,登录资源管理器主节点执行命令初始化集群标签:
yarn rmadmin -addToClusterNodeLabels "spot_executor(exclusive=false)"
其中exclusive参数设为false表示标签节点空闲时允许其他无标签任务调度,设为true则完全独占,仅允许指定标签的任务运行。
目标2:自动扩容节点自动关联YARN标签
EMR的托管扩容、自定义自动扩容策略触发新增的任务节点,会自动执行上述配置的引导操作脚本,脚本会自动识别实例组类型为TASK后自动绑定标签、重启NodeManager服务,无需额外配置。
如果使用实例舰队模式部署任务组,仅需在任务舰队的配置中关联上述引导操作即可,所有扩容生成的Spot实例都会自动绑定spot_executor标签。
Spark作业调度配置
完成上述配置后,在spark-submit阶段添加如下参数,即可强制所有Spark Executor调度到Spot任务节点:
spark-submit \ --master yarn \ --deploy-mode cluster \ --conf spark.yarn.am.nodeLabelExpression= \ --conf spark.yarn.executor.nodeLabelExpression=spot_executor \ 你的作业Jar包及业务参数
这里spark.yarn.am.nodeLabelExpression留空表示Application Master可调度到核心节点,避免Spot实例回收导致作业整体失败。
配置验证
可通过YARN ResourceManager UI查看所有节点的标签分配情况,提交测试作业后,确认Executor运行的节点均属于TASK实例组的Spot实例即可。
内容的提问来源于stack exchange,提问作者Rahul Garg
相关产品推荐
相关产品推荐

