Я хочу установить определенные библиотеки на основных узлах уже работающего кластера.Следуя официальной документации и разделу Пример установки библиотек на базовые узлы работающего кластера :
, я создал свой сценарий и попытался его запустить.Он показывает обе команды как успешные, но когда я проверяю, действительно ли первая команда выполнила , т.е. , был ли загружен скрипт, использованный aws cli
, я не нахожу этот файл.Следовательно, я не думаю, что эти команды выполняются вообще.
Для того, чтобы копнуть глубже, я попытался запустить команды вручную, и они сработали.Кроме того, я попытался проверить идентификатор кластера и все остальное, чтобы избежать «глупых ошибок», все идеально, но код.
Сценарий python:
# Install Python libraries on running cluster nodes
from sys import argv
from boto3 import client
try:
clusterId = argv[1]
script = argv[2]
except:
print("Syntax: librariesSsm.py [ClusterId] [S3_Script_Path]")
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')
print("Download shell script from S3")
command = "aws s3 cp " + script + " /home/hadoop"
print("Command is {}".format(command))
try:
print("Trying to exec first command.")
first_command = ssmclient.send_command(Targets=[{"Key": "tag:environment", "Values": ["coreNodeLibs"]}],
DocumentName='AWS-RunShellScript',
Parameters={"commands": [command]},
TimeoutSeconds=3600)['Command']['CommandId']
print("First command is {}".format(first_command))
# Wait for command to execute
import time
time.sleep(15)
# first_command_status = ssmclient.list_commands(
# CommandId="d69ce0bf-a34e-4464-80e3-3a6325b05158",
# Filters=[
# {
# 'key': 'Status',
# 'value': 'SUCCESS'
# },
# ]
# )['Commands'][0]['Status']
first_command_status = ssmclient.list_commands(
CommandId=first_command
)['Commands'][0]['Status']
print(first_command_status)
second_command = ""
second_command_status = ""
# Only execute second command if first command is successful
if (first_command_status == 'Success'):
# Run shell script to install libraries
second_command = ssmclient.send_command(Targets=[{"Key": "tag:environment", "Values": ["coreNodeLibs"]}],
DocumentName='AWS-RunShellScript',
Parameters={"commands": [
"bash /home/hadoop/install_libraries.sh"]},
TimeoutSeconds=3600)['Command']['CommandId']
time.sleep(90)
second_command_status = ssmclient.list_commands(
CommandId=second_command
)['Commands'][0]['Status']
print("First command, " + first_command + ": " + first_command_status)
print("Second command:" + second_command + ": " + second_command_status)
except Exception as e:
print(e)
Сценарий оболочкив облаке загружено:
sudo docker exec jupyterhub bash -c "python3 -m pip install pandas"
Я ожидаю увидеть некоторые результаты т.е. файл загружен, а библиотека -> pandas
фактически установлена.
Кроме того, я до сих пор не уверен, выполняются ли эти команды непосредственно в главном узле или они запускаются в контейнере док-станции, где это действительно имеет значение.