В ноутбуках EMR устанавливаются дополнительные библиотеки - программирование

В ноутбуках EMR устанавливаются дополнительные библиотеки

Мне удивительно трудно работать с дополнительными библиотеками через ноутбук EMR. Интерфейс AWS для EMR позволяет мне создавать ноутбуки Jupyter и подключать их к работающему кластеру. Я хотел бы использовать в них дополнительные библиотеки. SSH-подключение к компьютерам и установка вручную в качестве ec2-user или root не сделает библиотеки доступными для ноутбука, поскольку он, очевидно, использует пользователя livy. Загрузочные действия устанавливают вещи для hadoop. Я не могу установить с ноутбука, потому что у пользователя, очевидно, нет sudo, git и т.д., И, вероятно, он все равно не установится на рабов.

Каков канонический способ установки дополнительных библиотек для ноутбуков, созданных через интерфейс EMR?

4b9b3361

Ответ 1

Для примера предположим, что вам нужен Python-модуль librosa для запуска кластера 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: 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]

Ответ 2

В этом случае я обычно удаляю свой кластер и создаю новый с действиями начальной загрузки. Действия начальной загрузки позволяют установить дополнительные библиотеки в вашем кластере: https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-bootstrap.html. Например, написание следующего скрипта и сохранение его в S3 позволит вам использовать datadog из вашего ноутбука, работающего поверх кластера (по крайней мере, он работает с EMR 5.19):

#!/bin/bash -xe
#install datadog module for using in pyspark
sudo pip-3.4 install -U datadog

Вот командная строка, которую я бы запустил для запуска этого кластера:

aws emr create-cluster --release-label emr-5.19.0 \
--name 'EMR 5.19 test' \
--applications Name=Hadoop Name=Spark Name=Hive Name=Livy \
--use-default-roles \
--instance-groups \
InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m4.large \
InstanceGroupType=CORE,InstanceCount=2,InstanceType=m4.large \
--region eu-west-1 \
--log-uri s3://<path-to-logs> \
--configurations file://config-emr.json \
--bootstrap-actions Path=s3://<path-to-bootstrap-in-aws>,Name=InstallPythonModules

И config-emr.json, который хранится локально на вашем компьютере:

[{
    "Classification": "spark",
    "Properties": {
    "maximizeResourceAllocation": "true"
    }
},
{
    "Classification": "spark-env",
    "Configurations": [
    {
        "Classification": "export",
        "Properties": {
            "PYSPARK_PYTHON": "/usr/bin/python3"
        }
    }
    ]
}]   

Я предполагаю, что вы могли бы сделать то же самое при создании кластера через интерфейс EMR, перейдя к расширенным параметрам создания.

Ответ 3

  Каков канонический способ установки дополнительных библиотек для ноутбуков, созданных через интерфейс EMR?

EMR Notebooks недавно выпустила "библиотеки для ноутбуков", с помощью которых вы можете установить дополнительные библиотеки Python в своем кластере из общего или частного репозитория PyPI и использовать его в сеансе ноутбука.

Библиотеки в области ноутбуков предоставляют следующие преимущества:

  • Вы можете использовать библиотеки в записной книжке EMR без необходимости повторного создания кластер или повторно присоедините ноутбук к кластеру.
  • Вы можете изолировать зависимости библиотеки записной книжки EMR от индивидуальной сессии записной книжки. Библиотеки, установленные из записной книжки, не могут создавать помехи другим библиотекам кластера или библиотекам, установленным в других сеансах записной книжки.

Вот больше деталей, https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-managed-notebooks-scoped-libraries.html

Технический блог:https://aws.amazon.com/blogs/big-data/install-python-libraries-on-a-running-cluster-with-emr-notebooks/