IBM Cloud Docs
API REST de aplicación de Spark

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:

  1. Obtener las credenciales necesarias y establecer permisos.
  2. Enviar la aplicación de Spark.
  3. Recuperar el estado de una aplicación de Spark enviada.
  4. Recuperar los detalles de una aplicación de Spark enviada.
  5. 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.

  1. 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.
  2. Debe tener los permisos correctos para realizar las operaciones necesarias. Consulte Permisos de usuario.
  3. 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:

  1. Genere una señal de IAM si todavía no lo ha hecho. Consulte Recuperación de señales de acceso de IAM.
  2. Exporte la señal a una variable:
    export token=<token generated>
    
  3. 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"]
        }
    }
    
  4. 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:

  1. Cree un grupo para el archivo de aplicación. Consulte Operaciones de grupo para obtener detalles sobre la creación de grupos.

  2. 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.

  3. Genere una señal de IAM si todavía no lo ha hecho. Consulte Recuperación de señales de acceso de IAM.

  4. Exporte la señal a una variable:

    export token=<token generated>
    
  5. 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.
  6. 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"
    }
    
  7. 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.

Tabla 1. Correlación entre los parámetros del mandato spark-submit y sus equivalentes pasados a la carga útil
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.