API de REST do aplicativo Spark

O plano serverless IBM Analytics Engine fornece APIs de REST para enviar e gerenciar aplicativos Spark. As seguintes operações são suportadas:

  1. Obter as credenciais necessárias e configurar permissões.
  2. Enviar o aplicativo Spark.
  3. Recuperar o estado de um aplicativo Spark enviado.
  4. Recuperar os detalhes de um aplicativo Spark enviado.
  5. Parar um aplicativo Spark em execução.

Para obter uma descrição das APIs disponíveis, consulte as APIs de REST IBM Analytics Engine para o plano serverless.

As seções a seguir neste tópico mostram as amostras para cada uma das APIs de gerenciamento de aplicativos Spark.

Credenciais e permissões necessárias

Antes de poder enviar um aplicativo Spark, é necessário obter credenciais de autenticação e configurar as permissões corretas na instância serverless Analytics Engine.

  1. Você precisa do GUID da instância de serviço que anotou ao provisionar a instância. Se não anotou o GUID, consulte Recuperando o GUID de uma instância serverless.
  2. Você deve ter as permissões corretas para executar as operações necessárias. Consulte Permissões de usuário.
  3. As APIs de REST do aplicativo Spark usam autenticação e autorização baseadas em IAM.

Enviando um aplicativo Spark

O Analytics Engine Serverless fornece uma interface REST para enviar aplicativos Spark. A carga útil passada para a API de REST é mapeada para vários argumentos da linha de comandos suportados pelo comando spark-submit. Consulte Parâmetros para envio de aplicativos Spark para obter mais detalhes.

Ao enviar um aplicativo Spark, é necessário referenciar o arquivo do aplicativo. Para ajudá-lo a começar imediatamente e aprender a usar as APIs do Spark serverless AE, esta seção começa com um exemplo que usa arquivos de aplicativo Spark pré-empacotados que são referenciados na carga útil da API do aplicativo de envio. A seção subsequente mostra como executar aplicativos que são armazenados em um depósito Object Storage.

Referenciando arquivos pré-empacotados

O aplicativo de amostra fornecido mostra como fazer referência a um arquivo de aplicativos de contagem de palavras .py e um arquivo de dados em uma carga útil de tarefa.

Para saber como começar agora a usar arquivos de aplicativos de amostra pré-empacotados:

  1. Gere um token IAM se você ainda não o fez. Consulte Recuperando tokens de acesso IAM.
  2. Exporte o token em uma variável:
    export token=<token generated>
    
  3. Prepare o arquivo JSON de carga útil. Por exemplo, 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. Envie o aplicativo 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
    

Referenciando arquivos de um depósito Object Storage

Para referencia o seu arquivo de aplicação Spark a partir de um balde Object Storage, você precisa criar um balde, adicionar o arquivo no balde e, em seguida, referencia o arquivo do seu arquivo JSON de carga útil.

O endpoint para sua instância IBM Cloud Object Storage no arquivo JSON de carga útil deve ser o endpoint privado. Os endpoints diretos oferecem melhor desempenho do que os endpoints públicos e não incorrem em cobranças de largura de banda de entrada ou saída.

Para enviar um aplicativo Spark:

  1. Crie um depósito para o arquivo de aplicativos. Consulte Operações de depósito para obter detalhes sobre criação de depósitos.

  2. Inclua o arquivo de aplicativos no depósito recém-criado. Consulte Fazer upload de um objeto para incluir o arquivo de aplicativos no depósito.

  3. Gere um token IAM se você ainda não o fez. Consulte Recuperando tokens de acesso IAM.

  4. Exporte o token em uma variável:

    export token=<token generated>
    
  5. Prepare o arquivo JSON de carga útil. Por exemplo, 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:

    • É possível passar os valores de configuração do aplicativo Spark por meio da seção "conf" na carga útil. Consulte Parâmetros para envio de aplicativos Spark para obter mais detalhes.
    • <cos-reference-name> na seção ' "conf" do payload de amostra é qualquer nome dado à sua instância IBM Cloud Object Storage, à qual você está fazendo referência no URL no parâmetro ' "application". Veja Entendendo as credenciais Object Storage.
    • O envio do aplicativo Spark pode levar aproximadamente um minuto. Certifique-se de definir tempo limite suficiente no código do cliente.
    • Anote o "id" retornado na resposta. Você precisa desse valor para executar operações, como obter o estado do aplicativo, recuperar os detalhes do aplicativo ou excluir o aplicativo.
  6. Envie o aplicativo 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
    

    Resposta de amostra:

    {
      "id": "87e63712-a823-4aa1-9f6e-7291d4e5a113",
      "state": "accepted"
    }
    
  7. Se o logon avançado foi ativado para sua instância, você pode visualizar a saída do aplicativo nos logs da plataforma que são encaminhados para IBM Log Analysis. Para obter detalhes, consulte Configurando e visualizando logs.

