Direkt zum Inhalt

Wie verwende ich externe Python-Bibliotheken in einem AWS-Glue-ETL-Auftrag?

Lesedauer: 6 Minute
0

Ich möchte externe Python-Bibliotheken in einem AWS-Glue-Auftrag des Typs „Extract, Transform, Load“ (ETL, Extrahieren, Transformieren und Laden) verwenden.

Kurzbeschreibung

Wenn du die AWS-Glue-Versionen 2.0, 3.0 und 4.0 verwendest, kannst du zusätzliche Python-Module oder verschiedene Modulversionen auf Auftragsebene installieren. Um ein neues Modul hinzuzufügen oder die Version eines vorhandenen Moduls zu ändern, verwende den Auftragsparameterschlüssel --additional-python-modules. Der Wert des Schlüssels ist eine Liste von durch Komma getrennten Python-Modulnamen. Wenn du diesen Parameter verwendest, installiert der AWS-Glue-ETL-Auftrag die zusätzlichen Module über das Python-Paketinstallationsprogramm (pip3).

Du kannst auch den Parameter --additional-python-modules verwenden, um Python-Bibliotheken zu installieren, die in C-basierten Sprachen geschrieben sind.

Lösung

Python-Module installieren oder aktualisieren

Gehe wie folgt vor, um ein zusätzliches Python-Modul für den AWS-Glue-Auftrag zu installieren:

  1. Öffne die AWS-Glue-Konsole.
  2. Wähle im Navigationsbereich Jobs (Aufträge) aus.
  3. Wähle den Auftrag aus, zu dem du das Python-Modul hinzufügen möchtest.
  4. Wähle Actions (Aktionen) und dann Edit job (Job bearbeiten) aus.
  5. Erweitere den Abschnitt Security configuration, script libraries, and job parameters (optional) (Sicherheitskonfiguration, Skriptbibliotheken und Jobparameter (optional)).
  6. Gehe unter Job parameters (Jobparameter) wie folgt vor:
    Gib für Key (Schlüssel) --additional-python-modules ein.
    Gib unter Value (Wert) eine durch Komma getrennte Liste von Modulen ein, die du hinzufügen möchtest.
  7. Wähle Save (Speichern) aus.

Angenommen, du möchtest zwei neue Module hinzufügen, Version 1.0.2 von PyMySQL und Version 3.6.2 des Natural Language Toolkits (NLTK). Du installierst das PyMySQL-Modul aus dem Internet und das NLTK-Modul aus einem Amazon Simple Storage Service (Amazon S3)-Bucket. In diesem Fall hat der Parameterschlüssel --additional-python-modules den Wert pymysql==1.0.2, s3://aws-glue-add-modules/nltk-3.6.2-py3-none-any.whl.

Einige Module haben Abhängigkeiten von anderen Modulen. Wenn du ein solches Modul installierst oder aktualisierst, musst du auch die anderen Module herunterladen, von denen es abhängt. Dies bedeutet, dass du über einen Internetzugang verfügen musst, um das Modul zu installieren oder zu aktualisieren. Falls du keinen Internetzugang hast, findest du weitere Informationen unter Building Python modules from a wheel for Spark ETL workloads using AWS Glue 2.0 (Erstellen von Python-Modulen von einem Rad aus für Spark-ETL-Workloads mit AWS Glue 2.0).

Eine Liste der Python-Module, die standardmäßig in jeder Version von AWS Glue enthalten sind, findest du unter Python modules already provided in AWS Glue (Python-Module, die bereits in AWS Glue bereitgestellt werden).

C-basierte Python-Module installieren

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Troubleshooting errors for the AWS CLI (Problembehandlung bei der AWS CLI). Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

AWS Glue unterstützt auch Bibliotheken und Erweiterungen, die in C mit dem Parameter --additional-python-modules geschrieben wurden. Einige Python-Module, beispielsweise spacy und grpc, lassen sich jedoch nur mit Root-Berechtigungen installieren. AWS Glue bietet während der Paketinstallation keinen Root-Zugriff. Um dieses Problem zu lösen, kompiliere die Binärdateien in ein mit AWS Glue kompatibles Rad vor und installiere dieses Rad.

Um eine Bibliothek in einer C-basierten Sprache zu kompilieren, muss der Compiler mit dem Zielbetriebssystem und der betreffenden Prozessorarchitektur kompatibel sein. Wenn die Bibliothek für ein anderes Betriebssystem oder eine andere Prozessorarchitektur kompiliert wurde, wird das Wheel nicht in AWS Glue installiert. Da es sich bei AWS Glue um einen verwalteten Service handelt, ist für die Entwicklung dieser Abhängigkeiten kein Cluster-Zugriff verfügbar.

