Spécification d'une archive de dépendances

Vos applications Java ou Scala peuvent avoir besoin de fichiers JAR supplémentaires que vous ne pouvez pas ou ne voulez pas regrouper dans un fichier Fat JAR. Vous pouvez également inclure du code natif ou d'autres ressources à mettre à disposition dans l'exécution Spark.

Lorsque les options spark-submit ne fonctionnent pas, Data Flow a la possibilité de fournir une archive ZIP (archive.zip) avec votre application pour regrouper les dépendances tierces. L'archive ZIP peut être créée à l'aide d'un outil basé sur Docker. archive.zip est installé sur tous les noeuds Spark avant d'exécuter l'application. Si vous construisez correctement archive.zip, les bibliothèques Python sont ajoutées à l'exécution et les fichiers JAR sont ajoutés à la variable d'environnement CLpath Spark. Les bibliothèques ajoutées sont isolées sur une seule exécution. Cela signifie qu'ils n'interfèrent pas avec d'autres exécutions simultanées ou ultérieures. Une seule archive par exécution peut être fournie.

Tout élément de l'archive doit être compatible avec l'exécution Data Flow. Par exemple, Data Flow est exécuté sur Oracle Linux à l'aide de versions particulières de Java et de Python. Le code binaire compilé pour d'autres systèmes d'exploitation ou les fichiers JAR compilés pour d'autres versions de Java peuvent entraîner l'échec de l'exécution. Data Flow fournit des outils pour vous aider à créer des archives avec un logiciel compatible. Cependant, ces archives étant des fichiers ZIP ordinaires, vous êtes libre de les créer comme vous le souhaitez. Si vous utilisez vos propres outils, vous avez la responsabilité d'assurer la compatibilité.

Les archives de dépendances, de même que vos applications Spark, sont chargées vers Data Flow. Votre définition d'application Data Flow contient un lien vers cette archive, qui peut être remplacée lors de l'exécution. Lorsque vous exécutez votre application, l'archive est téléchargée et installée avant l'exécution du travail Spark. L'archive est privée pour l'exécution. Cela signifie, par exemple, que vous pouvez exécuter simultanément deux instances différentes de la même application, avec des dépendances différentes, mais sans conflit. Les dépendances ne sont pas persistantes entre les exécutions, il n'y a donc aucun problème de versions conflictuelles pour les autres applications Spark que vous pouvez exécuter.

