我正在使用 emr-6.12.0 并尝试设置存储在 bootstrap.sh 文件中的秘密管理器中的环境变量。
SECRET_NAME="/myapp/dev/secrets"
SECRETS_JSON=$(aws secretsmanager get-secret-value --secret-id $SECRET_NAME --query SecretString --output text)
# Parse the secrets and set them as environment variables
for key in $(echo "$SECRETS_JSON" | jq -r "keys[]"); do
value=$(echo "$SECRETS_JSON" | jq -r ".$key // empty" | sed 's/"/\\"/g')
echo "$value"
if [ ! -z "$value" ]; then
export "$key"="$value"
fi
done
我可以在日志中看到这些值。
但是当我尝试从 pyspark 脚本访问这些变量时,我无法获取这些环境变量。
os.environ.get("POSTGRES_URL") // Returns None
for key, value in os.environ.items():
self.logger.info(f"{key}: {value}") // not able to see my env variables
由于我是 EMR 和 Spark 的新手,请帮助我了解如何将环境变量从 SSM 设置为 EMR。
在脚本中设置环境变量时,它们仅影响该脚本及其子进程的环境。在这种情况下,Spark 脚本可能在与
bootstrap.sh
脚本不同的进程中运行。
为了确保 Spark 脚本可以使用环境变量,您应该考虑在运行 Spark 作业之前获取
bootstrap.sh
脚本。这样,环境变量将在执行 Spark 脚本的同一 shell 会话中设置。
您可以将 Spark 脚本执行命令修改为如下所示:
source bootstrap.sh && spark-submit --master <spark_master> <spark_script.py>
这将确保
bootstrap.sh
中设置的环境变量可用于 Spark 脚本。