Installieren von zusätzlicher Kerneln und Bibliotheken - Amazon EMR

Installieren von zusätzlicher Kerneln und Bibliotheken

Wenn Sie einen Cluster mit JupyterHub in Amazon EMR erstellen, werden der Standard-Python-3-Kernel für Jupyter zusammen mit PySpark- und Spark-Kernel für Sparkmagic auf dem Docker-Container installiert. Sie können zusätzliche Kernel installieren. Sie können auch zusätzliche Bibliotheken und Pakete installieren und dann für die entsprechende Shell importieren.

Installieren eines Kernels

Kernel werden innerhalb des Docker-Containers installiert. Am einfachsten ist dies zu bewerkstelligen, indem Sie ein Bash-Skript mit Installationsbefehlen erstellen, es auf dem Master-Knoten speichern und es dann mit dem Befehl sudo docker exec jupyterhub script_name im Container jupyterhub ausführen. Das folgende Beispielskript installiert den Kernel und installiert dann einige Bibliotheken für diesen Kernel auf dem Master-Knoten, sodass Sie die Bibliotheken später unter Verwendung des Kernels in Jupyter importieren können.

#!/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

Um den Kernel und Bibliotheken innerhalb des Containers zu installieren, öffnen Sie eine Terminal-Verbindung zu dem Master-Knoten, speichern das Skript in /etc/jupyter/install_kernels.sh und führen den folgenden Befehl in der Master-Knoten Befehlszeile aus:

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

Verwenden von Bibliotheken und Installieren von zusätzlichen Bibliotheken

Eine Kernmenge von Bibliotheken für Machine Learning und Datenwissenschaft für Python 3 ist mit JupyterHub in Amazon EMR vorinstalliert. Sie können sudo docker exec jupyterhub bash -c "conda list" und sudo docker exec jupyterhub bash -c "pip freeze" verwenden.

Wenn ein Spark-Job Bibliotheken auf Worker-Knoten benötigt, empfehlen wir, dass Sie beim Erstellen des Clusters ein Skript ausführen, um die Bibliotheken zu installieren. Bootstrap-Aktionen werden beim Erstellungsprozess des Clusters auf allen Cluster-Knoten ausgeführt, was die Installation vereinfacht. Wenn Sie Bibliotheken auf Core-/Worker-Knoten installieren, nachdem ein Cluster läuft, ist die Operation komplizierter. Wir zeigen in diesem Abschnitt ein Python-Beispielprogramm, das demonstriert, wie diese Bibliotheken zu installieren sind.

Die in diesem Abschnitt gezeigten Beispiele für Bootstrap-Aktionen und Python-Programme verwenden ein Bash-Skript, das in Amazon S3 gespeichert ist, um die Bibliotheken auf allen Knoten zu installieren.

Das in den folgenden Beispielen verwendete Skript pip installiert paramiko, nltk, scipy, scikit-learn und pandas für den Python 3-Kernel:

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

Nachdem Sie das Skript erstellen, laden Sie es an einem Speicherort in Amazon S3 hoch, z. B s3://mybucket/install-my-jupyter-libraries.sh. Weitere Informationen finden Sie unter Hochladen von Objekten im Benutzerhandbuch für Amazon Simple Storage Service, sodass Sie es in Ihrer Bootstrap-Aktion oder in Ihrem Python-Programm verwenden können.

Angabe einer Bootstrap-Aktion, die Bibliotheken auf allen Knoten installiert, wenn Sie einen Cluster mit der AWS CLI erstellen;
  1. Erstellen Sie ein Skript ähnlich dem früheren Beispiel und speichern Sie es an einem Speicherort in Amazon S3. Wir verwenden das Beispiel s3://mybucket/install-my-jupyter-libraries.sh.

  2. Erstellen Sie den Cluster mit JupyterHub und verwenden Sie das Path-Argument der Option --bootstrap-actions, um den Speicherort des Skripts anzugeben, wie im folgenden Beispiel gezeigt:

    Anmerkung

    Linux-Zeilenfortsetzungszeichen (\) sind aus Gründen der Lesbarkeit enthalten. Sie können entfernt oder in Linux-Befehlen verwendet werden. Entfernen Sie sie unter Windows oder ersetzen Sie sie durch ein Caret-Zeichen (^).

    aws emr create-cluster --name="MyJupyterHubCluster" --release-label emr-5.36.1 \ --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
So geben Sie eine Bootstrap-Aktion an, die Bibliotheken auf allen Knoten installiert, wenn Sie einen Cluster mithilfe der Konsole erstellen
  1. Navigieren Sie zur neuen Amazon-EMR-Konsole und wählen Sie in der Seitennavigation die Option Zur alten Konsole wechseln aus. Weitere Informationen darüber, was Sie erwartet, wenn Sie zur alten Konsole wechseln, finden Sie unter Verwenden der alten Konsole.

  2. Wählen Sie Create Cluster (Cluster erstellen) und Go to advanced options (Zu erweiterten Optionen) aus.

  3. Geben Sie Einstellungen für Software and Steps (Software und Schritte) und Hardware an, wie für Ihre Anwendung geeignet.

  4. Auf dem Bildschirm General Cluster Settings (Allgemeine Cluster-Einstellungen) expandieren Sie Bootstrap Actions (Bootstrap-Aktionen).

  5. Wählen Sie für Add bootstrap action (Bootstrap-Aktion hinzufügen) die Option Custom action (Benutzerdefinierte Aktion) und Configure and add (Konfigurieren und hinzufügen) aus.

  6. Geben Sie für Name einen benutzerfreundlichen Namen ein. Für Skript-Speicherort geben Sie den Speicherort Ihres Skripts in Amazon S3 an (wir verwenden das Beispiel s3://mybucket/install-my-jupyter-libraries.sh). Tragen Sie in Optional arguments (Optionale Argumente) nichts ein und wählen Sie Add (Hinzufügen).

  7. Geben Sie andere Einstellungen für Ihren Cluster an und wählen Sie Next (Weiter).

  8. Geben Sie Sicherheitseinstellungen an und wählen Sie Create cluster (Cluster erstellen).

Beispiel Installieren von Bibliotheken auf Core-Knoten eines aktiven Clusters

Nach der Installation von Bibliotheken auf dem Master-Knoten innerhalb von Jupyter können Sie auf verschiedene Arten Bibliotheken auf in Ausführung befindlichen Core-Knoten installieren. Das folgende Beispiel zeigt ein Python-Programm, das für die Ausführung auf einem lokalen Computer geschrieben wurde. Wenn Sie das Python-Programm lokal ausführen, verwendet es das AWS-RunShellScript von AWS Systems Manager zum Ausführen des Beispielskripts, das in diesem Abschnitt gezeigt wurde, das Bibliotheken auf den Core-Knoten des Clusters installiert.

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