Для примера предположим, что вам нужен librosa
модуль Python на работающий кластер EMR.Мы собираемся использовать Python 2.7, поскольку процедура проще - Python 2.7 гарантированно будет работать в кластере, и это среда выполнения по умолчанию для EMR.
Создайте скрипт, который устанавливает пакет:
#!/bin/bash
sudo easy_install-2.7 pip
sudo /usr/local/bin/pip2 install librosa
и сохраните его в своем домашнем каталоге, например, /home/hadoop/install_librosa.sh
.Запомните имя, мы будем использовать его позже.
На следующем шаге вы запустите этот скрипт через другой скрипт, вдохновленный Amazon EMR docs : emr_install.py
.Он использует AWS Systems Manager для выполнения вашего скрипта над узлами.
import time
from boto3 import client
from sys import argv
try:
clusterId=argv[1]
except:
print("Syntax: emr_install.py [ClusterId]")
import sys
sys.exit(1)
emrclient=client('emr')
# Get list of core nodes
instances=emrclient.list_instances(ClusterId=clusterId,InstanceGroupTypes=['CORE'])['Instances']
instance_list=[x['Ec2InstanceId'] for x in instances]
# Attach tag to core nodes
ec2client=client('ec2')
ec2client.create_tags(Resources=instance_list,Tags=[{"Key":"environment","Value":"coreNodeLibs"}])
ssmclient=client('ssm')
# Run shell script to install libraries
command=ssmclient.send_command(Targets=[{"Key": "tag:environment", "Values":["coreNodeLibs"]}],
DocumentName='AWS-RunShellScript',
Parameters={"commands":["bash /home/hadoop/install_librosa.sh"]},
TimeoutSeconds=3600)['Command']['CommandId']
command_status=ssmclient.list_commands(
CommandId=command,
Filters=[
{
'key': 'Status',
'value': 'SUCCESS'
},
]
)['Commands'][0]['Status']
time.sleep(30)
print("Command:" + command + ": " + command_status)
Для его запуска:
python emr_install.py [cluster_id]