Instalación de kernels y bibliotecas adicionales - Amazon EMR

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Instalación de kernels y bibliotecas adicionales

Cuando creas un clúster JupyterHub en AmazonEMR, el núcleo de Python 3 predeterminado para Jupyter junto con los núcleos PySpark y Spark de Sparkmagic se instalan en el contenedor de Docker. Puede instalar kernels adicionales. También puede instalar bibliotecas y paquetes adicionales y, a continuación, importarlos al shell apropiado.

Instalación de un kernel

Los kernels se instalan en el contenedor de Docker. La manera más fácil de conseguirlo es crear un script bash con comandos de instalación, guardarlo en el nodo principal y, a continuación, usar el comando sudo docker exec jupyterhub script_name para ejecutar el script en el contenedor jupyterhub. El siguiente script de ejemplo instala el kernel y, a continuación, instala algunas bibliotecas para ese kernel en el nodo principal para que más tarde pueda importar las bibliotecas utilizando el kernel en Jupyter.

#!/bin/bash # Install Python 2 kernel conda create -n py27 python=2.7 anaconda source /opt/conda/envs/py27/bin/activate apt-get update apt-get install -y gcc /opt/conda/envs/py27/bin/python -m pip install --upgrade ipykernel /opt/conda/envs/py27/bin/python -m ipykernel install # Install libraries for Python 2 /opt/conda/envs/py27/bin/pip install paramiko nltk scipy numpy scikit-learn pandas

Para instalar el kernel y las bibliotecas en el contenedor, abra una conexión de terminal al nodo principal, guarde el script en /etc/jupyter/install_kernels.sh y ejecute el siguiente comando en la línea de comandos del nodo principal:

sudo docker exec jupyterhub bash /etc/jupyter/install_kernels.sh

Uso de bibliotecas e instalación de bibliotecas adicionales

Amazon EMR tiene preinstalado un conjunto básico de bibliotecas de aprendizaje automático y ciencia de datos para Python 3. JupyterHub Puede utilizar sudo docker exec jupyterhub bash -c "conda list" y sudo docker exec jupyterhub bash -c "pip freeze".

Si un trabajo de Spark necesita bibliotecas en los nodos de trabajo, le recomendamos que utilice una acción de arranque para ejecutar un script que instale las bibliotecas cuando cree el clúster. Las acciones de arranque se ejecutan en todos los nodos del clúster durante el proceso de creación de clúster, lo que simplifica la instalación. Si instala bibliotecas en nodos secundarios o de trabajo después un clúster esté en ejecución, la operación es más compleja. Proporcionamos un ejemplo programa en Python en esta sección que muestra cómo instalar estas bibliotecas.

La acción de arranque y los ejemplos de programas de Python mostrados en esta sección utilizan un script bash guardado en Amazon S3 para instalar las bibliotecas en todos los nodos.

El script al que se hace referencia en los siguientes ejemplos usa pip para instalar paramiko, nltk, scipy, scikit-learn y pandas para el kernel de Python 3:

#!/bin/bash sudo python3 -m pip install boto3 paramiko nltk scipy scikit-learn pandas

Después de crear el script, cárguelo en una ubicación en Amazon S3, por ejemplo, s3://amzn-s3-demo-bucket/install-my-jupyter-libraries.sh. Para obtener más información, consulte Carga de objetos en la Guía del usuario de Amazon Simple Storage Service para que pueda utilizarlos en su acción de arranque o en su programa de Python.

Para especificar una acción de arranque que instale bibliotecas en todos los nodos al crear un clúster mediante AWS CLI
  1. Cree un script similar al ejemplo anterior y guárdelo en una ubicación en Amazon S3. Usamos el ejemplo s3://amzn-s3-demo-bucket/install-my-jupyter-libraries.sh.

  2. Cree el clúster con JupyterHub y utilice el Path argumento de la --bootstrap-actions opción para especificar la ubicación del script, como se muestra en el siguiente ejemplo:

    nota

    Se incluyen caracteres de continuación de línea de Linux (\) para facilitar la lectura. Se pueden eliminar o utilizar en los comandos de Linux. En Windows, elimínelos o sustitúyalos por un signo de intercalación (^).

    aws emr create-cluster --name="MyJupyterHubCluster" --release-label emr-5.36.2 \ --applications Name=JupyterHub --log-uri s3://amzn-s3-demo-bucket/MyJupyterClusterLogs \ --use-default-roles --instance-type m5.xlarge --instance-count 2 --ec2-attributes KeyName=MyKeyPair \ --bootstrap-actions Path=s3://amzn-s3-demo-bucket/install-my-jupyter-libraries.sh,Name=InstallJupyterLibs
