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 :
- Obtenir les données d'identification requises et définir des autorisations.
- Soumettre l'application Spark.
- Extraire l'état d'une application Spark soumise.
- Extraire les détails d'une application Spark soumise.
- 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.
- 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.
- Vous devez disposer des autorisations appropriées pour effectuer les opérations requises. Voir Autorisations utilisateur.
- 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 :
- Générez un jeton IAM si vous ne l'avez pas déjà fait. Voir Extraction des jetons d'accès IAM.
- Exportez le jeton dans une variable :
export token=<token generated> - 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"] } } - 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 :
-
Créez un compartiment pour votre fichier d'application. Pour plus d'informations sur la création de segments, voir Opérations de compartiment.
-
Ajoutez le fichier d'application au compartiment nouvellement créé. Voir Télécharger un objet pour ajouter votre fichier d'application au compartiment.
-
Générez un jeton IAM si vous ne l'avez pas déjà fait. Voir Extraction des jetons d'accès IAM.
-
Exportez le jeton dans une variable :
export token=<token generated> -
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.
- Vous pouvez transmettre les valeurs de configuration de l'application Spark via la section
-
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.jsonExemple de réponse :
{ "id": "87e63712-a823-4aa1-9f6e-7291d4e5a113", "state": "accepted" } -
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.
| 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
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.