API REST applicazione Spark

Il piano senza server IBM Analytics Engine fornisce API REST per inoltrare e gestire le applicazioni Spark. Sono supportate le seguenti operazioni:

  1. Ottieni le credenziali richieste e imposta le autorizzazioni.
  2. Invia l'applicazione Spark.
  3. Richiamare lo stato di una applicazione Spark inoltrata.
  4. Richiamare i dettagli di un'applicazione Spark inoltrata.
  5. Arrestare un'applicazione Spark in esecuzione.

Per una descrizione delle API disponibili, vedi le API RESTIBM Analytics Engine per il piano senza server.

Le sezioni riportate di seguito in questo argomento mostrano esempi per ogni API di gestione dell'applicazione Spark.

Credenziali e autorizzazioni richieste

Prima di poter inoltrare un'applicazione Spark, è necessario ottenere le credenziali di autenticazione e impostare le autorizzazioni corrette sull'istanza senza server Analytics Engine.

  1. Hai bisogno del GUID dell'istanza del servizio che hai annotato quando hai eseguito il provisioning dell'istanza. Se non hai preso nota del GUID, vedi Richiamo del GUID di un'istanza senza server.
  2. È necessario disporre delle autorizzazioni corrette per eseguire le operazioni richieste. Vedere Autorizzazioni utente.
  3. Le API REST dell'applicazione Spark utilizzano l'autenticazione e l'autorizzazione basate su IAM.

Inoltro di un'applicazione Spark

Analytics Engine Serverless ti fornisce un'interfaccia REST per inoltrare le applicazioni Spark. Il payload passato all'API REST viene associato a diversi argomenti della riga di comando supportati dal comando spark-submit. Per ulteriori dettagli, vedi Parametri per l'inoltro delle applicazioni Spark.

Quando si inoltra un'applicazione Spark, è necessario fare riferimento a tale file. Per aiutarti a iniziare rapidamente e imparare come utilizzare le API AE serverless Spark, questa sezione inizia con un esempio che utilizza i file dell'applicazione Spark pre - impacchettati a cui si fa riferimento nel payload dell'API dell'applicazione di inoltro. La sezione successiva mostra come eseguire le applicazioni archiviate in un bucket Object Storage.

Riferimento a file pre - bundle

L'applicazione di esempio fornita mostra come fare riferimento a un'applicazione di conteggio parole .py e a un file di dati in un payload del lavoro.

Per informazioni su come iniziare rapidamente a utilizzare i file dell'applicazione di esempio pre - bundle:

  1. Genera un token IAM se non lo hai già fatto. Vedi Richiamo dei token di accesso IAM.
  2. Esporta il token in una variabile:
    export token=<token generated>
    
  3. Preparare il file JSON del payload. Ad esempio, 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. Inoltra l'applicazione 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
    

Riferimento ai file da un bucket Object Storage

Per fare riferimento al tuo file dell'applicazione Spark da un bucket Object Storage, devi creare un bucket, aggiungere il file al bucket e quindi fare riferimento al file dal tuo file JSON del payload.

L'endpoint per la tua istanza IBM Cloud Object Storage nel file JSON del payload deve essere l'endpoint privato. Gli endpoint diretti offrono prestazioni migliori rispetto agli endpoint pubblici e non comportano costi per la larghezza di banda in uscita o in entrata.

Per inoltrare un'applicazione Spark:

  1. Creare un bucket per il file dell'applicazione. Vedi Operazioni bucket per i dettagli sulla creazione dei bucket.

  2. Aggiungere il file dell'applicazione al bucket appena creato. Vedi Carica un oggetto per aggiungere il file dell'applicazione al bucket.

  3. Genera un token IAM se non lo hai già fatto. Vedi Richiamo dei token di accesso IAM.

  4. Esporta il token in una variabile:

    export token=<token generated>
    
  5. Preparare il file JSON del payload. Ad esempio, 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:

    • Puoi passare i valori di configurazione dell'applicazione Spark attraverso la sezione "conf" nel payload. Per ulteriori dettagli, vedi Parametri per l'inoltro delle applicazioni Spark.
    • <cos-reference-name> nella sezione "conf" del payload di esempio è qualsiasi nome assegnato alla tua istanza IBM Cloud Object Storage, a cui stai facendo riferimento nell'URL nel parametro "application". Vedi Descrizione delle credenziali Object Storage.
    • L'inoltro dell'applicazione Spark potrebbe richiedere circa un minuto. Assicurarsi di impostare un timeout sufficiente nel codice client.
    • Prendi nota del "id" restituito nella risposta. È necessario questo valore per eseguire operazioni quali il richiamo dello stato dell'applicazione, il richiamo dei dettagli dell'applicazione o l'eliminazione dell'applicazione.
  6. Inoltra l'applicazione 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
    

    Risposta di esempio:

    {
      "id": "87e63712-a823-4aa1-9f6e-7291d4e5a113",
      "state": "accepted"
    }
    
  7. Se la registrazione di inoltro è stata abilitata per la tua istanza, puoi visualizzare l'output dell'applicazione nei log di piattaforma inoltrati a IBM Log Analysis. Per i dettagli, consultare Configurazione e visualizzazione dei log.

