Abhängigkeitsarchiv bereitstellen

Für Ihre Java- oder Scala-Anwendungen sind möglicherweise zusätzliche JAR-Dateien erforderlich, die Sie nicht in einem Fat JAR bündeln können oder möchten. Oder Sie möchten nativen Code oder andere Assets aufnehmen, um diese Elemente innerhalb der Spark-Laufzeit verfügbar zu machen.

Wenn die spark-submit-Optionen nicht funktionieren, hat Data Flow die Möglichkeit, ein ZIP-Archiv (archive.zip) zusammen mit Ihrer Anwendung zum Bündeln von Drittanbieterabhängigkeiten bereitzustellen. Das ZIP-Archiv kann mit einem Docker-basierten Tool erstellt werden. Die archive.zip wird auf allen Spark-Knoten installiert, bevor die Anwendung ausgeführt wird. Wenn Sie die archive.zip korrekt erstellen, werden die Python-Librarys der Laufzeit hinzugefügt und die JAR-Dateien werden dem Spark-Classpath hinzugefügt. Die hinzuzufügenden Librarys sind für eine Ausführung isoliert. Das bedeutet, dass sie nicht in andere gleichzeitige Ausführungen oder spätere Ausführungen eingreifen. Pro Ausführung kann nur ein Archiv angegeben werden.

Alle Elemente im Archiv müssen mit der Datenflusslaufzeit kompatibel sein. Data Flow wird beispielsweise unter Oracle Linux mit bestimmten Versionen von Java und Python ausgeführt. Für andere Betriebssysteme oder für andere Java-Versionen kompilierte JAR-Dateien können dazu führen, dass die Ausführung nicht erfolgreich verläuft. Data Flow bietet Tools, mit denen Sie Archive mit kompatibler Software erstellen können. Allerdings handelt es sich bei diesen Archiven um gewöhnliche ZIP-Dateien, d.h. Sie können sie frei nach Ihren Wünschen erstellen. Wenn Sie Ihre eigenen Tools verwenden, sind Sie für die Kompatibilität verantwortlich.

Abhängigkeitsarchive, ähnlich wie Ihre Spark-Anwendungen, werden in Data Flow geladen. Die Datenflussanwendungsdefinition enthält einen Link zu diesem Archiv, der zur Laufzeit überschrieben werden kann. Wenn Sie Ihre Anwendung ausführen, wird das Archiv heruntergeladen und installiert, bevor der Spark-Job ausgeführt wird. Das Archiv ist privat für die Ausführung. Das heißt beispielsweise, dass Sie gleichzeitig zwei verschiedene Instanzen derselben Anwendung mit unterschiedlichen Abhängigkeiten, jedoch ohne Konflikte, ausführen können. Abhängigkeiten bleiben zwischen Ausführungen nicht bestehen. Daher gibt es keine Probleme mit widersprüchlichen Versionen für andere Spark-Anwendungen, die Sie möglicherweise ausführen.

