我对AWS Step Functions和AWS Lambda Functions非常陌生,确实可以使用一些帮助来使EMR集群通过Step Functions运行。以下代码显示了我当前的状态机结构的示例
{
"Comment": "This is a test for running the structure of the CustomCreate job.",
"StartAt": "PreStep",
"States": {
"PreStep": {
"Comment": "Check that all the necessary files exist before running the job.",
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:XXXXXXXXXX:function:CustomCreate-PreStep-Function",
"Next": "Run Job Choice"
},
"Run Job Choice": {
"Comment": "This step chooses whether or not to go forward with running the main job.",
"Type": "Choice",
"Choices": [
{
"Variable": "$.FoundNecessaryFiles",
"BooleanEquals": true,
"Next": "Spin Up Cluster"
},
{
"Variable": "$.FoundNecessaryFiles",
"BooleanEquals": false,
"Next": "Do Not Run Job"
}
]
},
"Do Not Run Job": {
"Comment": "This step triggers if the PreStep fails and the job should not run.",
"Type": "Fail",
"Cause": "PreStep unsuccessful"
},
"Spin Up Cluster": {
"Comment": "Spins up the EMR Cluster.",
"Type": "Pass",
"Next": "Update Env"
},
"Update Env": {
"Comment": "Update the environment variables in the EMR Cluster.",
"Type": "Pass",
"Next": "Run Job"
},
"Run Job": {
"Comment": "Add steps to the EMR Cluster.",
"Type": "Pass",
"End": true
}
}
}
PreStep 和 Run Job Choice 任务使用一个简单的Lambda函数来检查运行此作业所需的文件是否在我的S3存储桶中,然后旋转如果找到了必需的文件,则该群集。这些任务正常运行。
我不确定如何处理EMR群集相关步骤。
在我当前的结构中,第一个任务是启动EMR集群。这可以通过直接使用Step Function JSON来完成,或者最好使用我位于S3存储桶上的JSON集群配置文件(标题为EMR-cluster-setup.json
)来完成。
我的下一个任务是更新EMR群集环境变量。我在S3存储桶上有一个.sh
脚本可以执行此操作。我的S3存储桶上还有一个JSON文件(标题为EMR-RUN-Script.json
),该文件将向EMR集群添加第一步,该集群将运行并提供.sh
脚本。我只需要从EMR群集中运行该JSON文件,就不知道如何使用“步进功能”来运行该JSON文件。 EMR-RUN-SCRIPT.json
的代码如下所示
[
{
"Name": "EMR-RUN-SCRIPT",
"ActionOnFailure": "CONTINUE",
"HadoopJarStep": {
"Jar": "s3://us-east-1.elasticmapreduce/libs/script-runner/script-runner.jar",
"Args": [
"s3://PATH/TO/env_configs.sh"
]
}
}
]
我的第三个任务是向EMR集群添加一个包含spark-submit命令的步骤。位于我的S3存储桶上的JSON配置文件(标题为EMR-RUN-STEP.json
)中描述了此命令,该文件可以以与上一步中上传环境配置文件类似的方式上载到EMR群集。 EMR-RUN-STEP.json
的代码如下所示
[
{
"Name": "EMR-RUN-STEP",
"ActionOnFailure": "CONTINUE",
"HadoopJarStep": {
"Jar": "command-runner.jar",
"Args": [
"bash", "-c",
"source /home/hadoop/.bashrc && spark-submit --master yarn --conf spark.yarn.submit.waitAppCompletion=false --class CLASSPATH.TO.MAIN s3://PATH/TO/JAR/FILE"
]
}
}
]
最后,我要执行一项任务,以确保EMR集群在完成运行后终止。
我知道这个问题可能涉及很多问题,但是对于上述任何问题的任何帮助,我将不胜感激。无论是遵循我上面概述的结构,还是了解其他解决方案,我都乐于提供任何形式的帮助。预先谢谢你。
答案 0 :(得分:0)
'KeepJobFlowAliveWhenNoSteps':错误
将以上配置添加到emr集群创建脚本中。所有步骤完成后,它将自动终止emr群集 emr boto3 config
答案 1 :(得分:0)
您需要终止集群步骤, 如文档所述: https://docs.aws.amazon.com/step-functions/latest/dg/connect-emr.html
createCluster uses the same request syntax as runJobFlow, except for the following:
The field Instances.KeepJobFlowAliveWhenNoSteps is mandatory,
and must have the Boolean value TRUE.
因此,您需要执行以下步骤: TerminateCluster.sync-对我来说,这比简单的terminateCluster更可取,因为它等待集群实际终止,并且您可以在此处处理任何挂起-您将使用标准步骤功能,因此不会花费额外的时间计费
Shuts down a cluster (job flow).
terminateJobFlows The same as terminateCluster, but waits for the cluster to terminate.
ps .:如果您正在使用终止保护,则在终止群集之前,您需要采取额外的步骤将其关闭;)