Fonctionnalité spark-submit dans Data Flow

Découvrez comment utiliser Data Flow avec spark-submit.

Compatibilité avec spark-submit

Vous pouvez utiliser des options compatibles avec spark-submit pour l'exécution de vos applications à l'aide de Data Flow.

Spark-submit est une commande standard du secteur pour l'exécution d'applications sur des clusters Spark. Voici les options compatibles avec spark-submit qui sont prises en charge par Data Flow :

  • --conf
  • --files
  • --py-files
  • --jars
  • --class
  • --driver-java-options
  • --packages
  • main-application.jar ou main-application.py
  • arguments de main-application. Arguments transmis à la méthode principale de votre classe principale (le cas échéant).

L'option --files aplatit votre hiérarchie de fichiers, de sorte que tous les fichiers sont placés au même niveau dans le répertoire de travail en cours. Pour conserver la hiérarchie de fichiers, utilisez archive.zip ou --py-files avec un module de dépendance JAR, ZIP ou EGG.

L'option --packages permet d'inclure d'autres dépendances en fournissant une liste de coordonnées Maven séparées par des virgules. Par exemple :
--packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.2
Toutes les dépendances transitives sont gérées lors de l'utilisation de cette commande.
Remarque

Avec l'option --packages, le pod de pilote de chaque exécution doit télécharger les dépendances de façon dynamique. Ce téléchargement dépend de la stabilité du réseau et de l'accès au référentiel central ou aux autres référentiels distants Maven. Utilisez l'utilitaire de package de dépendances Data Flow afin de générer une archive de dépendances pour la production.
Remarque

Pour toutes les options spark-submit dans Data Flow, l'URI doit commencer par oci://.... Les URI commençant par local://... ou hdfs://... ne sont pas pris en charge. Utilisez les noms de domaine qualifiés complets dans l'URI. Chargez tous les fichiers, y compris main-application, dans Oracle Cloud Infrastructure Object Storage.

Création d'une application Data Flow de soumission Spark explique comment créer une application dans la console à l'aide de spark-submit. Vous pouvez également utiliser spark-submit avec un kit SDK Java ou à partir de l'interface de ligne de commande. Si vous utilisez l'interface de ligne de commande, vous n'avez pas besoin de créer d'application Data Flow pour exécuter votre application Spark avec des options compatibles avec spark-submit sur Data Flow. Cette option se révèle très pratique si vous disposez déjà d'une commande spark-submit dans un autre environnement. Lorsque vous suivez la syntaxe de la commande run submit, une application est créée s'il n'en n'existe pas déjà une dans l'URI main-application.

Installation d'une interface de ligne de commande publique à l'aide de la commande run submit

Afin d'installer une CLI publique à l'aide de la commande run submit pour une utilisation avec Data Flow, procédez comme suit :

  1. Créez un environnement Python personnalisé à utiliser comme destination de l'interface de ligne de commande.
    python3.9 -m venv cli-3
    source cli-3/bin/activate
  2. Installez l'interface de ligne de commande publique.
  3. Vérifiez que les commandes run submit sont chargées :
    oci --version
     
    oci data-flow run submit
    Usage: oci data-flow run submit [OPTIONS]
     
    Error: Missing option(s) --compartment-id, --execute.
  4. Authentifiez la session :
    oci session authenticate
    • Sélectionnez une région dans la liste.
    • Entrez le nom du profil à créer.
    • Créez un profil de jeton :
      oci iam region list --config-file /Users/<user-name>/.oci/config --profile <profile_name> --auth security_token

Utilisation de la soumission Spark dans Data Flow

Vous pouvez convertir la commande d'interface de ligne de commande spark-submit en une commande compatible dans Data Flow.

La commande compatible avec spark-submit dans Data Flow est la commande run submit. Si vous disposez déjà d'une application Spark fonctionnelle dans un cluster, vous connaissez déjà la syntaxe spark-submit. Par exemple :
spark-submit --master spark://<IP-address>:port \
--deploy-mode cluster \
--conf spark.sql.crossJoin.enabled=true \
--files oci://file1.json \
--class org.apache.spark.examples.SparkPi \ 
--jars oci://file2.jar <path_to>/main_application_with-dependencies.jar 1000
Pour exécuter cette application dans Data Flow, commande d'interface de ligne de commande :
oci data-flow run submit \
--compartment-id <compartment-id> \
--execute "--conf spark.sql.crossJoin.enabled=true
 --files oci://<bucket-name>@<namespace>/path/to/file1.json
 --jars oci://<bucket-name>@<namespace>/path/to/file2.jar
 oci://<bucket-name>@<namespace>/path_to_main_application_with-dependencies.jar 1000"