Passando a configuração do Spark para um aplicativo

É possível usar a seção "conf" na carga útil para passar a configuração do aplicativo Spark. Se você especificou configurações de Spark em nível de instância, elas serão herdadas pelos aplicativos Spark executados na instância, mas poderão ser substituídas no momento em que um aplicativo Spark for enviado incluindo a seção "conf" na carga útil.

Consulte Configuração do Spark em Analytics Engine Serverless.

Parâmetros para envio de aplicativos Spark

A tabela a seguir lista o mapeamento entre os parâmetros de comando spark-submit e seu equivalente a ser passado para a seção "application_details" da carga útil da API de REST de envio do aplicativo Spark.

Mapeamento entre os parâmetros do comando spark-submit e seus equivalentes passados para a carga útil
Parâmetro de comando spark-submit Carga útil para a API de REST de envio do Spark do 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", ..... "}

Obtendo o estado de um aplicativo enviado

Para obter o estado de um aplicativo enviado, insira:

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"

Resposta de amostra:

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

Obtendo os detalhes de um aplicativo enviado

Para obter os detalhes de um aplicativo enviado, insira:

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

Resposta de amostra:

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

Parando um aplicativo enviado

Para interromper um aplicativo enviado, execute o seguinte:

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

Retornará 204 – No Content, se a exclusão for bem-sucedida. O estado do aplicativo é configurado como INTERROMPIDO.

Esta API é idempotente. Se você tentar parar um aplicativo já concluído ou parado, ele ainda retornará 204.

É possível usar esta API para interromper um aplicativo nos estados a seguir: accepted, waiting, submitted e running.

Passando a versão Spark do tempo de execução ao enviar um aplicativo

Você pode usar a seção "runtime" sob "application_details" no script JSON de carga útil para passar a versão do tempo de execução do Spark ao enviar um aplicativo. A versão Spark passada através da seção "runtime" substitui a versão padrão do Spark de tempo de execução no nível da instância. Para saber mais sobre a versão de tempo de execução padrão, consulte Tempo de execução padrão do Spark.

Exemplo da seção " "runtime" para executar um aplicativo no 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"
        }
    }
}

Usando variáveis de ambiente

Ao enviar um aplicativo, você pode usar a seção "env" sob "application_details" no script JSON de carga útil para transmitir informações específicas do ambiente, o que determina o resultado do aplicativo, por exemplo os conjuntos de dados para usar ou quaisquer valores secretos.

Exemplo da seção "env" na 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"
            }
        }
}

As variáveis de ambiente definidas usando "application_details" > "env" conforme descrito aqui, serão acessíveis tanto para o código executor quanto para o driver.

As variáveis de ambiente podem ser definidas usando a configuração "spark.executorEnv.[EnvironmentVariableName]" (application_details> env) também. Eles, no entanto, serão acessíveis apenas para as tarefas em execução no executor e não no motorista.

Os nomes das variáveis de ambiente no Shell consistem em letras maiúsculas, dígitos e o caractere ( '_' ) e não começam com um dígito.

Exemplo de aplicação pyspark que acessa as variáveis de ambiente que são passadas usando a chamada "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()

Executar um aplicativo Spark com versão de idioma não padrão

O tempo de execução do Spark suporta o aplicativo Spark gravado nos idiomas a seguir:

  • Escala
  • Python
  • R

Uma versão de tempo de execução do Spark é fornecida com a versão de idioma de tempo de execução padrão A IBM estende o suporte para novas versões de idioma e remove a versão de idioma existente para manter o tempo de execução livre de qualquer vulnerabilidade de segurança. O sistema também fornece tempo de acomodação para fazer a transição de suas cargas de trabalho quando houver novas versões de idioma. É possível testar sua carga de trabalho com uma versão de idioma passando uma variável de ambiente que aponte para a versão de idioma do aplicativo.

Código Python de amostra:

 {
	"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 amostra:

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

Saiba mais

Ao gerenciar seus aplicativos Spark, siga o recomendado Melhores práticas.