API REST de aplicación de Spark
El plan sin servidor de IBM Analytics Engine proporciona API REST para enviar y gestionar aplicaciones de Spark. Están soportadas las siguientes operaciones:
- Obtener las credenciales necesarias y establecer permisos.
- Enviar la aplicación de Spark.
- Recuperar el estado de una aplicación de Spark enviada.
- Recuperar los detalles de una aplicación de Spark enviada.
- Detener una aplicación de Spark en ejecución.
Para obtener una descripción de las API disponibles, consulte el apartado API REST de IBM Analytics Engine para el plan sin servidor.
Las secciones siguientes de este tema muestran ejemplos para cada una de las API de gestión de aplicaciones de Spark.
Credenciales y permisos necesarios
Antes de poder enviar una aplicación de Spark, debe obtener credenciales de autenticación y establecer los permisos correctos en la instancia sin servidor de Analytics Engine.
- Necesita el GUID de la instancia de servicio que ha anotado al suministrar la instancia. Si no ha tomado nota del GUID, consulte Recuperación del GUID de una instancia sin servidor.
- Debe tener los permisos correctos para realizar las operaciones necesarias. Consulte Permisos de usuario.
- Las API REST de la aplicación de Spark utilizan autenticación y autorización basadas en IAM.
Envío de una aplicación de Spark
Analytics Engine sin servidor le proporciona una interfaz REST para enviar aplicaciones de Spark. La carga útil pasada a la API REST se correlaciona con varios argumentos de línea de mandatos soportados por el mandato spark-submit
.
Consulte Parámetros para enviar aplicaciones de Spark para obtener más detalles.
Al enviar una aplicación de Spark, debe hacer referencia al archivo de aplicación. Para ayudarle a empezar a trabajar rápidamente y a aprender a utilizar las API de Spark sin servidor de AE, esta sección empieza con un ejemplo que utiliza los archivos de aplicación de Spark preempaquetados a los que se hace referencia en la carga útil de la API de solicitud de envío. La sección siguiente muestra cómo ejecutar aplicaciones que se almacenan en un grupo de Object Storage.
Cómo hacer referencia a archivos preempaquetados
La aplicación de ejemplo proporcionada muestra cómo hacer referencia a un archivo de aplicación de recuento de palabras .py
y a un archivo de datos en una carga útil de trabajo.
Para aprender a empezar a utilizar rápidamente los archivos de aplicación de ejemplo preempaquetados:
- Genere una señal de IAM si todavía no lo ha hecho. Consulte Recuperación de señales de acceso de IAM.
- Exporte la señal a una variable:
export token=<token generated>
- Prepare el archivo JSON de carga útil. Por ejemplo, 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"] } }
- Envíe la aplicación de 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
Cómo hacer referencia a archivos desde un grupo de Object Storage
Para hacer referencia al archivo de aplicación Spark desde un grupo Object Storage, debe crear un grupo, añadir el archivo al grupo y, a continuación, hacer referencia al archivo desde el archivo JSON de carga útil.
El punto final de la instancia de IBM Cloud Object Storage en el archivo JSON de carga útil debe ser el punto final privado. Los puntos finales directos proporcionan un mejor rendimiento que los puntos finales públicos y no incurren en cargos por ningún ancho de banda entrante o saliente.
Para enviar una aplicación de Spark:
-
Cree un grupo para el archivo de aplicación. Consulte Operaciones de grupo para obtener detalles sobre la creación de grupos.
-
Añada el archivo de aplicación al grupo recién creado. Consulte Cargar un objeto para añadir el archivo de aplicación al grupo.
-
Genere una señal de IAM si todavía no lo ha hecho. Consulte Recuperación de señales de acceso de IAM.
-
Exporte la señal a una variable:
export token=<token generated>
-
Prepare el archivo JSON de carga útil. Por ejemplo,
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" } } }
Nota:
- Puede pasar valores de configuración de aplicación de Spark a través de la sección
"conf"
en la carga útil. Consulte Parámetros para enviar aplicaciones de Spark para obtener más detalles. <cos-reference-name>
en la sección"conf"
de la carga útil de ejemplo es cualquier nombre asignado a la instancia de IBM Cloud Object Storage, a la que está haciendo referencia en el URL en el parámetro"application"
. Consulte Descripción de las credenciales de Object Storage.- Puede tardar aproximadamente un minuto en enviar la aplicación de Spark. Establezca suficiente tiempo de espera en el código de cliente.
- Anote el
"id"
devuelto en la respuesta. Necesita este valor para realizar operaciones como obtener el estado de la aplicación, recuperar los detalles de la aplicación o suprimir la aplicación.
- Puede pasar valores de configuración de aplicación de Spark a través de la sección
-
Envíe la aplicación de 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
Respuesta de ejemplo:
{ "id": "87e63712-a823-4aa1-9f6e-7291d4e5a113", "state": "accepted" }
-
Si se ha habilitado el registro de reenvío para la instancia, puede ver la salida de la aplicación en los registros de la plataforma que se reenvían a IBM Log Analysis. Para obtener detalles, consulte Configuración y visualización de registros.
Cómo pasar la configuración de Spark a una aplicación
Puede utilizar la sección "conf"
en la carga útil para pasar la configuración de la aplicación de Spark. Si ha especificado configuraciones de Spark a nivel de instancia, las heredan las aplicaciones de Spark que se ejecutan
en la instancia, pero se pueden alterar temporalmente al enviar una aplicación de Spark incluyendo la sección "conf"
en la carga útil.
Consulte Configuración de Spark en Analytics Engine sin servidor.
Parámetros para enviar aplicaciones de Spark
La tabla siguiente incluye una lista de la correlación entre los parámetros del mandato spark-submit
y su equivalente que se pasa a la sección "application_details"
de la carga útil de la API REST de envío
de la aplicación de Spark.
Parámetro de mandato spark-submit | Carga útil de la API REST de envío de Analytics Engine Spark |
---|---|
<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 o 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", ..... " } |
Obtención del estado de una aplicación enviada
Para obtener el estado de una aplicación enviada, indique:
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"
Respuesta de ejemplo:
{
"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"
}
Obtención de los detalles de una aplicación enviada
Para obtener los detalles de una aplicación enviada, indique:
curl -X GET https://api.us-south.ae.cloud.ibm.com/v3/analytics_engines/<instance_id>/spark_applications/<application_id> --header "Authorization: Bearer $token"
Respuesta de ejemplo:
{
"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"
}
Detención de una aplicación enviada
Para detener una aplicación enviada, ejecute lo siguiente:
curl -X DELETE https://api.us-south.ae.cloud.ibm.com/v3/analytics_engines/<instance_id>/spark_applications/<application_id> --header "Authorization: Bearer $token"
Devuelve 204 – No Content
, si la supresión es correcta. El estado de la aplicación se establece en STOPPED.
Esta API es idempotente. Si intenta detener una aplicación ya completada o detenida, seguirá devolviendo 204.
Puede utilizar esta API para detener una aplicación en los estados siguientes: accepted
, waiting
, submitted
y running
.
Pasar la versión de Spark de tiempo de ejecución al enviar una aplicación
Puede utilizar la sección "runtime"
bajo "application_details"
en el script JSON de carga útil para pasar la versión de tiempo de ejecución de Spark al enviar una aplicación. La versión de Spark
pasada a través de la sección "runtime"
altera temporalmente la versión de Spark de tiempo de ejecución predeterminada establecida en el nivel de instancia. Para obtener más información sobre la versión de tiempo de
ejecución predeterminada, consulte Tiempo de ejecución de Spark predeterminado.
Ejemplo de la sección "runtime"
para ejecutar una aplicación en Spark 3.3:
{
"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.3"
}
}
}
Utilización de variables de entorno
Al enviar una aplicación, puede utilizar la sección "env"
bajo "application_details"
en el script JSON de carga útil para pasar información específica del entorno, que determina el resultado de la
aplicación, por ejemplo, los conjuntos de datos a utilizar o cualquier valor secreto.
Ejemplo de la sección "env"
en la carga útil:
{
"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"
}
}
}
Las variables de entorno establecidas utilizando "application_details"
> "env"
tal como se describe aquí, serán accesibles tanto para el ejecutor como para el código de controlador.
Las variables de entorno también se pueden establecer utilizando la configuración de "spark.executorEnv.[EnvironmentVariableName]"
(application_details > env). Sin embargo, sólo serán accesibles para las tareas que
se ejecutan en el ejecutor y no para el controlador.
Ejemplo de aplicación pyspark que accede a las variables de entorno que se pasan utilizando la llamada "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()
Ejecutar una aplicación Spark con una versión de idioma no predeterminada
La aplicación Spark de soporte de tiempo de ejecución Spark escrita en los idiomas siguientes:
- Escala
- Python
- R
Una versión de tiempo de ejecución de Spark se suministra con la versión de idioma de tiempo de ejecución predeterminada. IBM amplía el soporte para nuevas versiones de idioma y elimina la versión de idioma existente para mantener el tiempo de ejecución libre de vulnerabilidades de seguridad. El sistema también proporciona tiempo de estabilización para realizar la transición de las cargas de trabajo cuando haya alguna nueva versión de idioma. Puede probar la carga de trabajo con una versión de idioma pasando una variable de entorno que apunte a la versión de idioma de la aplicación.
Código Python de ejemplo:
{
"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"
}
}
}
Código R de ejemplo:
{
"application_details": {
"env": {
"RUNTIME_R_ENV": "r42"
},
"application": "/opt/ibm/spark/examples/src/main/r/dataframe.R"
}
}
Más información
Al gestionar las aplicaciones Spark, siga las Prácticas recomendadas recomendadas.