Fonctionnalité spark-submit dans le service de flux de données

Voyez comment utiliser le service de flux de données avec spark-submit.

Compatibilité avec spark-submit

Vous pouvez utiliser des options compatibles avec spark-submit pour exécuter vos applications à l'aide du service de flux de données.

Spark-submit est une commande standard de l'industrie permettant d'exécuter des applications dans les grappes Spark. Les options compatibles avec spark-submit suivantes sont prises en charge par le service de flux de données :

  • --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 (si elle existe).

L'option --files aplatit votre hiérarchie de fichiers, de sorte que tous les fichiers se retrouvent au même niveau dans le répertoire de travail courant. 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 toutes les autres dépendances en fournissant une liste délimitée par des virgules de coordonnées Maven. Par exemple,
--packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.2
Toutes les dépendances transitives sont traitées lorsque cette commande est utilisée.
Note

Avec l'option --packages, le pod du pilote de chaque exécution doit télécharger les dépendances de manière dynamique, ce qui nécessite la stabilité du réseau et l'accès à Maven Central ou à d'autres référentiels distants. Utilisez l'encapsuleur de dépendances du service de flux de données pour générer une archive de dépendances pour la production.
Note

Pour toutes les options spark-submit dans le flux de données, 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 complets (FQDN) dans l'URI. Chargez tous les fichiers, y compris main-application, dans le service de stockage d'objets pour Oracle Cloud Infrastructure Object Storage.

La rubrique Création d'une application de flux de données Spark-Submit explique comment créer une application dans la console à l'aide de spark-submit. Vous pouvez également utiliser spark-submit avec une trousse SDK Java ou à partir de l'interface de ligne de commande. Si vous utilisez l'interface CLI, vous n'avez pas à créer une application de flux de données pour exécuter votre application Spark avec des options compatibles avec spark-submit dans le service de flux de données. Cette fonction est utile si vous disposez déjà d'une commande spark-submit qui fonctionne dans un environnement différent. Lorsque vous suivez la syntaxe de la commande run submit, une application est créée, s'il n'en existe pas déjà une dans l'URI main-application.

Installation de l'interface CLI publique à l'aide de la commande run submit

Ces étapes doivent être exécutées pour installer une interface CLI publique à l'aide de la commande run submit pour l'utiliser avec le service de flux de données :

  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 Spark-submit dans le service de flux de données

Vous pouvez convertir votre commande CLI spark-submit en commande CLI compatible dans le service de flux de données.

La commande compatible avec spark-submit dans le service de flux de données est la commande run submit. Si vous utilisez déjà une application Spark dans une grappe, vous connaissez la syntaxe de 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 le service de données, la commande CLI est la suivante :
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 du service de flux de données compatible, procédez comme suit :
  1. Téléchargez tous les fichiers, y compris l'application principale, dans le stockage d'objets.
  2. Remplacez les URI existants par l'URI oci://... correspondant.
  3. Supprimez tout paramètre spark-submit non pris en charge ou réservé. Par exemple, --master et --deploy-mode sont réservés au service de flux de données et un utilisateur n'a pas besoin de les alimenter.

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

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

Exemples de code run submit

Quelques exemples de commande run submit dans le service de flux de données.

  • Exemples de commande run submit avec Oci-cli.
  • Exemple de run submit avec Oci-curl.

Exemples d'oci-cli

Exemples de run submit avec oci-cli dans le service de flux de données.

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 configurations optionnelles de --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 avec le 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

Exemples de run submit avec oci-curl dans le service de flux de données.

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": {}
}