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
相关产品推荐
相关产品推荐

