Amazon web services 使用Step函数运行AWS EMR群集

Amazon web services 使用Step函数运行AWS EMR群集,amazon-web-services,amazon-emr,state-machine,aws-step-functions,Amazon Web Services,Amazon Emr,State Machine,Aws Step Functions,我对AWS Step函数和AWS Lambda函数非常陌生,需要一些帮助才能让EMR集群通过Step函数运行。下面的代码显示了我当前状态机结构的一个示例 { "Comment": "This is a test for running the structure of the CustomCreate job.", "StartAt": "PreStep", "States": { "PreStep": { "Comment": "Check that all t

我对AWS Step函数和AWS Lambda函数非常陌生,需要一些帮助才能让EMR集群通过Step函数运行。下面的代码显示了我当前状态机结构的一个示例

{
  "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
    }
  }
}
如下图所示

PreStepRun Job Choice任务使用一个简单的Lambda函数来检查运行此作业所需的文件是否存在于我的S3存储桶中,然后在找到必要的文件后转到启动集群。这些任务工作正常

我不确定的是如何处理与EMR集群相关的步骤

在我目前的结构中,第一个任务是启动EMR集群。这可以通过直接使用Step函数JSON来实现,或者最好使用我在S3存储桶上找到的JSON集群配置文件(标题为
EMR Cluster setup.JSON

我的下一个任务是更新EMR集群环境变量。我的S3存储桶上有一个
.sh
脚本,可以执行此操作。我还有一个JSON文件(标题为
EMR RUN Script.JSON
),位于我的S3存储桶中,它将为运行和生成
.sh
脚本的EMR集群添加第一步。我只需要从EMR集群中运行该JSON文件,我不知道如何使用Step函数。
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"
            ]
        }
    }
]
[
    {
        "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集群添加一个包含spark submit命令的步骤。此命令在位于我的S3存储桶上的JSON配置文件(标题为
EMR-RUN-STEP.JSON
)中描述,该文件可以以与上一步中上载环境配置文件类似的方式上载到EMR集群。
EMR-RUN-STEP.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"
            ]
        }
    }
]
[
    {
        "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集群在完成运行后终止


我知道这个问题可能涉及很多问题,但我非常感谢您对上述任何问题的帮助。无论是遵循我上面概述的结构,还是您知道另一种解决方案,我都愿意接受任何形式的帮助。提前感谢。

'KeepJobFlowAliveWhenOsteps':False

将上述配置添加到emr群集创建脚本中。所有步骤完成后,它将自动终止emr群集
您需要终止群集步骤, 如文件所述:

因此,您需要一个步骤来为您做到这一点: terminateCluster.sync-对我来说,这比简单的terminateCluster更可取,因为它等待集群实际终止,您可以在这里处理任何挂起-您将使用标准的step函数,因此不会对额外的时间收费

注:如果您使用的是终止保护,那么在终止群集之前,您需要额外的一步来关闭if-off;)

请将文本添加为文本,而不是图像。图像:A)不能复制和粘贴用于测试;B) 不允许基于内容进行搜索;和。一般来说,文本格式的文本比图像格式的文本要好得多,图像格式的文本比没有要好得多。如果图像增加了一些不仅仅是文本所传达的重要内容,则除了文本之外,还应使用图像。另请参见参考要求和。