如何从提交的Spark应用程序步骤中获取AWS EMR集群ID和步骤ID

时间:2020-09-12 17:23:18

标签: amazon-web-services scala apache-spark amazon-emr

场景:
我正在AWS EMR中运行Spark Scala作业。现在,我的工作转储了该应用程序特有的一些元数据。现在要进行转储,我在位置“ s3:// bucket / key / ”处编写,其中ApplicationId为 val APPLICATION_ID: String = getSparkSession.sparkContext.getConf.getAppId

现在基本上可以在s3位置写类似“ s3:// bucket / key / _ ”的方法。 如何从Spark Scala应用程序内部获取集群ID和步骤ID。

以这种方式编写将帮助我进行调试,并帮助我基于群集和调试日志。

除了读取“ /mnt/var/lib/info/job-flow.json”以外,还有其他方法吗?

PS:我是Spark,scala和emr的新手。如果这是很明显的查询,请提前道歉。

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,无法通过编程方式获取cluster-id。我通过使用emrClient的listClusters()方法结束了。

您可以使用适用于AWS的Java SDK或在其之上使用Scala wrapper来使用此方法。

答案 1 :(得分:0)

除了A.B的答案之外,您还可以将群集ID传递给listSteps方法,以获取步骤ID的列表,如下所示:

emrClient.listSteps(new ListStepsRequest().withClusterId(jobFlowId)).getSteps()

答案 2 :(得分:0)

对于 EMR 上的 PySpark,EMR_CLUSTER_IDEMR_STEP_ID 可用作环境变量(已在 emr-5.30.1 上确认)。

它们可以在代码中使用如下:

import os
emr_cluster_id = os.environ.get('EMR_CLUSTER_ID')
emr_step_id = os.environ.get('EMR_STEP_ID')

我无法测试,但以下类似的代码应该可以在 Scala 中使用。

val emr_cluster_id = sys.env.get("EMR_CLUSTER_ID")
val emr_step_id = sys.env.get("EMR_STEP_ID")

由于 sys.env 只是一个 Map[String, String],它的 get 方法返回一个 Option[String],如果这些环境变量不存在,它不会失败。如果您想引发异常,您可以使用 sys.env("EMR_x_ID")

EMR_CLUSTER_IDEMR_STEP_ID 变量在环境选项卡下的 Spark History Server UI 中可见,以及其他可能感兴趣的变量。

相关问题