AWS Step Functions调用EMR执行PySpark任务报错spark-submit不存在如何解决
错误原因
你遇到的Cannot run program "spark-submit" error=2, No such file or directory报错,本质是EMR执行Step时,进程的环境变量PATH中没有包含Spark二进制文件的安装路径,无法找到spark-submit执行文件,常见触发场景有两个:
- 提交Step时EMR集群还处于启动中,Spark组件未完成部署,全局环境变量还未加载完成
- Step定义中直接调用
spark-submit相对命令,没有指定全路径,command-runner无法定位执行文件
正确配置步骤
步骤1:确保Step提交时机正确
如果你是在Step Functions工作流中先创建EMR集群再提交任务,必须使用sync模式的创建集群资源arn:aws:states:::elasticmapreduce:createCluster.sync,该资源会等待集群完全进入可用(WAITING)状态后再进入下一个步骤,避免集群未初始化完成就提交任务。
步骤2:修改Step定义使用spark-submit全路径
EMR默认场景下spark-submit的全路径为/usr/bin/spark-submit,直接替换Step定义中Args的第一个参数即可,修改后的完整Step配置如下:
"EMR AddStep - Aggregate Daily": { "Type": "Task", "Resource": "arn:aws:states:::elasticmapreduce:addStep.sync", "Parameters": { "ClusterId.$": "$.cluster.Cluster.Id", "Step": { "Name": "Aggregate Daily", "ActionOnFailure": "CONTINUE", "HadoopJarStep": { "Jar": "command-runner.jar", "Args": [ "/usr/bin/spark-submit", "--deploy-mode", "cluster", "s3://emr/scripts/aggregate.py", "--day", "20210915", "--base_uri", "s3://" ] } } } }
如果使用自定义AMI修改过Spark安装路径,可以先SSH登录EMR主节点执行which spark-submit获取准确全路径后替换。
备选兼容方案
如果修改全路径后仍有环境变量加载问题,可以改为调用bash加载全局配置后执行spark-submit,Args配置如下:
"Args": [ "bash", "-c", "source /etc/profile && spark-submit --deploy-mode cluster s3://emr/scripts/aggregate.py --day 20210915 --base_uri s3://" ]
该方案会先加载系统全局环境变量,确保Spark相关路径被正确加载到运行时环境中。
内容的提问来源于stack exchange,提问作者Maynard Keynes
相关产品推荐
相关产品推荐

