web-dev-qa-db-fra.com

Les blocs-notes EMR installent des bibliothèques supplémentaires

J'ai du mal à travailler avec des bibliothèques supplémentaires via mon ordinateur portable EMR. L'interface AWS pour EMR me permet de créer des blocs-notes Jupyter et de les attacher à un cluster en cours d'exécution. J'aimerais y utiliser des bibliothèques supplémentaires. SSHing dans les machines et installation manuelle en tant que ec2-user ou root ne rendra pas les bibliothèques disponibles pour le bloc-notes, car il utilise apparemment l'utilisateur livy. Bootstrap actions installent des choses pour hadoop. Je ne peux pas installer à partir du portable car son utilisateur n'a apparemment pas Sudo, git , etc., et il ne serait probablement pas installé sur les esclaves de toute façon.

Quelle est la manière canonique d'installer des bibliothèques supplémentaires pour les cahiers créés via l'interface EMR?

16
Walrus the Cat

Pour un exemple, supposons que vous avez besoin de librosa Python sur exécutant cluster EMR Nous allons utiliser Python 2.7 car la procédure est plus simple - Python 2.7 est garanti sur le cluster et c'est le runtime par défaut pour EMR.).

Créez un script qui installe le package:

#!/bin/bash
Sudo easy_install-2.7 pip
Sudo /usr/local/bin/pip2 install librosa

et enregistrez-le dans votre répertoire personnel, par ex. /home/hadoop/install_librosa.sh. Notez le nom, nous allons l'utiliser plus tard.

Dans l'étape suivante, vous allez exécuter ce script via un autre script inspiré de documentation Amazon EMR : emr_install.py. Il utilise AWS Systems Manager pour exécuter votre script sur les nœuds.

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)

Pour l'exécuter:

python emr_install.py [cluster_id]

1
Lukasz Tracewski

Dans ce cas, je supprime généralement mon cluster et j'en crée un nouveau avec les actions bootstrap. Bootstrap vous permettent d'installer des bibliothèques supplémentaires sur votre cluster: https://docs.aws.Amazon.com/emr/latest/ManagementGuide/emr-plan-bootstrap.html . Par exemple, écrire le script suivant et l'enregistrer dans S3 vous permettra d'utiliser le datadog à partir de votre ordinateur portable exécuté au-dessus de votre cluster (au moins, cela fonctionne avec EMR 5.19):

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

Voici la ligne de commande que je lancerais pour lancer ce cluster:

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

Et le config-emr.json qui est stocké localement sur votre ordinateur:

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

Je suppose que vous pourriez faire exactement la même chose lors de la création d'un cluster via l'interface EMR en allant dans les options avancées de création.

1
Sacha

Quelle est la manière canonique d'installer des bibliothèques supplémentaires pour les blocs-notes créés via l'interface EMR?

EMR Notebooks a récemment lancé des `` bibliothèques de portée de bloc-notes '' à l'aide desquelles vous pouvez installer des bibliothèques Python supplémentaires sur votre cluster à partir du référentiel PyPI public ou privé et les utiliser dans une session de bloc-notes.

Les bibliothèques destinées aux ordinateurs portables offrent les avantages suivants:

  • Vous pouvez utiliser des bibliothèques dans un bloc-notes EMR sans avoir à recréer le cluster ou à rattacher le bloc-notes à un cluster.
  • Vous pouvez isoler les dépendances de bibliothèque d'un bloc-notes EMR à la session de bloc-notes individuelle. Les bibliothèques installées à partir du bloc-notes ne peuvent pas interférer avec d'autres bibliothèques du cluster ou des bibliothèques installées dans d'autres sessions de bloc-notes.

Voici plus de détails, https://docs.aws.Amazon.com/emr/latest/ManagementGuide/emr-managed-notebooks-scoped-libraries.html

Blog technique: https://aws.Amazon.com/blogs/big-data/install-python-libraries-on-a-running-cluster-with-emr-notebooks/

1
Parag Chaudhari