Невозможно установить библиотеки на основных узлах работающего кластера - PullRequest
0 голосов
/ 06 июня 2019

Я хочу установить определенные библиотеки на основных узлах уже работающего кластера.Следуя официальной документации и разделу Пример установки библиотек на базовые узлы работающего кластера :

, я создал свой сценарий и попытался его запустить.Он показывает обе команды как успешные, но когда я проверяю, действительно ли первая команда выполнила , т.е. , был ли загружен скрипт, использованный 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 фактически установлена.

Кроме того, я до сих пор не уверен, выполняются ли эти команды непосредственно в главном узле или они запускаются в контейнере док-станции, где это действительно имеет значение.

...