如何按需创建EMR集群并执行aws emr命令?
How to create EMR cluster on demand and execute aws emr command?
我想按需执行 Spark 作业。因此,仅当我收到触发事件时,我才想使用随该触发事件到达的输入来执行 Spark 作业。由于触发事件不频繁,我不想使用Spark Streaming。
我的目标是在 AWS EMR 集群中部署该工具。我希望能够按需(通过触发器)创建 EMR 集群,在那里执行 Spark 作业并关闭集群。
有什么好的例子可以说明如何从 Scala 处理这些操作吗?
AWS Data Pipeline 似乎是您定义的问题的正确解决方案。 AWS Data Pipeline 允许您连接 AWS 基础设施内的多个服务范围,例如存储和处理。
您可以在 AWS 数据管道中使用 EMRActivity 创建 EMR 作业。管道将在满足先决条件或预定时间间隔时触发。
它将使用您指定的规范和您定义的 Spark 步骤设置一个 EMR 集群
作业完成后可以自动终止集群
SO 上的 将帮助您入门。
- 您还可以在使用
Choose a Template
选项创建管道时启动 AWS Data Pipeline using this definition。对于此选项,您可以使用上面共享的模板。
Lambda 函数可能是一个很好的解决方案,只要它允许启动 EMR 集群。 Lambda 函数可以按需启动或使用多个不同的触发器来调用。
这可能是开始设置 Lambda 函数的好模板:
`
import sys
import time
import boto3
def lambda_handler(event, context):
conn = boto3.client("emr")
# chooses the first cluster which is Running or Waiting
# possibly can also choose by name or already have the cluster id
clusters = conn.list_clusters()
# choose the correct cluster
clusters = [c["Id"] for c in clusters["Clusters"]
if c["Status"]["State"] in ["RUNNING", "WAITING"]]
if not clusters:
sys.stderr.write("No valid clusters\n")
sys.stderr.exit()
# take the first relevant cluster
cluster_id = clusters[0]
# code location on your emr master node
CODE_DIR = "/home/hadoop/code/"
# spark configuration example
step_args = ["/usr/bin/spark-submit", "--spark-conf", "your-configuration",
CODE_DIR + "your_file.py", '--your-parameters', 'parameters']
step = {"Name": "what_you_do-" + time.strftime("%Y%m%d-%H:%M"),
'ActionOnFailure': 'CONTINUE',
'HadoopJarStep': {
'Jar': 's3n://elasticmapreduce/libs/script-runner/script-runner.jar',
'Args': step_args
}
}
action = conn.add_job_flow_steps(JobFlowId=cluster_id, Steps=[step])
return "Added step: %s"%(action)
`
- 与其通过 api 旋转 EMR 集群,不如拥有 EMR
在云形成模板中配置并开始云形成
模板 (CFT)。通过 CFT,您可以处理 IAM 角色,创建 S3
水桶等
- 通过lambda旋转EMR集群;并让另一个 lambda 监视 EMR,如果有任何 spark 作业正在进行或正在等待。如果 none 有 空闲时间(例如 15 分钟),则在 CFT 上发出拆卸,从而终止 EMR
我想按需执行 Spark 作业。因此,仅当我收到触发事件时,我才想使用随该触发事件到达的输入来执行 Spark 作业。由于触发事件不频繁,我不想使用Spark Streaming。 我的目标是在 AWS EMR 集群中部署该工具。我希望能够按需(通过触发器)创建 EMR 集群,在那里执行 Spark 作业并关闭集群。 有什么好的例子可以说明如何从 Scala 处理这些操作吗?
AWS Data Pipeline 似乎是您定义的问题的正确解决方案。 AWS Data Pipeline 允许您连接 AWS 基础设施内的多个服务范围,例如存储和处理。
您可以在 AWS 数据管道中使用 EMRActivity 创建 EMR 作业。管道将在满足先决条件或预定时间间隔时触发。
它将使用您指定的规范和您定义的 Spark 步骤设置一个 EMR 集群
作业完成后可以自动终止集群
SO 上的
- 您还可以在使用
Choose a Template
选项创建管道时启动 AWS Data Pipeline using this definition。对于此选项,您可以使用上面共享的模板。
Lambda 函数可能是一个很好的解决方案,只要它允许启动 EMR 集群。 Lambda 函数可以按需启动或使用多个不同的触发器来调用。
这可能是开始设置 Lambda 函数的好模板:
`
import sys
import time
import boto3
def lambda_handler(event, context):
conn = boto3.client("emr")
# chooses the first cluster which is Running or Waiting
# possibly can also choose by name or already have the cluster id
clusters = conn.list_clusters()
# choose the correct cluster
clusters = [c["Id"] for c in clusters["Clusters"]
if c["Status"]["State"] in ["RUNNING", "WAITING"]]
if not clusters:
sys.stderr.write("No valid clusters\n")
sys.stderr.exit()
# take the first relevant cluster
cluster_id = clusters[0]
# code location on your emr master node
CODE_DIR = "/home/hadoop/code/"
# spark configuration example
step_args = ["/usr/bin/spark-submit", "--spark-conf", "your-configuration",
CODE_DIR + "your_file.py", '--your-parameters', 'parameters']
step = {"Name": "what_you_do-" + time.strftime("%Y%m%d-%H:%M"),
'ActionOnFailure': 'CONTINUE',
'HadoopJarStep': {
'Jar': 's3n://elasticmapreduce/libs/script-runner/script-runner.jar',
'Args': step_args
}
}
action = conn.add_job_flow_steps(JobFlowId=cluster_id, Steps=[step])
return "Added step: %s"%(action)
`
- 与其通过 api 旋转 EMR 集群,不如拥有 EMR 在云形成模板中配置并开始云形成 模板 (CFT)。通过 CFT,您可以处理 IAM 角色,创建 S3 水桶等
- 通过lambda旋转EMR集群;并让另一个 lambda 监视 EMR,如果有任何 spark 作业正在进行或正在等待。如果 none 有 空闲时间(例如 15 分钟),则在 CFT 上发出拆卸,从而终止 EMR