Boto:如何在完成/失败后保持EMR作业流运行?

2 投票
3 回答
2604 浏览
提问于 2025-04-17 05:22

我想知道怎么在一个正在等待的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"

撰写回答