Abhängigkeitsarchiv mit dem Data Flow Dependency Packager erstellen

  1. Laden Sie Docker herunter.
  2. Laden Sie das Packager-Toolimage herunter:
    ARM-Ausprägung:
    docker pull phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest
    AMD-Ausprägung:
    docker pull phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest
  3. Erstellen Sie für Python-Abhängigkeiten eine requirements.txt-Datei. Sie könnte beispielsweise wie folgt aussehen:
    numpy==1.18.1
    pandas==1.0.3
    pyarrow==0.14.0
    Hinweis

    Nehmen Sie pyspark oder py4j nicht auf. Diese Abhängigkeiten werden von Data Flow bereitgestellt. Wenn Sie sie einfügen, verläuft die Ausführung nicht erfolgreich.
    Der Data Flow Dependency Packager verwendet das Python-Tool pip, um alle Abhängigkeiten zu installieren. Wenn Sie über Python Wheels verfügen, die nicht von öffentlichen Quellen heruntergeladen werden können, legen Sie sie in einem Verzeichnis unterhalb des Speicherorts ab, in dem Sie das Package erstellen. Siehe sie in requirements.txt mit dem Präfix /opt/dataflow/. Beispiel:
    /opt/dataflow/<my-python-wheel.whl>

    Dabei steht <my-python-wheel.whl> für den Namen des Python Wheel. Pip betrachtet es als lokale Datei und installiert es normal.

  4. Erstellen Sie für Java-Abhängigkeiten eine Datei namens packages.txt. Sie könnte beispielsweise wie folgt aussehen:
    ml.dmlc:xgboost4j:0.90
    ml.dmlc:xgboost4j-spark:0.90
    https://repo1.maven.org/maven2/com/nimbusds/nimbus-jose-jwt/8.11/nimbus-jose-jwt-8.11.jar

    Der Data Flow Dependency Packager verwendet Apache Maven, um Abhängigkeits-JAR-Dateien herunterzuladen. Wenn Sie JAR-Dateien verwenden, die nicht von öffentlichen Quellen heruntergeladen werden können, speichern Sie sie in einem lokalen Verzeichnis unterhalb des Speicherorts, in dem Sie das Package erstellen. Alle JAR-Dateien, die in einem Unterverzeichnis des Speicherorts gespeichert sind, in dem Sie das Package erstellen, werden in das Archiv aufgenommen.

  5. Verwenden Sie einen Docker-Container, um das Archiv zu erstellen.
    Hinweis

    Die Python-Version muss bei Verwendung von Spark 3.5.0, 3.8 bei Verwendung von Spark 3.2.1 und 3.6 bei Verwendung von Spark 3.0.2 oder Spark 2.4.4 auf 3.11 gesetzt sein. In den folgenden Befehlen stellt <python_version> diese Zahl dar.

    Geben Sie den folgenden Befehl ein, wenn Sie MacOS oder Linux verwenden:

    AMD64:

    docker run --platform linux/amd64 --rm -v $(pwd):/opt/dataflow 
    --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest -p <python_version>

    ARM64:

    docker run --platform linux/arm64 --rm -v $(pwd):/opt/dataflow 
    --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest -p <python_version>

    Wenn Sie die Windows-Eingabeaufforderung als Administrator verwenden, geben Sie folgenden Befehl ein:

    AMD64:

    docker run --platform linux/amd64 --rm -v %CD%:/opt/dataflow 
    --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest -p <python_version>

    ARM64:

    docker run --platform linux/arm64 --rm -v %CD%:/opt/dataflow 
    --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest -p <python_version>

    Wenn Sie Windows PowerShell als Administrator verwenden, geben Sie folgenden Befehl ein:

    AMD64:

    docker run --platform linux/amd64 --rm -v ${PWD}:/opt/dataflow 
    --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest -p <python_version>

    ARM64:

    docker run --platform linux/arm64 --rm -v ${PWD}:/opt/dataflow 
    --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest -p <python_version>

    Verwenden Sie den folgenden Befehl in Linux, um das Archiv mit Podman zu erstellen:

    AMD64:

    podman run --platform linux/amd64 --rm -v $(pwd):/opt/dataflow:Z -u root 
    -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest -p <python_version>

    ARM64:

    podman run --platform linux/arm64 --rm -v $(pwd):/opt/dataflow:Z -u root 
    -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest -p <python_version>

    Mit diesen Befehlen wird eine Datei namens archive.zip erstellt.

    Das Arbeitsverzeichnis wird durch pwd dargestellt. Das Kennzeichen -v gibt die Zuordnung von Docker-Volumes zum lokalen Dateisystem an.

  6. Sie können statischen Inhalt hinzufügen. Möglicherweise möchten Sie weitere Inhalte in das Archiv aufnehmen. Sie können beispielsweise eine Datendatei, eine ML-Modelldatei oder eine ausführbare Datei bereitstellen, die das Spark-Programm zur Laufzeit aufruft. Hierzu fügen Sie entsprechenden Dateien zu archive.zip hinzu, nachdem Sie sie in Schritt 4 erstellt haben.

    Für Java-Anwendungen:

    1. Dekomprimieren Sie die Datei archive.zip.
    2. Fügen Sie die JAR-Dateien nur im Verzeichnis java/ hinzu.
    3. Erstellen Sie eine ZIP-Datei.
    4. Laden Sie sie in Object Storage hoch.
    Für Python-Anwendungen:
    1. Dekomprimieren Sie die Datei archive.zip.
    2. Fügen Sie lokale Module nur in diesen drei Unterverzeichnissen des Verzeichnisses python/ hinzu:
      python/lib
      python/lib32
      python/lib64
    3. Erstellen Sie eine ZIP-Datei.
    4. Laden Sie sie in den Objektspeicher hoch.
    Hinweis

    Sie dürfen die Java- und Python-Abhängigkeiten nur in diesen vier Verzeichnissen speichern.

    Bei der Ausführung der Datenflussanwendung ist der statische Inhalt auf jedem Knoten unter dem Verzeichnis verfügbar, in dem Sie ihn speichern. Beispiel: Wenn Sie Dateien unter python/lib/ im Archiv hinzugefügt haben, sind sie auf jedem Knoten im Verzeichnis /opt/dataflow/python/lib/ verfügbar.

  7. Laden Sie archive.zip in den Objektspeicher hoch.
  8. Fügen Sie die Library zur Anwendung hinzu. Informationen hierzu finden Sie unter Java- oder Scala-Data Flow-Anwendungen erstellen oder PySpark-Data Flow-Anwendungen erstellen.

