是否可以等到EMR群集终止?

时间:2019-06-13 20:00:05

标签: scala amazon-web-services apache-spark amazon-emr aws-step-config

我正在尝试编写一个组件,该组件将启动EMR集群,在该集群上运行Spark管道,然后在管道完成后关闭该集群。

到目前为止,我已经创建了集群并设置了允许我的主集群的工作机启动EMR集群的权限。但是,我在调试已创建的集群并等待管道结束之前一直在努力。这是我现在的代码。注意我正在使用Spark Scala,但这与标准Java代码非常接近:

val runSparkJob = new StepConfig()
  .withName("Run Pipeline")
  .withActionOnFailure(ActionOnFailure.TERMINATE_CLUSTER)
  .withHadoopJarStep(
    new HadoopJarStepConfig()
      .withJar("/path/to/jar")
      .withArgs(
        "spark-submit",
        "etc..."
      )
  )

// Create a cluster and run the Spark job on it
val clusterName = "REDACTED Cluster"
val createClusterRequest =
  new RunJobFlowRequest()
    .withName(clusterName)
    .withReleaseLabel(Configs.EMR_RELEASE_LABEL)
    .withSteps(enableDebugging, runSparkJob)
    .withApplications(new Application().withName("Spark"))
    .withLogUri(Configs.LOG_URI_PREFIX)
    .withServiceRole(Configs.SERVICE_ROLE)
    .withJobFlowRole(Configs.JOB_FLOW_ROLE)
    .withInstances(
      new JobFlowInstancesConfig()
        .withEc2SubnetId(Configs.SUBNET)
        .withInstanceCount(Configs.INSTANCE_COUNT)
        .withKeepJobFlowAliveWhenNoSteps(false)
        .withMasterInstanceType(Configs.MASTER_INSTANCE_TYPE)
        .withSlaveInstanceType(Configs.SLAVE_INSTANCE_TYPE)
    )

val newCluster = emr.runJobFlow(createClusterRequest)

我有两个具体问题:

  1. emr.runJobFlow的调用在提交结果后立即返回。有什么方法可以阻止它,直到关闭群集,或者等到工作流结束为止?

  2. 我的集群实际上没有启动,当我进入AWS Console -> EMR -> Events视图时,我看到了失败:

    Amazon EMR Cluster j-XXX (REDACTED...) has terminated with errors at 2019-06-13 19:50 UTC with a reason of VALIDATION_ERROR.

我可以通过任何方式在Java / Scala应用程序中以编程方式解决此错误吗?

1 个答案:

答案 0 :(得分:2)

是的,很有可能要等到EMR集群终止。

waiters会阻止执行,直到集群(即作业流)达到特定状态为止。

val newCluster = emr.runJobFlow(createClusterRequest);
val describeRequest = new DescribeClusterRequest()
    .withClusterId(newCluster.getClusterId())

// Wait until terminated
emr.waiters().clusterTerminated().run(new WaiterParameters(describeRequest))

此外,如果要获取群集的状态(即作业流),则可以调用EMR客户端的describeCluster函数。查看链接的文档,您可以获取有关集群的状态和状态信息,以确定集群是成功还是错误。

val result = emr.describeCluster(describeRequest)

注意:不是最好的Java-er,所以以上是我的最佳猜测,以及如何根据文档进行工作,但我尚未测试以上内容。