Création d'une archive de dépendances à l'aide de l'utilitaire de package de dépendances Data Flow

  1. Téléchargez docker.
  2. Téléchargez l'image de l'utilitaire de package :
    Forme ARM :
    docker pull phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest
    Forme AMD :
    docker pull phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest
  3. Pour les dépendances Python, créez un fichier requirements.txt. Par exemple, il peut ressembler à :
    numpy==1.18.1
    pandas==1.0.3
    pyarrow==0.14.0
    Remarque

    N'incluez pas pyspark ni py4j. Ces dépendances sont fournies par Data Flow et leur inclusion entraîne l'échec des exécutions.
    L'utilitaire de package de dépendances Data Flow utilise l'outil pip de Python pour installer toutes les dépendances. Si vous disposez de wheels Python qui ne peuvent pas être téléchargés à partir de sources publiques, placez-les dans le répertoire sous lequel vous créez le package. Consultez-les dans requirements.txt avec le préfixe /opt/dataflow/. Par exemple :
    /opt/dataflow/<my-python-wheel.whl>

    où <my-python-wheel.whl> représente le nom de la roue Python. Pip le voit comme un fichier local et l'installe normalement.

  4. Pour les dépendances Java, créez un fichier nommé packages.txt. Par exemple, il peut ressembler à :
    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

    L'utilitaire de package de dépendances Data Flow utilise Apache Maven pour télécharger les fichiers JAR de dépendance. Si vous disposez de fichiers JAR qui ne peuvent pas être téléchargés à partir de sources publiques, placez-les dans le répertoire local sous lequel vous créez le package. Tous les fichiers JAR de n'importe quel sous-répertoire dans lequel vous créez le package sont inclus dans l'archive.

  5. Utilisez le conteneur Docker pour créer l'archive.
    Remarque

    La version de Python doit être définie sur 3.11 lors de l'utilisation de Spark 3.5.0, 3.8 lors de l'utilisation de Spark 3.2.1 et 3.6 lors de l'utilisation de Spark 3.0.2 ou de Spark 2.4.4. Dans les commandes suivantes, <python_version> représente ce nombre.

    Utilisez cette commande avec MacOS ou Linux :

    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>

    Si vous utilisez l'invite de commande Windows en tant qu'administrateur, appliquez cette commande :

    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>

    Si vous utilisez Windows PowerShell en tant qu'administrateur, appliquez cette commande :

    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>

    Pour utiliser Podman pour créer l'archive, utilisez la commande suivante sous Linux :

    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>

    Ces commandes créent un fichier nommé archive.zip.

    Le répertoire de travail est représenté par pwd. L'indicateur -v indique une correspondance de volume docker avec le système de fichiers local.

  6. Vous pouvez ajouter du contenu statique. Vous pouvez inclure d'autres contenus dans l'archive. Par exemple, vous pouvez vouloir déployer un fichier de données, un fichier de modèle d'apprentissage automatique ou un exécutable que le programme Spark appelle lors de l'exécution. Pour ce faire, ajoutez des fichiers à archive.zip après avoir créé l'archive à l'étape 4.

    Pour les applications Java :

    1. Décompressez archive.zip.
    2. Ajoutez les fichiers JAR dans le répertoire java/ uniquement.
    3. Compressez le fichier.
    4. Téléchargez-le vers Object Storage.
    Pour les applications Python :
    1. Décompressez archive.zip.
    2. Ajoutez les modules locaux uniquement aux trois sous-répertoires suivants du répertoire python/ :
      python/lib
      python/lib32
      python/lib64
    3. Compressez le fichier.
    4. Téléchargez-le vers la banque d'objets.
    Remarque

    Seuls ces quatre répertoires sont autorisés à stocker les dépendances Python et Java.

    Lorsque l'application Data Flow est exécutée, le contenu statique est disponible sur n'importe quel noeud du répertoire dans lequel vous avez choisi de le placer. Par exemple, si vous avez ajouté des fichiers sous python/lib/ dans l'archive, ils sont disponibles dans le répertoire /opt/dataflow/python/lib/ sur n'importe quel noeud.

  7. Téléchargez archive.zip vers la banque d'objets.
  8. Ajoutez la bibliothèque à l'application. Pour savoir comment procéder, reportez-vous à Création d'une application Data Flow Java ou Scala ou à Création d'une application Data Flow PySpark.

Structure de l'archive de dépendances

Les archives de dépendances sont des fichiers ZIP ordinaires. Les utilisateurs avancés peuvent créer des archives à l'aide de leurs propres outils plutôt que d'utiliser l'utilitaire de package de dépendances Data Flow. Une archive de dépendances correctement construite présente l'outline générale suivante :

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>
Remarque

Data Flow extrait les fichiers d'archive sous le répertoire /opt/dataflow.

Validation d'un fichier Archive.zip à l'aide de l'utilitaire de package de dépendances Data Flow

Vous pouvez l'utiliser pour valider un fichier archive.zip localement avant de le télécharger vers Object Storage.

Accédez au répertoire contenant le fichier archive.zip et exécutez les commandes suivantes, en fonction de la forme :

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

Exemples de fichiers Requirements.txt et Packages.txt

Cet exemple de fichier requirements.txt inclut le kit SDK pour Python version 2.14.3 de Data Flow dans une application Data Flow :
-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
Cet exemple de fichier requirements.txt comprend un mélange de sources PyPI, de sources Web et de sources locales pour les fichiers de wheel Python :
-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
Pour vous connecter à des bases de données Oracle comme ADW, vous devez inclure des fichiers JAR Oracle JDBC. Téléchargez et extrayez les fichiers JAR des pilotes compatibles dans le répertoire dans lequel vous créez le package. Par exemple, pour packager le pilote Oracle 18.3 (18c) JDBC, assurez-vous que tous les fichiers JAR suivants sont présents :
ojdbc8-18.3.jar
oraclepki-18.3.jar
osdt_cert-18.3.jar
osdt_core-18.3.jar
ucp-18.3.jar