Wie verwende ich externe Python-Bibliotheken in meinem AWS-Glue-ETL-Auftrag?
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:
- Öffne die AWS Glue-Konsole.
- Wähle im Navigationsbereich Jobs aus.
- Wähle den Job aus, zu dem du das Python-Modul hinzufügen möchtest.
- Wähle Aktionen und dann Job bearbeiten aus.
- Erweitere den Abschnitt Sicherheitskonfiguration, Skriptbibliotheken und Jobparameter (optional).
- 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. - 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:
-
Starte eine Linux-Instance der Amazon Elastic Compute Cloud (Amazon EC2) (Amazon Linux 2 AMI) mit ausreichend Volume-Platz für deine Bibliotheken.
-
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
-
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
-
Führe den Docker Build aus, um deine Dockerfile zu erstellen:
docker build -f dockerfile\_grpcio .
-
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.
-
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
-
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.
-
Öffne die AWS Glue-Konsole.
-
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
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 2 Monaten
- AWS OFFICIALAktualisiert vor einem Monat
- AWS OFFICIALAktualisiert vor 4 Jahren