使用 boto3 将现有 EMR 集群克隆到新集群中
Posted
技术标签:
【中文标题】使用 boto3 将现有 EMR 集群克隆到新集群中【英文标题】:Cloning existing EMR cluster into a new one using boto3 【发布时间】:2017-10-12 07:35:33 【问题描述】:使用 boto3 创建新集群时,我想使用现有集群(已终止)中的配置,从而克隆它。
据我所知,emr_client.run_job_flow
要求将所有配置(Instances, InstanceFleets etc
)作为参数提供。
有什么方法可以从现有集群中克隆,就像我可以从 EMR 的 aws 控制台执行的操作一样。
【问题讨论】:
可能重复:***.com/questions/43579746/… 请阅读这两个问题。它们是不同的。 @AmeyDahale 你有答案吗?似乎这应该是 boto3 克隆现有 EMR 的流行功能。 我保留了一个包含所有 EMR 详细信息的静态配置文件,并使用 boto3 的 run_job_flow 来重用现有 EMR 的属性。 /我想有 boto3 功能来克隆现有的 EMR 会很好。 我创建了这个问题(尽管是在 java sdk 上),因为我看到这是一个常见的请求:github.com/aws/aws-sdk-java/issues/2002 【参考方案1】:我可以向您推荐的是,使用 AWS CLI 来启动您的集群。 它允许对您的集群配置进行版本控制,并且您可以使用 json 文件轻松加载步骤配置。
aws create-cluster --name "Cluster's name" --ec2-attributes KeyName=SSH_KEY --instance-type m3.xlarge --release-label emr-5.2.1 --log-uri s3://mybucket/logs/ --enable-debugging --instance-count 1 --use-default-roles --applications Name=Spark --steps file://step.json
step.json 看起来像这样:
[
"Name": "Step #1",
"Type":"SPARK",
"Jar":"command-runner.jar",
"Args":
[
"--deploy-mode", "cluster",
"--class", "com.your.data.set.class",
"s3://path/to/your/spark-job.jar",
"-c", "s3://path/to/your/config/or/not",
"--aws-access-key", "ACCESS_KEY",
"--aws-secret-key", "SECRET_KEY"
],
"ActionOnFailure": "CANCEL_AND_WAIT"
]
(多步骤也可以)
之后,您始终可以启动相同的已配置集群。 例如,从一个 AirFlow 作业调度整个集群和步骤。
但是如果你真的想使用 Boto3,我想describe_cluster() 方法可以帮助你获取全部信息并使用返回的对象来启动一个新对象。
【讨论】:
【参考方案2】:无法通过命令行获取“emr export cli”。 您应该通过“describe-cluster”解析您要克隆的参数。
请参见下面的示例, https://github.com/awslabs/aws-support-tools/tree/master/EMR/Get_EMR_CLI_Export
import boto3
import json
import sys
cluster_id = sys.argv[1]
client = boto3.client('emr')
clst = client.describe_cluster(ClusterId=cluster_id)
...
awscli += ' --steps ' + '\'' + json.dumps(cli_steps) + '\''
...
awscli += ' --instance-groups ' + '\'' + json.dumps(cli_igroups) + '\''
print(awscli)
它首先解析“describe-cluster”中的参数,并制作适合aws-cli的“create-cluster”的字符串。
【讨论】:
以上是关于使用 boto3 将现有 EMR 集群克隆到新集群中的主要内容,如果未能解决你的问题,请参考以下文章
jar 文件的参数不正确 - 使用 Boto3 启动 EMR 集群
我们可以使用 lambda 函数克隆一个终止的 emr 集群吗?在新集群中会有任何差异吗?