Boto:如何在完成/失败后保持EMR作业流运行?
我想知道怎么在一个正在等待的Amazon EMR作业流程中添加步骤,而不让这个作业流程在完成后就结束。
我在亚马逊的弹性Map Reduce上创建了一个交互式的作业流程,并加载了一些表格。当我使用Boto的emr_conn.add_jobflow_steps(...)
来给作业流程添加新步骤时,这个作业流程在完成或失败后就会终止。
我知道可以通过Boto的run_jobflow
方法来启动一个作业流程,并使用keep_alive
参数来保持它运行——但我想处理的是那些已经在运行中的流程。
3 个回答
0
你还可以通过设置一个叫做'KeepJobFlowAliveWhenNoSteps'的标志来实现这个功能。
response = emr.run_job_flow(
Name="start-my-cluster",
ReleaseLabel="emr-5.3.1",
LogUri='s3://logs',
Instances={
'InstanceGroups': [
{'Name': 'EmrMaster',
'InstanceRole': 'MASTER',
'InstanceType': 'm3.xlarge',
'InstanceCount': 1},
{'Name': 'EmrCore',
'InstanceRole': 'CORE',
'InstanceType': 'm3.xlarge',
'InstanceCount': 2}
],
'Ec2KeyName': 'my-key-name',
'KeepJobFlowAliveWhenNoSteps' : True,
},
Applications=[{'Name': 'Hadoop'}, {'Name': 'Spark'}, {'Name': 'Hive'}],
JobFlowRole='EMR_EC2_DefaultRole',
ServiceRole='EMR_DefaultRole',
VisibleToAllUsers=True,
Steps=[
# steps go here...
]
)
2
我用的是这样的东西
创建时使用
import boto.emr
conn = boto.emr.connect_to_region('us-west-2')
jobid = conn.run_jobflow(name='cluster-name',
ec2_keyname="yourkeyhere",
num_instances=3,
master_instance_type='m1.medium',
slave_instance_type='m1.medium',
keep_alive=True,
)
往一个已经存在的集群里添加一个任务(等一会儿,让集群处于等待状态)
import boto.emr
conn = boto.emr.connect_to_region('us-west-2')
# get the list of waiting cluster and take the first one
jobid = conn.describe_jobflows(states=["WAITING"])[0].jobflowid
print jobid
flow_steps = list()
runThing = boto.emr.step.ScriptRunnerStep(
name="job step name",
step_args = ["s3://yours3bucket/dosmthg.sh"])
flow_steps.append(runThing)
conn.add_jobflow_steps(jobid, flow_steps)
注意事项
- 你需要在 ~/.aws/credentials 文件里填写好信息(可以用 aws configure 命令来配置)
- 亚马逊的 us-west-2 区域目前有最新的 ami 版本
- 如果你需要使用 hive、pig 或者其他自定义安装步骤,可能需要添加 bootstrap_actions=
3
如果一切正常完成,它就不应该以 keep_alive=True
结束。也就是说,通常情况下如果出错,它会退出,所以你需要在 add_job_steps
的参数中加上 terminate_on_failure="CONTINUE"
。