You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EMR使用bootstrap action安装boto3后应用部署失败,如何后置执行引导脚本?

问题根因

默认情况下EMR的引导操作(Bootstrap Action)执行时机早于内置应用(Hadoop/Spark等)的部署阶段,你在引导脚本中替换了Java、Python的系统默认版本,会导致后续Puppet部署内置组件时依赖版本不匹配,从而抛出你遇到的PuppetException报错。你在集群部署完成后手动执行脚本不会触发该问题,是因为此时内置应用已经部署完毕,修改软件版本不会再影响部署流程。

实现内置应用部署完成后执行脚本的方案

方案1:使用EMR步骤(Step)功能(最推荐,仅需在主节点执行脚本优先选这个)

EMR步骤的默认执行时机为集群所有内置应用部署完成、集群进入WAITING状态之后,完全符合你的需求。
你可以在创建集群时直接配置自定义步骤,调用command-runner.jar执行你的脚本,参考配置参数:

Type: CUSTOM_JAR
Jar: command-runner.jar
Args: bash,-c,"s3://<你的脚本存储桶路径>/自定义脚本.sh"
ActionOnFailure: 可根据需求选CONTINUE/TERMINATE_CLUSTER

也可以在集群创建完成后主动调用API添加步骤执行脚本。

方案2:引导脚本增加等待逻辑(需要所有节点都执行脚本优先选这个)

如果你需要所有节点(主节点/核心节点/任务节点)都执行该脚本,可以直接修改原引导脚本,在业务逻辑前增加等待部署完成的判断逻辑,EMR节点完成内置应用部署后会生成标记文件/tmp/provision-node-success,参考脚本片段:

# 等待内置应用部署完成
while [ ! -f /tmp/provision-node-success ]
do
  sleep 30
done
# 后续接你原本的安装Java11、Python3.7、boto3的逻辑

注意EMR引导操作默认超时时间为1小时,只要集群部署时间不超过该阈值就不会触发超时问题。

方案3:使用自定义AMI

你可以提前将需要的Java11、Python3.7、boto3等依赖打包进自定义AMI,创建EMR集群时直接指定该自定义AMI即可,完全避免部署阶段的依赖冲突。

内容的提问来源于stack exchange,提问作者Koenig Lear

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:06:01