【问题标题】:How to launch and configure an EMR cluster using boto如何使用 boto 启动和配置 EMR 集群
【发布时间】:2014-12-06 12:03:39
【问题描述】:

我正在尝试使用 boto 启动集群并运行作业。 我发现了很多创建工作流的例子。但我不能为我的生活,找到一个例子表明:

  1. 如何定义要使用的集群(通过 clusted_id)
  2. 如何配置启动集群(例如,如果我想为某些任务节点使用 Spot 实例)

我错过了什么吗?

【问题讨论】:

    标签: python amazon-web-services boto amazon-emr


    【解决方案1】:

    Boto 和底层 EMR API 目前正在混合使用术语 clusterjob flow,job flow 是 deprecated。我认为它们是同义词。

    您可以通过调用boto.emr.connection.run_jobflow() 函数来创建一个新集群。它将返回 EMR 为您生成的集群 ID。

    首先是所有强制性的事情:

    #!/usr/bin/env python
    
    import boto
    import boto.emr
    from boto.emr.instance_group import InstanceGroup
    
    conn = boto.emr.connect_to_region('us-east-1')
    

    然后我们指定实例组,包括我们要为 TASK 节点支付的现货价格:

    instance_groups = []
    instance_groups.append(InstanceGroup(
        num_instances=1,
        role="MASTER",
        type="m1.small",
        market="ON_DEMAND",
        name="Main node"))
    instance_groups.append(InstanceGroup(
        num_instances=2,
        role="CORE",
        type="m1.small",
        market="ON_DEMAND",
        name="Worker nodes"))
    instance_groups.append(InstanceGroup(
        num_instances=2,
        role="TASK",
        type="m1.small",
        market="SPOT",
        name="My cheap spot nodes",
        bidprice="0.002"))
    

    最后我们启动一个新的集群:

    cluster_id = conn.run_jobflow(
        "Name for my cluster",
        instance_groups=instance_groups,
        action_on_failure='TERMINATE_JOB_FLOW',
        keep_alive=True,
        enable_debugging=True,
        log_uri="s3://mybucket/logs/",
        hadoop_version=None,
        ami_version="2.4.9",
        steps=[],
        bootstrap_actions=[],
        ec2_keyname="my-ec2-key",
        visible_to_all_users=True,
        job_flow_role="EMR_EC2_DefaultRole",
        service_role="EMR_DefaultRole")
    

    如果我们关心的话,我们也可以打印集群 ID:

    print "Starting cluster", cluster_id
    

    【讨论】:

    • boto3而不是boto来更新这个答案?
    • @vilsepi 这给了我这个错误 Amazon EMR 集群 (用 python 制作的集群)已在 2017 年 10 月 2 日 08:21 UTC 终止并出现错误,原因是 VALIDATION_ERROR。想法?
    【解决方案2】:

    我认为使用 boto3 启动 EMR 集群的最小 Python 数量是:

    import boto3
    
    client = boto3.client('emr', region_name='us-east-1')
    
    response = client.run_job_flow(
        Name="Boto3 test cluster",
        ReleaseLabel='emr-5.12.0',
        Instances={
            'MasterInstanceType': 'm4.xlarge',
            'SlaveInstanceType': 'm4.xlarge',
            'InstanceCount': 3,
            'KeepJobFlowAliveWhenNoSteps': True,
            'TerminationProtected': False,
            'Ec2SubnetId': 'my-subnet-id',
            'Ec2KeyName': 'my-key',
        },
        VisibleToAllUsers=True,
        JobFlowRole='EMR_EC2_DefaultRole',
        ServiceRole='EMR_DefaultRole'
    )
    

    注意:您必须create EMR_EC2_DefaultRole and EMR_DefaultRoleAmazon documentation 声称 JobFlowRoleServiceRole 是可选的,但省略它们对我不起作用。那可能是因为我的子网是 VPC 子网,但我不确定。

    【讨论】:

    • +1 列出new API 方法
    • 您好,话题有点晚了,您知道是否可以使用 boto3 创建和启动具有自定义 AMI 的集群?
    • 我在 GitHub 上添加了一个示例,展示了如何使用 Boto3 创建短期和长期集群并添加步骤。在这里:aws-doc-sdk-examples.
    【解决方案3】:

    我使用以下代码创建安装了 flink 的 EMR,并包含 3 个实例组。参考文档:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/emr.html#EMR.Client.run_job_flow

    import boto3
    
    masterInstanceType = 'm4.large'
    coreInstanceType = 'c3.xlarge'
    taskInstanceType = 'm4.large'
    coreInstanceNum = 2
    taskInstanceNum = 2
    clusterName = 'my-emr-name'
    
    emrClient = boto3.client('emr')
    
    logUri = 's3://bucket/xxxxxx/'
    releaseLabel = 'emr-5.17.0' #emr version
    instances = {
        'Ec2KeyName': 'my_keyxxxxxx',
        'Ec2SubnetId': 'subnet-xxxxxx',
        'ServiceAccessSecurityGroup': 'sg-xxxxxx',
        'EmrManagedMasterSecurityGroup': 'sg-xxxxxx',
        'EmrManagedSlaveSecurityGroup': 'sg-xxxxxx',
        'KeepJobFlowAliveWhenNoSteps': True,
        'TerminationProtected': False,
        'InstanceGroups': [{
            'InstanceRole': 'MASTER',
            "InstanceCount": 1,
                "InstanceType": masterInstanceType,
                "Market": "SPOT",
                "Name": "Master"
            }, {
                'InstanceRole': 'CORE',
                "InstanceCount": coreInstanceNum,
                "InstanceType": coreInstanceType,
                "Market": "SPOT",
                "Name": "Core",
            }, {
                'InstanceRole': 'TASK',
                "InstanceCount": taskInstanceNum,
                "InstanceType": taskInstanceType,
                "Market": "SPOT",
                "Name": "Core",
            }
        ]
    }
    bootstrapActions = [{
        'Name': 'Log to Cloudwatch Logs',
        'ScriptBootstrapAction': {
            'Path': 's3://mybucket/bootstrap_cwl.sh'
        }
    }, {
        'Name': 'Custom action',
        'ScriptBootstrapAction': {
            'Path': 's3://mybucket/install.sh'
        }
    }]
    applications = [{'Name': 'Flink'}]
    serviceRole = 'EMR_DefaultRole'
    jobFlowRole = 'EMR_EC2_DefaultRole'
    tags = [{'Key': 'keyxxxxxx', 'Value': 'valuexxxxxx'},
            {'Key': 'key2xxxxxx', 'Value': 'value2xxxxxx'}
            ]
    steps = [
        {
            'Name': 'Run Flink',
            'ActionOnFailure': 'TERMINATE_JOB_FLOW',
            'HadoopJarStep': {
                'Jar': 'command-runner.jar',
                'Args': ['flink', 'run',
                         '-m', 'yarn-cluster',
                         '-p', str(taskInstanceNum),
                         '-yjm', '1024',
                         '-ytm', '1024',
                         '/home/hadoop/test-1.0-SNAPSHOT.jar'
                         ]
            }
        },
    ]
    response = emrClient.run_job_flow(
        Name=clusterName,
        LogUri=logUri,
        ReleaseLabel=releaseLabel,
        Instances=instances,
        Steps=steps,
        Configurations=configurations,
        BootstrapActions=bootstrapActions,
        Applications=applications,
        ServiceRole=serviceRole,
        JobFlowRole=jobFlowRole,
        Tags=tags
    )
    

    【讨论】:

    • 您好,话题有点晚了,您知道是否可以使用 boto3 使用自定义 AMI 创建和启动集群?
    • 我不知道是否有办法使用自定义 AMI 创建 EMR。但一种解决方法是在 bootstrapActions 中设置您的软件。
    【解决方案4】:

    我的步骤参数是:bash -c /usr/bin/flink run -m yarn-cluster -yn 2 /home/hadoop/mysflinkjob.jar

    尝试执行相同的 run_job_flow,但出现错误:

    无法运行程序“/usr/bin/flink run -m yarn-cluster -yn 2 /home/hadoop/mysflinkjob.jar" (在目录 "."): error=2, No such 文件或目录

    从主节点执行相同的命令工作正常,但不是从 Python boto3

    似乎问题是由于 EMR 或 boto3 添加到参数中的引号引起的。

    更新:

    用空格分割所有参数。 我的意思是如果你需要执行"flink run myflinkjob.jar" 将您的参数作为此列表传递:

    ['flink','run','myflinkjob.jar']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 2016-02-19
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多