Как запустить и настроить кластер EMR с помощью boto

Я пытаюсь запустить кластер и запустить работу, используя boto. Я нахожу много примеров создания job_flows. Но я не могу для жизни, найду пример, который показывает:

  • Как определить используемый кластер (by clusted_id)
  • Как настроить запуск кластера (например, если я хочу использовать точечные экземпляры для некоторых узлов задачи)

Я что-то пропустил?

Ответ 1

Boto и базовый API EMR в настоящее время смешивают термины "кластер" и "рабочий поток", а поток задания устарел. Я считаю их синонимами.

Вы создаете новый кластер, вызывая функцию boto.emr.connection.run_jobflow(). Он вернет идентификатор кластера, который генерирует EMR для вас.

Сначала все обязательные вещи:

#!/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")

Мы также можем распечатать идентификатор кластера, если нас это волнует:

print "Starting cluster", cluster_id

Ответ 2

Я считаю, что минимальный объем Python, который запускает кластер EMR с boto3:

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'
)

Примечания: вам нужно создать EMR_EC2_DefaultRole и EMR_DefaultRole. Документации Amazon утверждает, что JobFlowRole и ServiceRole не являются обязательными, но без них не работает для меня. Это может быть потому, что моя подсеть является подсетью VPC, но я не уверен.

Ответ 3

Я использую следующий код для создания EMR с установленным flink и включает 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
)

Ответ 4

Мои bash -c/usr/bin/flink run -m yarn-cluster -yn 2/home/hadoop/mysflinkjob.jar Аргументы: bash -c/usr/bin/flink run -m yarn-cluster -yn 2/home/hadoop/mysflinkjob.jar

Попытка выполнить тот же run_job_flow, но с ошибкой:

Невозможно запустить программу "/usr/bin/flink run -m пряжа -c блеск -yn 2/home/hadoop/mysflinkjob.jar" (в каталоге "."): Ошибка = 2, такого файла или каталога нет

Выполнение той же команды с главного узла работает нормально, но не с Python Boto3

Похоже, проблема связана с кавычками, которые EMR или boto3 добавляют в Аргументы.

ОБНОВИТЬ:

Разделите ВСЕ ваши аргументы с пробелами. Я имею в виду, если вам нужно выполнить "flink run myflinkjob.jar" передайте ваши аргументы в виде этого списка:

[ 'Flink', 'бег', 'myflinkjob.jar']