Pour obtenir la commande Data Flow compatible, procédez comme suit :
  1. Téléchargez tous les fichiers, y compris l'application principale, dans Object Storage.
  2. Remplacez les URI existants par l'URI oci://... correspondant.
  3. Enlevez tous les paramètres spark-submit non pris en charge ou réservés. Par exemple, --master et --deploy-mode sont réservés à Data Flow et un utilisateur n'a pas besoin de les renseigner.

  4. Ajoutez le paramètre --execute et transmettez-le dans une chaîne de commande compatible spark-submit. Pour créer la chaîne --execute, conservez dans l'ordre les paramètres spark-submit pris en charge, ainsi que l'application principale et ses arguments. Placez-les dans une chaîne entre guillemets (guillemets simples ou guillemets doubles).

  5. Remplacez spark submit par le préfixe de commande standard d'Oracle Cloud Infrastructure : oci data-flow run submit.
  6. Ajoutez l'argument obligatoire et les paires de paramètre d'Oracle Cloud Infrastructure pour --profile, --auth security_token et --compartment-id.

Exemples de run submit

Voici des exemples de run submit dans Data Flow.

  • Exemples d'utilisation de run submit avec oci-cli.
  • Exemple d'utilisation de run submit avec oci-curl.

Exemples d'oci-cli

Exemples d'utilisation de run submit avec oci-cli dans Data Flow.

Code run submit de base :
oci --profile oci-cli --auth security_token data-flow run submit \
--compartment-id <compartment-id> \
--execute "--conf spark.sql.crossJoin.enabled=true
 --class org.apache.spark.examples.SparkPi
 oci://<bucket-name>@<tenancy-name>/spark-examples_2.11-2.3.1-SNAPSHOT-jar-with-dependencies.jar 10"
Code run submit avec des configurations facultatives pour --jars, --files et pyfiles :
oci --profile oci-cli --auth security_token data-flow run submit \
--compartment-id <compartment-id> \
--execute "--jars oci://<bucket-name>@<tenancy-name>/a.jar
 --files \"oci://<bucket-name>@<tenancy-name>/b.json\"
 --py-files oci://<bucket-name>@<tenancy-name>/c.py
 --conf spark.sql.crossJoin.enabled=true
 --class org.apache.spark.examples.SparkPi
 oci://<bucket-name>@<tenancy-name>/spark-examples_2.11-2.3.1-SNAPSHOT-jar-with-dependencies.jar 10"
Code run submit avec archiveUri, --jars, --files et pyfiles :
oci --profile oci-cli --auth security_token data-flow run submit \
--compartment-id <compartment-id> \
--archive-uri  "oci://<bucket-name>@<tenancy-name>/mmlspark_original.zip" \
--execute "--jars local:///opt/dataflow/java/mmlspark_2.11-0.18.1.jar
 --files \"local:///opt/dataflow/java/mmlspark_2.11-0.18.1.jar\"
 --py-files local:///opt/dataflow/java/mmlspark_2.11-0.18.1.jar
 --conf spark.sql.crossJoin.enabled=true
 --class org.apache.spark.examples.SparkPi
 oci://<bucket-name>@<tenancy-name>/spark-examples_2.11-2.3.1-SNAPSHOT-jar-with-dependencies.jar 10"
Code run submit avec validation d'URL dans jars, files et pyfiles :
oci --profile oci-cli --auth security_token data-flow run submit \
--compartment-id <compartment-id> \
--archive-uri  "oci://<bucket-name>@<tenancy-name>/mmlspark_original.zip" \
--execute "--jars oci://<bucket-name>@<tenancy-name>/fake.jar
 --conf spark.sql.crossJoin.enabled=true
 --class org.apache.spark.examples.SparkPi
 oci://<bucket-name>@<tenancy-name>/spark-examples_2.11-2.3.1-SNAPSHOT-jar-with-dependencies.jar 10"
#result
{'opc-request-id': '<opc-request-id>', 'code': 'InvalidParameter',
 'message': 'Invalid OCI Object Storage uri. The object was not found or you are not authorized to access it.
 {ResultCode: OBJECTSTORAGE_URI_INVALID,
 Parameters: [oci://<bucket-name>@<tenancy-name>/fake.jar]}', 'status': 400}

Pour activer l'authentification par principal de ressource, ajoutez la propriété Spark dans le fichier de configuration à l'aide de spark-submit, puis ajoutez la configuration suivante dans la méthode execute :

--execute 
"--conf dataflow.auth=resource_principal
 --conf other-spark-property=other-value" 

Exemple d'oci-curl

Exemple de code run submit utilisant oci-curl dans Data Flow.

oci-curl <IP-Address>:443 POST /Users/<user-name>/workspace/sss/dependency_test/spark-submit-test.json
 /latest/runs --insecure --noproxy <IP-Address>
 
{
"execute": "--jars local:///opt/dataflow/java/mmlspark_2.11-0.18.1.jar
 --files \"local:///opt/spark/examples/jars/spark-examples_2.11-2.4.4.jar\"
 --py-files local:///opt/spark/conf/spark.properties
 --conf spark.sql.crossJoin.enabled=true
 --class org.apache.spark.examples.SparkPi
     oci://<bucket-name>@<tenancy-name>/spark-examples_2.11-2.3.1-SNAPSHOT-jar-with-dependencies.jar 10",
"displayName": "spark-submit-test",
"sparkVersion": "2.4",
"driverShape": "VM.Standard2.1",
"executorShape": "VM.Standard2.1",
"numExecutors": 1,
"logsBucketUri": "",
"freeformTags": {},
"definedTags": {}
}