我正在尝试编写一个组件,该组件将启动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)
我有两个具体问题:
对emr.runJobFlow
的调用在提交结果后立即返回。有什么方法可以阻止它,直到关闭群集,或者等到工作流结束为止?
我的集群实际上没有启动,当我进入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应用程序中以编程方式解决此错误吗?
答案 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,所以以上是我的最佳猜测,以及如何根据文档进行工作,但我尚未测试以上内容。