API REST d'application Spark

Le forfait IBM Analytics Engine sans serveur fournit des API REST pour soumettre et gérer des applications Spark. Les opérations suivantes sont possibles :

  1. Obtenir les données d'identification requises et définir des autorisations.
  2. Soumettre l'application Spark.
  3. Extraire l'état d'une application Spark soumise.
  4. Extraire les détails d'une application Spark soumise.
  5. Arrêt d'une application Spark en cours d'exécution.

Pour obtenir la description des API disponibles, voir les API REST IBM Analytics Engine du plan sans serveur.

Les sections suivantes de cette rubrique présentent des exemples de chacune des API de gestion d'application Spark.

Données d'identification et autorisations requises

Avant de soumettre une application Spark, vous devez obtenir des données d'identification d'authentification et définir les autorisations correctes sur l'instance Analytics Engine sans serveur.

  1. Vous avez besoin de l'identificateur global unique de l'instance de service que vous avez noté lorsque vous avez mis à disposition l'instance. Si vous n'avez pas noté l'identificateur global unique (GUID), voir Extraction de l'identificateur global unique d'une instance sans serveur.
  2. Vous devez disposer des autorisations appropriées pour effectuer les opérations requises. Voir Autorisations utilisateur.
  3. Les API REST d'application Spark utilisent l'authentification et l'autorisation basées sur IAM.

Soumission d'une application Spark

Analytics Engine sans serveur vous fournit une interface REST pour soumettre des applications Spark. Le contenu transmis à l'API REST mappe est associés à différents arguments de ligne de commande pris en charge par la commande spark-submit . Voir Paramètres de soumission d'applications Spark pour plus de détails.

Lorsque vous soumettez une application Spark, vous devez faire référence au fichier d'application. Pour vous aider à démarrer rapidement et apprendre à utiliser les API Spark sans serveur AE, cette section commence par un exemple qui utilise des fichiers d'application Spark prégroupés qui sont référencés dans le contenu de l'API d'application de soumission. La section suivante explique comment exécuter des applications stockées dans un compartiment Object Storage.

Référencement de fichiers pré-intégrés

L'exemple d'application fourni indique comment faire référence à un fichier d'application de comptage de mots .py et à un fichier de données dans un contenu de travail.

Pour savoir comment démarrer rapidement à l'aide des exemples de fichiers d'application préintégrés :

  1. Générez un jeton IAM si vous ne l'avez pas déjà fait. Voir Extraction des jetons d'accès IAM.
  2. Exportez le jeton dans une variable :
    export token=<token generated>
    
  3. Préparez le fichier JSON de contenu. Par exemple, submit-spark-quick-start-app.json :
    {
      "application_details": {
        "application": "/opt/ibm/spark/examples/src/main/python/wordcount.py",
        "arguments": ["/opt/ibm/spark/examples/src/main/resources/people.txt"]
        }
    }
    
  4. Soumettez l'application Spark :
    curl -X POST https://api.us-south.ae.cloud.ibm.com/v3/analytics_engines/<instance_id>/spark_applications --header "Authorization: Bearer $token" -H "content-type: application/json"  -d @submit-spark-quick-start-app.json
    

Référencement de fichiers à partir d'un compartiment Object Storage

Pour référencer votre fichier d'application Spark à partir d'un compartiment Object Storage, vous devez créer un compartiment, ajouter le fichier au compartiment, puis référencer le fichier à partir de votre fichier JSON de contenu.

Le point d'accès à votre instance IBM Cloud Object Storage dans le fichier JSON de la charge utile doit être le point d'accès privé. Les points d'extrémité directs offrent de meilleures performances que les points d'extrémité publics et n'entraînent pas de frais pour la largeur de bande sortante ou entrante.

