Installazione di kernel e librerie aggiuntive - Amazon EMR

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Installazione di kernel e librerie aggiuntive

Quando crei un cluster con JupyterHub Amazon EMR, il kernel Python 3 predefinito per Jupyter insieme ai kernel Spark per Sparkmagic vengono installati PySpark nel contenitore Docker. Puoi installare kernel aggiuntivi. Puoi anche installare librerie e pacchetti aggiuntivi e quindi importarli per la shell appropriata.

Installazione di un kernel

Kernel vengono installati all'interno del container Docker. Il modo più semplice per effettuare questa operazione è creare uno script bash con i comandi di installazione, salvarlo nel nodo master, quindi utilizzare il comando sudo docker exec jupyterhub script_name per eseguire lo script all'interno del container jupyterhub. Nell'esempio seguente lo script installa il kernel, quindi installa alcune librerie per tale kernel nel nodo master per consentire di importarle in seguito utilizzando il kernel in 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

Per installare il kernel e le librerie all'interno del container, apri una connessione del terminale al nodo master, salva lo script in /etc/jupyter/install_kernels.sh ed esegui il comando seguente nella riga di comando del nodo master:

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

Utilizzo di librerie e installazione di librerie aggiuntive

Un set base di librerie di machine learning e data science per Python 3 è preinstallato su JupyterHub Amazon EMR. Puoi utilizzare sudo docker exec jupyterhub bash -c "conda list" e sudo docker exec jupyterhub bash -c "pip freeze".

Se un processo Spark richiede librerie sui nodi di lavoro, ti consigliamo di utilizzare un'operazione di bootstrap per eseguire uno script per installare le librerie durante la creazione del cluster. Le operazioni di bootstrap vengono eseguite su tutti i nodi del cluster durante il processo di creazione del cluster; ciò semplifica l'installazione. Se installi librerie su nodi principali/di lavoro dopo che un cluster è in esecuzione, l'operazione è più complessa. In questa sezione viene fornito un esempio di programma Python che mostra come installare queste librerie.

L'operazione di bootstrap e il programma Python di esempio mostrati in questa sezione utilizzano uno script bash salvato in Amazon S3 per installare le librerie su tutti i nodi.

Lo script cui si fa riferimento negli esempi seguenti utilizza pip per installare paramiko, nltk, scipy, scikit-learn e pandas per il kernel Python 3:

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

Dopo aver creato lo script, caricalo in un percorso in Amazon S3, ad esempio s3://mybucket/install-my-jupyter-libraries.sh. Per ulteriori informazioni, consulta Caricamento di oggetti nella Guida per l'utente di Amazon Simple Storage Service per utilizzare lo script nell'operazione di bootstrap o nel programma Python.

Per specificare un'azione di bootstrap che installa le librerie su tutti i nodi quando crei un cluster utilizzando il AWS CLI
  1. Crea uno script simile all'esempio precedente e salvalo in un percorso in Amazon S3. Viene utilizzato l'esempio s3://mybucket/install-my-jupyter-libraries.sh.

  2. Create il cluster con JupyterHub e utilizzate l'Pathargomento dell'--bootstrap-actionsopzione per specificare la posizione dello script, come mostrato nell'esempio seguente:

    Nota

    I caratteri di continuazione della riga Linux (\) sono inclusi per questioni di leggibilità. Possono essere rimossi o utilizzati nei comandi Linux. Per Windows, rimuoverli o sostituirli con un accento circonflesso (^).

    aws emr create-cluster --name="MyJupyterHubCluster" --release-label emr-5.36.2 \ --applications Name=JupyterHub --log-uri s3://MyBucket/MyJupyterClusterLogs \ --use-default-roles --instance-type m5.xlarge --instance-count 2 --ec2-attributes KeyName=MyKeyPair \ --bootstrap-actions Path=s3://mybucket/install-my-jupyter-libraries.sh,Name=InstallJupyterLibs
Per specificare un'operazione di bootstrap che installa librerie su tutti i nodi durante la creazione di un cluster utilizzando la console
  1. Passa alla nuova console Amazon EMR e seleziona Passa alla vecchia console dalla barra di navigazione laterale. Per ulteriori informazioni su cosa aspettarti quando passi alla vecchia console, consulta Utilizzo della vecchia console.

  2. Seleziona Create cluster (Crea cluster), Go to advanced options (Vai alle opzioni avanzate).

  3. Specificare le impostazioni per Software and Steps (Software e fasi) e Hardware come appropriato per l'applicazione.

  4. Nella General Cluster Settings (Impostazioni generali del cluster), espandere Bootstrap Actions (Operazioni di bootstrap).

  5. Per Add bootstrap action (Aggiungi operazione di bootstrap), selezionare Custom action (Operazione personalizzata), Configure and add (Configura e aggiungi).

  6. Per Name (Nome), inserire un nome descrittivo. Per Script location, inserisci la posizione in Amazon S3 dello script (l'esempio che utilizziamo è s3://mybucket/ install-my-jupyter-libraries .sh). Lasciare Optional arguments (Argomenti opzionali) vuoto e scegliere Add (Aggiungi).

  7. Specificare altre impostazioni per il cluster e scegliere Next (Successivo).

  8. Specificare impostazioni di sicurezza e scegliere Create cluster (Crea cluster).

Esempio Installazione di librerie su nodi principali di un cluster in esecuzione

Dopo aver installato le librerie sul nodo master dall'interno di Jupyter, puoi installare librerie su nodi principali in esecuzione in diversi modi. Nell'esempio seguente viene mostrato un programma Python scritto per l'esecuzione su un computer locale. Quando esegui il programma Python localmente, utilizza AWS-RunShellScript of AWS Systems Manager per eseguire lo script di esempio, mostrato in precedenza in questa sezione, che installa le librerie sui nodi principali del cluster.

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()