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

Lesedauer: 5 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 dein 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 aus.
  3. Wähle den Job aus, zu dem du das Python-Modul hinzufügen möchtest.
  4. Wähle Aktionen und dann Job bearbeiten aus.
  5. Erweitere den Abschnitt Sicherheitskonfiguration, Skriptbibliotheken und Jobparameter (optional).
  6. Gehe unter Jobparameter wie folgt vor:
    Gib für Schlüssel --additional-python-modules ein.
    Gib als Wert eine durch Komma getrennte Liste von Modulen ein, die du hinzufügen möchtest.
  7. Wähle Speichern.

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 über keinen Internetzugang verfügst, findest du weitere Informationen unter 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 AWS Glue-Version enthalten sind, findest du unter Python-Module, die bereits in AWS Glue bereitgestellt werden.

Installation C-basierter Python-Module

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter 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 deine 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. Zum 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 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 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: Ersetzen von 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 Auftragsparameter Folgendes ein:
    Gib für Schlüssel --additional-python-modules ein.
    Gib als Wert s3://aws-glue-add-modules/grpcio/grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl ein.

Ähnliche Informationen

Using Python libraries with AWS Glue

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Monat