Passaggio della configurazione Spark a un'applicazione

Puoi utilizzare la sezione "conf" nel payload per passare la configurazione dell'applicazione Spark. Se hai specificato le configurazioni Spark a livello dell'istanza, queste vengono ereditate dalle applicazioni Spark eseguite sull'istanza, ma possono essere sovrascritte nel momento in cui un'applicazione Spark viene inoltrata includendo la sezione "conf" nel payload.

Vedi Configurazione Spark in Analytics Engine senza server.

Parametri per l'inoltro delle applicazioni Spark

La seguente tabella elenca l'associazione tra i parametri del comando spark-submit e il loro equivalente da passare alla sezione "application_details" del payload dell'API REST di inoltro dell'applicazione Spark.

Mappatura tra i parametri del comando spark-submit e i loro equivalenti passati al payload
Parametro spark - submit command Payload all'API REST di inoltro 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 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", ..... "}

Acquisizione dello stato di una domanda inoltrata

Per ottenere lo stato di una domanda inoltrata, immettere:

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"

Risposta di esempio:

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

Acquisizione dei dettagli di una domanda inoltrata

Per ottenere i dettagli di una domanda inoltrata, immettere:

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

Risposta di esempio:

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

Arresto di una domanda inoltrata

Per arrestare un'applicazione inoltrata, eseguire quanto segue:

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

Restituisce 204 – No Content, se l'eliminazione ha esito positivo. Lo stato dell'applicazione è impostato su STOPPED.

Questa API è idempotente. Se si tenta di arrestare un'applicazione già completata o arrestata, verrà comunque restituito 204.

Puoi usare questa API per arrestare un'applicazione nei seguenti stati: accepted, waiting, submitted e running.

Passaggio della versione Spark di runtime quando si inoltra un'applicazione

Puoi utilizzare la sezione "runtime" sotto "application_details" nello script JSON del payload per passare la versione di runtime Spark quando inoltri un'applicazione. La versione Spark passata attraverso la sezione "runtime" sovrascrive la versione Spark di runtime predefinita impostata a livello dell'istanza. Per ulteriori informazioni sulla versione di runtime predefinita, vedi Runtime Spark predefinito.

Esempio di sezione '"runtime" per eseguire un'applicazione in 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"
        }
    }
}

Utilizzo delle variabili di ambiente

Quando invii un'applicazione, puoi utilizzare la sezione "env" in "application_details" nello script JSON del payload per passare le informazioni specifiche dell'ambiente, che determinano il risultato dell'applicazione, ad esempio i dataset da utilizzare o i valori segreti.

Esempio della sezione "env" nel payload:

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

Le variabili di ambiente impostate utilizzando "application_details" > "env", come descritto di seguito, saranno accessibili sia all'executor che al codice del driver.

Le variabili di ambiente possono essere impostate anche utilizzando "spark.executorEnv.[EnvironmentVariableName]" configuration (application_details> env). Tuttavia, saranno accessibili solo alle attività in esecuzione sull'executor e non al programma di controllo.

I nomi delle variabili d'ambiente nella Shell sono costituiti da lettere maiuscole, cifre e dalla dicitura ("_") e non iniziano con una cifra.

Esempio di applicazione pyspark che accede alle variabili di ambiente passate utilizzando la chiamata "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()

Esegui un'applicazione Spark con versione lingua non predefinita

L'applicazione Spark di supporto runtime Spark è stata scritta nelle seguenti lingue:

  • Scala
  • Python
  • R

Una versione di runtime Spark viene fornita con la versione della lingua di runtime predefinita. IBM estende il supporto per le nuove versioni della lingua e rimuove la versione della lingua esistente per mantenere il runtime libero da eventuali vulnerabilità di sicurezza. Il sistema fornisce anche il tempo di transizione per i carichi di lavoro quando è disponibile una nuova versione linguistica. Puoi testare il tuo carico di lavoro con una versione della lingua passando una variabile di ambiente che punta alla versione della lingua dell'applicazione.

Codice Python di esempio:

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

Codice R di esempio:

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

Ulteriori informazioni

Quando gestisci le tue applicazioni Spark, segui le procedure ottimali consigliate.