使用步骤功能运行AWS EMR集群

时间:2019-10-14 17:01:11

标签: amazon-web-services amazon-emr state-machine aws-step-functions

我对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
    }
  }
}

以下工作流程图显示了哪个 enter image description here

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集群在完成运行后终止。

我知道这个问题可能涉及很多问题,但是对于上述任何问题的任何帮助,我将不胜感激。无论是遵循我上面概述的结构,还是了解其他解决方案,我都乐于提供任何形式的帮助。预先谢谢你。

2 个答案:

答案 0 :(得分:0)

'KeepJobFlowAliveWhenNoSteps':错误

将以上配置添加到emr集群创建脚本中。所有步骤完成后,它将自动终止emr群集 emr boto3 config enter image description here

答案 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 .:如果您正在使用终止保护,则在终止群集之前,您需要采取额外的步骤将其关闭;)