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

如何向EMR Serverless运行的PySpark项目传递环境变量?

向EMR Serverless传递环境变量的正确方式

直接在代码里用os.environ['ENV_FOR_DYNACONF'] = 'platform'不生效的核心原因是:Dynaconf在初始化阶段就会读取环境变量,你的代码设置时机晚于它的加载流程,所以无法被识别。下面是几种可靠的解决方法:

方法1:提交任务时直接指定环境变量

无论是通过AWS CLI还是EMR Serverless控制台提交任务,都可以直接传递环境变量:

  • AWS CLI方式:添加--environment-variables参数,传入JSON格式的键值对:
    aws emr-serverless start-job-run \
      --application-id <你的应用ID> \
      --execution-role-arn <你的执行角色ARN> \
      --job-driver '{
          "sparkSubmit": {
              "entryPoint": "s3://你的代码存储路径/main.py"
          }
      }' \
      --environment-variables '{"ENV_FOR_DYNACONF": "platform"}'
    
  • 控制台方式:在任务配置的「环境变量」板块,直接添加ENV_FOR_DYNACONF=platform键值对即可。

方法2:通过Spark配置让变量在Driver和Executor都生效

如果你的Executor进程也需要读取这个环境变量(比如分布式任务中Executor的代码用到Dynaconf),需要通过Spark的专属配置传递:
在提交任务的sparkSubmitParameters中添加spark.driverEnv.*和spark.executorEnv.*配置:

aws emr-serverless start-job-run \
  --application-id <你的应用ID> \
  --execution-role-arn <你的执行角色ARN> \
  --job-driver '{
      "sparkSubmit": {
          "entryPoint": "s3://你的代码存储路径/main.py",
          "sparkSubmitParameters": "--conf spark.driverEnv.ENV_FOR_DYNACONF=platform --conf spark.executorEnv.ENV_FOR_DYNACONF=platform"
      }
  }'

这种方式会让环境变量同时在Driver和所有Executor进程中生效。

方法3:在Dynaconf配置文件中预设默认值

如果不想每次提交任务都手动指定环境变量,可以在Dynaconf的配置文件中设置默认值:

  • 在settings.toml中添加:
    [default]
    ENV_FOR_DYNACONF = "platform"
    
  • 或者在.env文件中添加:
    ENV_FOR_DYNACONF=platform
    

将配置文件和代码打包后上传到S3,Dynaconf初始化时会自动读取这些预设值。

注意:方法1的环境变量仅在Driver进程生效,若Executor也需要该变量,优先选择方法2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:27:11