Gehe wie folgt vor, um ein C-basiertes Python-Modul vorzukompilieren, für das Root-Berechtigungen erforderlich sind:

  1. Starte eine Linux-Instance der Amazon Elastic Compute Cloud (Amazon EC2) (Amazon Linux 2 AMI) mit ausreichend Volume-Platz für deine Bibliotheken.

  2. Installiere Docker auf der EC2-Instance, richte den Nicht-sudo-Zugriff ein und starte dann Docker. Führe dazu den folgenden Befehl aus:

    Installiere Docker:

    sudo yum install docker -y

    Richte den sudo-Zugriff ein:

    sudo su

    Starte Docker:

    sudo service docker start
  3. Erstelle eine Dockerfile-Datei für das Modul. Um beispielsweise das Modul grpcio zu installieren, erstelle eine Datei namens dockerfile_grpcio und kopiere den folgenden Inhalt in die Datei:

    FROM amazonlinux:2  
    # Install required repositories and tools  
    RUN yum update -y  
    RUN yum install shadow-utils.x86_64 -y  
    # Install Java 8 (corrected package name)  
    RUN yum install -y java-1.8.0-openjdk.x86_64  
    # Install Python 3.7  
    WORKDIR /opt  
    RUN yum install -y gcc openssl-devel bzip2-devel libffi-devel wget tar make  
    # Install Python 3.7  
    RUN wget https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz  
    RUN tar xzf Python-3.7.12.tgz  
    WORKDIR /opt/Python-3.7.12  
    RUN ./configure --enable-optimizations  
    RUN make altinstall  
    RUN ln -sf /usr/local/bin/python3.7 /usr/bin/python3  
    RUN ln -sf /usr/local/bin/pip3.7 /usr/bin/pip3  
    # Verify Python version  
    RUN python3 --version  
    RUN pip3 --version  
    # Install other dependencies  
    RUN yum install -y doxygen autoconf automake libtool zlib-devel openssl-devel maven wget protobuf-compiler cmake make gcc-c++  
    RUN yum install -y python3-devel  
    # Install Python packages  
    RUN pip3 install --upgrade pip  
    RUN pip3 install wheel  
    RUN pip3 install cython numpy scipy  
    RUN pip3 install cmake scikit-build  
    # Create wheel directory and install grpcio  
    WORKDIR /root  
    RUN mkdir wheel_dir  
    RUN pip3 install Cython  
    RUN pip3 install grpcio  
    RUN pip3 wheel grpcio -w wheel_dir
  4. Führe den Docker Build aus, um die Dockerfile zu erstellen:

    docker build -f dockerfile_grpcio .
  5. Starte den Docker-Daemon neu:

    sudo service docker restart

    Wenn der Docker-Build-Befehl abgeschlossen ist, erhältst du eine Erfolgsmeldung, die die Docker-Image-ID enthält. Beispiel: „Successfully built 1111222233334444“ Notiere dir die Docker-Image-ID, um sie im nächsten Schritt zu verwenden.

  6. Extrahiere die Rad-Datei .whl aus dem Docker-Container. Führe dazu den folgenden Befehl aus:

    Rufe die Docker-Image-ID ab:

    docker image ls

    Führe den Container aus, aber ersetze 1111222233334444 dabei durch deine Docker-Image-ID:

    docker run -dit 111122223334444

    Überprüfe den Speicherort der Rad-Datei und rufe den Namen der Rad-Datei ab, aber ersetze 5555666677778888 dabei durch deine Container-ID:

    docker exec -t -i 5555666677778888 ls /root/wheel_dir/

    Kopiere das Rad aus dem Docker-Container in Amazon EC2:

    docker cp 5555666677778888:/root/wheel_dir/doc-example-wheel .

    Hinweis: Ersetze doc-example-wheel durch den Namen der generierten Rad-Datei.

  7. Lade das Rad in Amazon S3 hoch, indem du die folgenden Befehle ausführst:

    aws s3 cp doc-example-wheel s3://path/to/wheel/
    aws s3 cp grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl s3://aws-glue-add-modules/grpcio/

    Hinweis: Ersetze grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl durch den Namen deiner Python-Paketdatei.

  8. Öffne die AWS-Glue-Konsole.

  9. Gib für den AWS-Glue-ETL-Auftrag unter Job parameters (Auftragsparameter) Folgendes ein:
    Gib für Key (Schlüssel) --additional-python-modules ein.
    Gib unter Value (Wert) s3://aws-glue-add-modules/grpcio/grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl ein.

Weitere Informationen

Using Python libraries with AWS Glue (Verwenden von Python-Bibliotheken mit AWS Glue)

AWS OFFICIALAktualisiert vor 2 Jahren