Pour soumettre une application Spark :

  1. Créez un compartiment pour votre fichier d'application. Pour plus d'informations sur la création de segments, voir Opérations de compartiment.

  2. Ajoutez le fichier d'application au compartiment nouvellement créé. Voir Télécharger un objet pour ajouter votre fichier d'application au compartiment.

  3. Générez un jeton IAM si vous ne l'avez pas déjà fait. Voir Extraction des jetons d'accès IAM.

  4. Exportez le jeton dans une variable :

    export token=<token generated>
    
  5. Préparez le fichier JSON de contenu. Par exemple, submit-spark-app.json :

    {
      "application_details": {
         "application": "cos://<application-bucket-name>.<cos-reference-name>/my_spark_application.py",
         "arguments": ["arg1", "arg2"],
         "conf": {
            "spark.hadoop.fs.cos.<cos-reference-name>.endpoint": "https://s3.direct.us-south.cloud-object-storage.appdomain.cloud",
            "spark.hadoop.fs.cos.<cos-reference-name>.access.key": "<access_key>",
            "spark.hadoop.fs.cos.<cos-reference-name>.secret.key": "<secret_key>",
            "spark.app.name": "MySparkApp"
         }
      }
    }
    

    Remarque :

    • Vous pouvez transmettre les valeurs de configuration de l'application Spark via la section "conf" du contenu. Voir Paramètres de soumission d'applications Spark pour plus de détails.
    • <cos-reference-name> dans la section " "conf" de l'exemple de charge utile est le nom donné à votre instance IBM Cloud Object Storage, à laquelle vous faites référence dans l'URL dans le paramètre " "application". Voir Présentation des données d'identification Object Storage.
    • La soumission de l'application Spark peut prendre environ une minute. Veillez à définir un délai d'attente suffisant dans le code client.
    • Notez l'élément "id" renvoyé dans la réponse. Vous avez besoin de cette valeur pour effectuer des opérations telles que l'obtention de l'état de l'application, l'extraction des détails de l'application ou la suppression de l'application.
  6. Soumettez l'application Spark :

    curl -X POST https://api.us-south.ae.cloud.ibm.com/v3/analytics_engines/<instance_id>/spark_applications --header "Authorization: Bearer $token" -H "content-type: application/json"  -d @submit-spark-app.json
    

    Exemple de réponse :

    {
      "id": "87e63712-a823-4aa1-9f6e-7291d4e5a113",
      "state": "accepted"
    }
    
  7. Si la consignation en aval a été activée pour votre instance, vous pouvez afficher la sortie de l'application dans les journaux de plateforme qui sont transmis à IBM Log Analysis. Pour plus d'informations, voir Configuration et affichage des journaux.

Transmission de la configuration Spark à une application

Vous pouvez utiliser la section "conf" dans le contenu pour passer la configuration de l'application Spark. Si vous avez spécifié des configurations Spark au niveau de l'instance, celles-ci sont héritées par les applications Spark exécutées sur l'instance, mais peuvent être remplacées au moment où une application Spark est soumise par l'inclusion de la section "conf" dans le contenu.

Voir Configuration Spark dans Analytics Engine sans serveur.

Paramètres de soumission des applications Spark

Le tableau suivant répertorie le mappage entre les paramètres de commande spark-submit et leur équivalent à transmettre à la section "application_details" du contenu de l'API REST de soumission d'application Spark.

