我无法为我的火花应用程序设置environment variables
。我正在使用AWS EMR
来运行spark应用程序。这更像是我在python中编写的基于spark的框架,根据存在的环境变量运行多个spark作业。所以为了让我开始准确的工作,我需要将环境变量传递给spark-submit
。我尝试了几种方法来做到这一点。但它们都不起作用。当我尝试在应用程序中打印环境变量的值时,它返回空。
要在EMR中运行群集,我正在使用以下AWS CLI命令
aws emr create-cluster --applications Name=Hadoop Name=Hive Name=Spark --ec2-attributes '{"KeyName":"<Key>","InstanceProfile":"<Profile>","SubnetId":"<Subnet-Id>","EmrManagedSlaveSecurityGroup":"<Group-Id>","EmrManagedMasterSecurityGroup":"<Group-Id>"}' --release-label emr-5.13.0 --log-uri 's3n://<bucket>/elasticmapreduce/' --bootstrap-action 'Path="s3://<bucket>/bootstrap.sh"' --steps file://./.envs/steps.json --instance-groups '[{"InstanceCount":1,"InstanceGroupType":"MASTER","InstanceType":"c4.xlarge","Name":"Master"}]' --configurations file://./.envs/Production.json --ebs-root-volume-size 64 --service-role EMRRole --enable-debugging --name 'Application' --auto-terminate --scale-down-behavior TERMINATE_AT_TASK_COMPLETION --region <region>
现在Production.json
看起来像这样:
[
{
"Classification": "yarn-env",
"Properties": {},
"Configurations": [
{
"Classification": "export",
"Properties": {
"FOO": "bar"
}
}
]
},
{
"Classification": "spark-defaults",
"Properties": {
"spark.executor.memory": "2800m",
"spark.driver.memory": "900m"
}
}
]
steps.json
就像这样:
[
{
"Name": "Job",
"Args": [
"--deploy-mode","cluster",
"--master","yarn","--py-files",
"s3://<bucket>/code/dependencies.zip",
"s3://<bucket>/code/__init__.py",
"--conf", "spark.yarn.appMasterEnv.SPARK_YARN_USER_ENV=SHAPE=TRIANGLE",
"--conf", "spark.yarn.appMasterEnv.SHAPE=RECTANGLE",
"--conf", "spark.executorEnv.SHAPE=SQUARE"
],
"ActionOnFailure": "CONTINUE",
"Type": "Spark"
}
]
当我尝试访问__init__.py
代码中的环境变量时,它只是打印为空。正如您所看到的,我正在yarn cluster
中使用带有cluster mode
的spark运行该步骤。我通过这些链接来达到这个位置。
感谢您的帮助。
答案 0 :(得分:0)
使用分类yarn-env将环境变量传递到工作节点。
使用分类spark-env通过部署模式客户端将环境变量传递给驱动程序。使用部署模式集群时,请使用yarn-env。
(亲爱的主持人,如果您想删除帖子,请告诉我原因。)
答案 1 :(得分:-1)
要使用EMR群集,我使用AWS Lambda工作,创建一个在条件中设置标志时构建EMR群集的项目。
在这个项目中,我们定义了你可以在Lambda中设置的变量,然后将其替换为它的值。要使用它,我们必须使用AWS API。您必须使用的可能方法是AWSSimpleSystemsManagement.getParameters
。
然后,创建一个像val parametersValues = parameterResult.getParameters.asScala.map(k => (k.getName, k.getValue))
这样的地图,以获得一个名称和值的元组。
例如:${BUCKET} = "s3://bucket-name/
这意味着,您只需要在JSON $ {BUCKET}中写下您路径的所有名称。
一旦替换了值,步骤JSON就可以有这样的视图,
[
{
"Name": "Job",
"Args": [
"--deploy-mode","cluster",
"--master","yarn","--py-files",
"${BUCKET}/code/dependencies.zip",
"${BUCKET}/code/__init__.py",
"--conf", "spark.yarn.appMasterEnv.SPARK_YARN_USER_ENV=SHAPE=TRIANGLE",
"--conf", "spark.yarn.appMasterEnv.SHAPE=RECTANGLE",
"--conf", "spark.executorEnv.SHAPE=SQUARE"
],
"ActionOnFailure": "CONTINUE",
"Type": "Spark"
}
]
我希望这可以帮助您解决问题。