Die Struktur des Abhängigkeitsarchivs

Abhängigkeitsarchive sind gewöhnliche ZIP-Dateien. Fortgeschrittene Benutzer möchten Archive möglicherweise mit eigenen Tools statt mit Data Flow Dependency Packager erstellen. Ein korrekt aufgebautes Abhängigkeitsarchiv weist die folgende allgemeine Modellstruktur auf:

python
python/lib
python/lib/python3.6/<your_library1>
python/lib/python3.6/<your_library2>
python/lib/python3.6/<...>
python/lib/python3.6/<your_libraryN>
python/lib/user
python/lib/user/<your_static_data>
java
java/<your_jar_file1>
java/<...>
java/<your_jar_fileN>
Hinweis

Data Flow extrahiert Archivdateien im Verzeichnis /opt/dataflow.

Archive.zip-Datei mit dem Data Flow Dependency Packager validieren

Mit dem Data Flow Dependency Packager können Sie eine archive.zip-Datei lokal validieren, bevor Sie die Datei in Object Storage hochladen.

Navigieren Sie zu dem Verzeichnis, das die Datei archive.zip enthält, und führen Sie je nach Ausprägung die folgenden Befehle aus:

ARM64:
docker run --platform linux/arm64 --rm -v $(pwd):/opt/dataflow  --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest  -p 3.11 --validate archive.zip
AMD64:
docker run --platform linux/amd64 --rm -v $(pwd):/opt/dataflow  --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest   -p 3.11 --validate archive.zip

Beispiele für Requirements.txt- und Packages.txt-Dateien

Dieses Beispiel einer requirements.txt-Datei enthält die Datenfluss-SDK für Python-Version 2.14.3 in einer Datenflussanwendung:
-i https://pypi.org/simple
certifi==2020.4.5.1
cffi==1.14.0
configparser==4.0.2
cryptography==2.8
oci==2.14.3
pycparser==2.20
pyopenssl==19.1.0
python-dateutil==2.8.1
pytz==2020.1
six==1.15.0
Dieses Beispiel einer requirements.txt-Datei enthält eine Mischung aus PyPI-Quellen, Webquellen und lokalen Quellen für Python Wheel-Dateien:
-i https://pypi.org/simple
blis==0.4.1
catalogue==1.0.0
certifi==2020.4.5.1
chardet==3.0.4
cymem==2.0.3
https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.2.0/en_core_web_sm-2.2.0.tar.gz#egg=en-core-web-sm
idna==2.9
importlib-metadata==1.6.0 ; python_version < '3.8'
murmurhash==1.0.2
numpy==1.18.3
plac==1.1.3
preshed==3.0.2
requests==2.23.0
spacy==2.2.4
srsly==1.0.2
thinc==7.4.0
tqdm==4.45.0
urllib3==1.25.9
wasabi==0.6.0
zipp==3.1.0
/opt/dataflow/mywheel-0.1-py3-none-any.whl
Um eine Verbindung zu Oracle-Datenbanken wie ADW herzustellen, müssen Sie Oracle JDBC-JAR-Dateien einfügen. Laden Sie JAR-Dateien des kompatiblen Treibers herunter, und extrahieren Sie sie in ein Verzeichnis unter dem Speicherort, in dem Sie das Package erstellen. Beispiel: Um ein Package für den JDBC-Treiber von Oracle 18.3 (18c) zu erstellen, stellen Sie sicher, dass alle diese JAR-Dateien vorhanden sind:
ojdbc8-18.3.jar
oraclepki-18.3.jar
osdt_cert-18.3.jar
osdt_core-18.3.jar
ucp-18.3.jar