Correspondance entre les paramètres de la commande spark-submit et leurs équivalents transmis au payload
Paramètre de la commande spark-submit Contenu de l'API REST de soumission Spark Analytics Engine
<application binary passed as spark-submit command parameter> application_details -> application
<application-arguments> application_details -> arguments
class application_details -> class
jars application_details -> jars
name application_details -> name ou application_details -> conf -> spark.app.name
packages application_details -> packages
repositories application_details -> repositories
files application_details -> files
archives application_details -> archives
driver-cores application_details -> conf -> spark.driver.cores
driver-memory application_details -> conf -> spark.driver.memory
driver-java-options application_details -> conf -> spark.driver.defaultJavaOptions
driver-library-path application_details -> conf -> spark.driver.extraLibraryPath
driver-class-path application_details -> conf -> spark.driver.extraClassPath
executor-cores application_details -> conf -> spark.executor.cores
executor-memory application_details -> conf -> spark.executor.memory
num-executors application_details -> conf -> ae.spark.executor.count
pyFiles application_details -> conf -> spark.submit.pyFiles
<environment-variables> application_details -> env -> {"key1" : "value1", "key2" : "value2", ..... "}

Obtention de l'état d'une application soumise

Pour obtenir l'état d'une demande soumise, entrez :

curl -X GET https://api.us-south.ae.cloud.ibm.com/v3/analytics_engines/<instance_id>/spark_applications/<application_id>/state --header "Authorization: Bearer $token"

Exemple de réponse :

{
    "id": "a9a6f328-56d8-4923-8042-97652fff2af3",
    "state": "finished",
    "start_time": "2020-11-25T14:14:31.311+0000",
    "finish_time": "2020-11-25T14:30:43.625+0000"
}

Obtention des détails d'une application soumise

Pour obtenir les détails d'une application soumise, entrez :

curl -X GET https://api.us-south.ae.cloud.ibm.com/v3/analytics_engines/<instance_id>/spark_applications/<application_id> --header "Authorization: Bearer $token"

Exemple de réponse :

{
  "id": "ecd608d5-xxxx-xxxx-xxxx-08e27456xxxx",
  "spark_application_id": "null",
  "application_details": {
      "application": "cos://sbn-test-bucket-serverless-1.mycosservice/my_spark_application.py",
      "conf": {
          "spark.hadoop.fs.cos.mycosservice.endpoint": "https://s3.direct.us-south.cloud-object-storage.appdomain.cloud",
          "spark.hadoop.fs.cos.mycosservice.access.key": "xxxx",
          "spark.app.name": "MySparkApp",
          "spark.hadoop.fs.cos.mycosservice.secret.key": "xxxx"
      },
      "arguments": [
          "arg1",
          "arg2"
      ]
  },
  "state": "failed",
    "submission_time": "2021-11-30T18:29:21+0000"
}

Arrêt d'une application soumise

Pour arrêter une application soumise, exécutez la commande suivante :

curl -X DELETE https://api.us-south.ae.cloud.ibm.com/v3/analytics_engines/<instance_id>/spark_applications/<application_id> --header "Authorization: Bearer $token"

Renvoie 204 – No Content, si la suppression a abouti. L'état de l'application est ARRETÉ.

Cette API est idempotent. Si vous tentez d'arrêter une application déjà terminée ou arrêtée, elle retourne encore 204.

Vous pouvez utiliser cette API pour arrêter une application dans les états suivants : accepted, waiting, submitted et running.

Transmission de la version Spark d'exécution lors de la soumission d'une application

Vous pouvez utiliser la section "runtime" sous "application_details" dans le script JSON de contenu pour transmettre la version d'exécution Spark lors de la soumission d'une application. La version Spark transmise via la section "runtime" remplace la version Spark d'exécution par défaut définie au niveau de l'instance. Pour en savoir plus sur la version d'exécution par défaut, voir Default Spark runtime.

Exemple de la section '"runtime" pour exécuter une application dans Spark 3.4:

{
    "application_details": {
        "application": "/opt/ibm/spark/examples/src/main/python/wordcount.py",
        "arguments": [
            "/opt/ibm/spark/examples/src/main/resources/people.txt"
            ],
        "runtime": {
            "spark_version": "3.4"
        }
    }
}

Utilisation des variables d'environnement

Lors de la soumission d'une application, vous pouvez utiliser la section "env" sous "application_details" dans le script JSON de contenu pour transmettre des informations spécifiques à l'environnement, qui déterminent le résultat de l'application, par exemple les fichiers à utiliser ou toute valeur confidentielle.

Exemple de la section "env" dans le contenu:

{
    "application_details": {
        "application": "cos://<application-bucket-name>.<cos-reference-name>/my_spark_application.py",
        "arguments": ["arg1", "arg2"],
        "conf": {
            "spark.hadoop.fs.cos.<cos-reference-name>.endpoint": "https://s3.direct.us-south.cloud-object-storage.appdomain.cloud",
            "spark.hadoop.fs.cos.<cos-reference-name>.access.key": "<access_key>",
            "spark.hadoop.fs.cos.<cos-reference-name>.secret.key": "<secret_key>",
            "spark.app.name": "MySparkApp"
            },
        "env": {
            "key1": "value1",
            "key2": "value2",
            "key3": "value3"
            }
        }
}

Les variables d'environnement définies à l'aide de "application_details" > "env", comme décrit ici, seront accessibles au programme d'exécution et au code du pilote.

Les variables d'environnement peuvent également être définies à l'aide de la configuration "spark.executorEnv.[EnvironmentVariableName]" (application_details > env). Elles ne seront toutefois accessibles qu'aux tâches exécutées sur le programme d'exécution et non au pilote.

Les noms des variables d'environnement dans le Shell sont constitués de lettres majuscules, de chiffres et du symbole ("_") et ne commencent pas par un chiffre.

Exemple d'application pyspark qui accède aux variables d'environnement transmises à l'aide de l'appel "os.getenv".

from pyspark.sql.types import IntegerType
import os

def init_spark():
  spark = SparkSession.builder.appName("spark-env-test").getOrCreate()
  sc = spark.sparkContext
  return spark,sc

def returnExecutorEnv(x):
    # Attempt to access environment variable from a task running on executor
    return os.getenv("TESTENV1")

def main():
  spark,sc = init_spark()

  # dummy dataframe
  df=spark.createDataFrame([("1","one")])
  df.show()
  df.rdd.map(lambda x: (x[0],returnExecutorEnv(x[0]))).toDF().show()
  # Attempt to access environment variable on driver
  print (os.getenv("TESTENV1"))
  spark.stop()

if __name__ == '__main__':
  main()

Exécuter une application Spark avec une version de langue autre que celle par défaut

L'application Spark de prise en charge de l'environnement d'exécution Spark est écrite dans les langues suivantes:

  • Scala
  • Python
  • R

Une version d'exécution Spark est fournie avec la version de langage d'exécution par défaut. IBM étend la prise en charge des nouvelles versions de langue et supprime la version de langue existante pour que l'environnement d'exécution ne présente aucune vulnérabilité en matière de sécurité. Le système fournit également un délai de stabilisation pour la transition de vos charges de travail lorsqu'il existe de nouvelles versions de langue. Vous pouvez tester votre charge de travail avec une version de langue en transmettant une variable d'environnement qui pointe vers la version de langue de l'application.

Exemple de code Python:

 {
	"application_details": {
		"application": "/opt/ibm/spark/examples/src/main/python/wordcount.py",
		"arguments": [
			"/opt/ibm/spark/examples/src/main/resources/people.txt"
		],
		"env": {
			"RUNTIME_PYTHON_ENV": "python310"
		}
	}
}

Exemple de code R:

{
	"application_details": {
		"env": {
			"RUNTIME_R_ENV": "r42"
		},
		"application": "/opt/ibm/spark/examples/src/main/r/dataframe.R"
	}
}

En savoir plus

Lors de la gestion de vos applications Spark, suivez les meilleures pratiques recommandées.