Définition d'une archive de dépendances

Vos applications Java ou Scala peuvent nécessiter des fichiers JAR supplémentaires que vous ne pouvez pas, ou ne voulez pas, regrouper dans un 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, le service de flux de données a la possibilité de fournir une archive ZIP (archive.zip) avec votre application pour regrouper les dépendances de tierce partie. 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 archive.zip correctement, les bibliothèques Python sont ajoutées à l'exécution et les fichiers JAR sont ajoutés au chemin de classe Spark. Les bibliothèques ajoutées sont propres à une exécution. Cela signifie qu'ils n'interfèrent pas avec d'autres exécutions concurrentes ou ultérieures. Une seule archive peut être fournie par exécution.

Tout le contenu de l'archive doit être compatible avec l'environnement d'exécution du service de flux de données. Par exemple, le flux de données s'exécute sur Oracle Linux à l'aide de versions particulières de Java et 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. Le service de flux de données fournit des outils pour vous aider à créer des archives contenant des logiciels compatibles. Cependant, ces archives sont des fichiers zip ordinaires, de sorte que vous êtes libre de les créer comme vous voulez. Si vous utilisez vos propres outils, vous devez vérifier leur compatibilité.

Les archives de dépendances, comme vos applications Spark, sont chargées dans le service de flux de données. La définition de votre application de flux de données contient un lien vers cette archive, qui peut être remplacée au moment de l'exécution. Lorsque vous exécutez votre application, l'archive est téléchargée et installée avant l'exécution de la tâche Spark. L'archive est privée à 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, sans aucun conflit. Les dépendances ne persistent pas entre les exécutions. Il n'y a donc aucun problème avec les versions conflictuelles des autres applications Spark que vous pouvez exécuter.

Création d'une archive de dépendances à l'aide de l'ensemble de dépendances du service de flux de données

  1. Téléchargez docker.
  2. Téléchargez l'image de l'encapsuleur :
    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
    Note

    N'incluez pas pyspark ou py4j. Ces dépendances sont fournies par le service de flux de données, et leur inclusion entraîne l'échec des exécutions.
    L'ensembleur de dépendances du service de flux de données utilise l'outil Pip de Python pour installer toutes les dépendances. Si vous disposez de fichiers wheel Python qui ne peuvent pas être téléchargés à partir de sources publiques, placez-les dans un répertoire sous celui dans lequel vous créez l'ensemble. Voyez-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 considère 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'encapsuleur de dépendances du service de flux de données utilise Apache Maven pour télécharger les fichiers JAR de dépendances. Si vous disposez de fichiers JAR qui ne peuvent pas être téléchargés à partir de sources publiques, placez-les dans un répertoire sous celui dans lequel vous créez le paquetage. Tous les fichiers JAR situés dans les répertoires situés sous celui où vous créez l'ensemble, sont inclus dans l'archive.

  5. Utilisez un conteneur docker pour créer l'archive .
    Note

    La version de Python doit être réglée à 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 sous 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, exécutez 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, exécutez 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 créer l'archive à l'aide de Podman, utilisez cette commande dans 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 le mappage du volume docker au 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 déployer un fichier de données, un fichier de modèle ML ou un exécutable que le programme Spark appelle au moment de l'exécution. Pour ce faire, ajoutez des fichiers dans archive.zip après l'avoir créé à l'étape 4.

    Pour les applications Java :

    1. Décompressez archive.zip.
    2. Ajoutez les fichiers JAR uniquement dans le répertoire java/.
    3. Compressez le fichier.
    4. Chargez-le dans le stockage d'objets.
    Pour les applications Python :
    1. Décompressez archive.zip.
    2. Ajoutez vos modules locaux aux trois sous-répertoires suivants du répertoire python/ :
      python/lib
      python/lib32
      python/lib64
    3. Compressez le fichier.
    4. Chargez-le dans le magasin d'objets.
    Note

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

    Lors de l'exécution de l'application de flux de données, le contenu statique est disponible dans n'importe quel noeud sous le répertoire où 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/ dans n'importe quel noeud.

  7. Chargez archive.zip dans le magasin d'objets.
  8. Ajoutez la bibliothèque à l'application. Voir Création d'une application de flux de données Java ou Scala ou Création d'une application de flux de données PySpark pour savoir comment faire.

Structure de l'archive de dépendances

Les archives de dépendances sont des fichiers zip ordinaires. Les utilisateurs expérimentés peuvent créer des archives à l'aide de leurs propres outils, plutôt qu'à l'aide de Data Flow Dependency Packager. 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>
Note

Le service de flux de données extrait les fichiers d'archives du répertoire /opt/dataflow.

Valider un fichier Archive.zip à l'aide de l'ensemble de dépendances du service de flux de données

Vous pouvez utiliser l'ensemble de dépendances du service de données pour valider un fichier archive.zip localement, avant de charger le fichier dans le stockage d'objets.

Naviguez jusqu'au répertoire contenant le fichier archive.zip et exécutez les commandes suivantes, selon 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 comprend la trousse SDK pour Python version 2.14.3 du service de flux de données dans une application de flux de données :
-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 une combinaison de sources PyPI, de sources Web et de sources locales pour les fichiers 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écharger et extraire les fichiers JAR des pilotes compatibles dans un répertoire sous lequel vous créez le paquetage. Par exemple, pour encapsuler le pilote JDBC Oracle 18.3 (18c), 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