Как запустить и настроить кластер 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']