Para especificar una acción de arranque que instale bibliotecas en todos los nodos cuando cree un clúster mediante la consola
  1. Ve a la nueva EMR consola de Amazon y selecciona Cambiar a la consola anterior en el panel de navegación lateral. Para más información sobre lo que puede esperar al cambiar a la consola antigua, consulte Uso de la consola antigua.

  2. Elija Crear clúster e Ir a las opciones avanzadas.

  3. Especifique la configuración de Software and Steps (Software y pasos) y de Hardware según sea apropiado para su aplicación.

  4. En la pantalla General Cluster Settings (Configuración de clúster general), expanda Bootstrap Actions (Acciones de arranque).

  5. En Add bootstrap action (Añadir acción de arranque), seleccione Custom action (Acción personalizada), Configure and add (Configurar y añadir).

  6. En Name (Nombre), escriba un nombre fácil de recordar. En Ubicación del script, introduzca la ubicación del script en Amazon S3 (el ejemplo que utilizamos es s3://amzn-s3-demo-bucket/ install-my-jupyter-libraries .sh). Deje Optional arguments (Argumentos opcionales) en blanco y elija Add (Añadir).

  7. Especifique otros ajustes para el clúster y elija Next (Siguiente).

  8. Especifique la configuración de seguridad y seleccione Create cluster (Crear clúster).

ejemplo Instalación de bibliotecas en los nodos principales de un clúster en ejecución

Después de instalar las bibliotecas en el nodo principal desde Jupyter, puede instalar bibliotecas en nodos secundarios en ejecución de varias maneras. El siguiente ejemplo muestra un programa Python escrito para ejecutarse en un equipo local. Cuando ejecutas el programa Python de forma local, utiliza AWS-RunShellScript of AWS Systems Manager para ejecutar el script de ejemplo, que se muestra anteriormente en esta sección, que instala bibliotecas en los nodos principales del clúster.

import argparse import time import boto3 def install_libraries_on_core_nodes(cluster_id, script_path, emr_client, ssm_client): """ Copies and runs a shell script on the core nodes in the cluster. :param cluster_id: The ID of the cluster. :param script_path: The path to the script, typically an Amazon S3 object URL. :param emr_client: The Boto3 Amazon EMR client. :param ssm_client: The Boto3 AWS Systems Manager client. """ core_nodes = emr_client.list_instances( ClusterId=cluster_id, InstanceGroupTypes=["CORE"] )["Instances"] core_instance_ids = [node["Ec2InstanceId"] for node in core_nodes] print(f"Found core instances: {core_instance_ids}.") commands = [ # Copy the shell script from Amazon S3 to each node instance. f"aws s3 cp {script_path} /home/hadoop", # Run the shell script to install libraries on each node instance. "bash /home/hadoop/install_libraries.sh", ] for command in commands: print(f"Sending '{command}' to core instances...") command_id = ssm_client.send_command( InstanceIds=core_instance_ids, DocumentName="AWS-RunShellScript", Parameters={"commands": [command]}, TimeoutSeconds=3600, )["Command"]["CommandId"] while True: # Verify the previous step succeeded before running the next step. cmd_result = ssm_client.list_commands(CommandId=command_id)["Commands"][0] if cmd_result["StatusDetails"] == "Success": print(f"Command succeeded.") break elif cmd_result["StatusDetails"] in ["Pending", "InProgress"]: print(f"Command status is {cmd_result['StatusDetails']}, waiting...") time.sleep(10) else: print(f"Command status is {cmd_result['StatusDetails']}, quitting.") raise RuntimeError( f"Command {command} failed to run. " f"Details: {cmd_result['StatusDetails']}" ) def main(): parser = argparse.ArgumentParser() parser.add_argument("cluster_id", help="The ID of the cluster.") parser.add_argument("script_path", help="The path to the script in Amazon S3.") args = parser.parse_args() emr_client = boto3.client("emr") ssm_client = boto3.client("ssm") install_libraries_on_core_nodes( args.cluster_id, args.script_path, emr_client, ssm_client ) if __name__ == "__main__": main()