Acelere o Google Cloud Serverless para Apache Spark com o Lightning Engine

Este documento mostra como ativar o Lightning Engine para acelerar as cargas de trabalho em lote e as sessões interativas do Serverless for Apache Spark.

Vista geral

O Lightning Engine é um acelerador de consultas de elevado desempenho com tecnologia de um motor de otimização de várias camadas que executa técnicas de otimização habituais, como otimizações de consultas e de execução, bem como otimizações organizadas na camada do sistema de ficheiros e nos conetores de acesso aos dados.

Conforme mostrado na ilustração seguinte, o Lightning Engine acelera o desempenho da execução de consultas do Spark numa carga de trabalho semelhante ao TPC-H (tamanho do conjunto de dados 10 TB).

Para mais informações, consulte o artigo Apresentamos o Lightning Engine: a próxima geração do desempenho do Apache Spark.

Disponibilidade do Lightning Engine

  • O Lightning Engine está disponível para utilização com tempos de execução sem servidor para Apache Spark suportados que estão em disponibilidade geral (atualmente, tempos de execução 1.2, 2.2 e 2.3; não disponível no tempo de execução do Spark 3.0).
  • O Lightning Engine só está disponível com o nível de preços premium do Serverless para Apache Spark.
    • Cargas de trabalho em lote: o Lightning Engine é ativado automaticamente para cargas de trabalho em lote no nível premium. Não é necessária qualquer ação da sua parte.
    • Sessões interativas: o Lightning Engine não está ativado por predefinição para sessões interativas. Para a ativar, consulte o artigo Ative o Lightning Engine.
    • Modelos de sessões: o motor Lightning não está ativado por predefinição para modelos de sessões. Para a ativar, consulte o artigo Ative o Lightning Engine.

Ative o Lightning Engine

As secções seguintes mostram como ativar o motor Lightning numa carga de trabalho em lote Serverless para Apache Spark, num modelo de sessão e numa sessão interativa.

Carga de trabalho em lote

Ative o Lightning Engine numa carga de trabalho em lote

Pode usar a Google Cloud consola, a CLI do Google Cloud ou a API Dataproc para ativar o Lightning Engine numa carga de trabalho em lote.

Consola

Use a Google Cloud consola para ativar o Lightning Engine numa carga de trabalho em lote.

  1. Na Google Cloud consola:

    1. Aceda a Lotes do Dataproc.
    2. Clique em Criar para abrir a página Criar lote.
  2. Selecione e preencha os seguintes campos:

    • Contentor:
    • Configuração do nível:

      • Selecione Premium. Esta opção ativa e seleciona automaticamente a opção "Ativar o LIGHTNING ENGINE para acelerar o desempenho do Spark".

      Quando seleciona o nível premium, o Nível de computação do controlador e o Nível de computação do executor são definidos como Premium. Não é possível substituir estas definições de computação de nível premium definidas automaticamente para lotes que usam tempos de execução anteriores a 3.0.

      Pode configurar o Driver Disk Tier e o Executor Disk Tier para Premium ou deixá-los no valor do nível Standard predefinido. Se escolher um nível de disco premium, tem de selecionar o tamanho do disco. Para mais informações, consulte as propriedades de atribuição de recursos.

    • Propriedades: opcional: introduza o seguinte par Key (nome da propriedade) e Value se quiser selecionar o tempo de execução Native Query Execution:

      Chave Valor
      spark.dataproc.lightningEngine.runtime nativo/nativa

  3. Preencha, selecione ou confirme outras definições de cargas de trabalho em lote. Consulte Envie uma carga de trabalho em lote do Spark.

  4. Clique em Enviar para executar a carga de trabalho em lote do Spark.

gcloud

Defina as seguintes flags de comando da CLI gcloud gcloud dataproc batches submit spark para ativar um Lightning Engine numa carga de trabalho em lote.

gcloud dataproc batches submit spark \
    --project=PROJECT_ID \
    --region=REGION \
    --properties=dataproc.tier=premium \
    OTHER_FLAGS_AS_NEEDED

Notas:

  • PROJECT_ID: o ID do seu Google Cloud projeto. Os IDs dos projetos estão listados na secção Informações do projeto no Google Cloud painel de controlo da consola.
  • REGION: Uma região do Compute Engine disponível para executar a carga de trabalho.
  • --properties=dataproc.tier=premium. A definição do nível premium define automaticamente as seguintes propriedades na carga de trabalho em lote:

    • spark.dataproc.engine=lightningEngine seleciona o Lightning Engine para a carga de trabalho em lote.
    • spark.dataproc.driver.compute.tier e spark.dataproc.executor.compute.tier estão definidos como premium (consulte as propriedades de atribuição de recursos). Não é possível substituir estas definições de computação de nível premium definidas automaticamente para lotes que usam tempos de execução anteriores a 3.0.
  • Outras propriedades

    • Native Query Engine: spark.dataproc.lightningEngine.runtime=native adicione esta propriedade se quiser selecionar o tempo de execução da execução de consultas nativas.

    • Níveis e tamanhos de disco: por predefinição, os tamanhos dos discos do controlador e do executor são definidos para standard níveis e tamanhos. Pode adicionar propriedades para selecionar premiumníveis e tamanhos de discos (em múltiplos de 375 GiB).
      Para mais informações, consulte as propriedades de atribuição de recursos.

  • OTHER_FLAGS_AS_NEEDED: consulte o artigo Envie uma carga de trabalho em lote do Spark.

API

Para ativar o Lightning Engine numa carga de trabalho em lote, adicione "dataproc.tier":"premium" a RuntimeConfig.properties como parte do seu pedido batches.create. A definição do nível premium define automaticamente as seguintes propriedades na carga de trabalho em lote:

  • spark.dataproc.engine=lightningEngine seleciona o Lightning Engine para a carga de trabalho em lote.
  • spark.dataproc.driver.compute.tier e spark.dataproc.executor.compute.tier estão definidos como premium (consulte as propriedades de atribuição de recursos). Não é possível substituir estas definições de computação de nível premium definidas automaticamente para lotes que usam tempos de execução anteriores ao 3.0.

Outro RuntimeConfig.properties:

  • Motor de consultas nativo: spark.dataproc.lightningEngine.runtime:native. Adicione esta propriedade se quiser selecionar o tempo de execução de Execução de consultas nativas.

  • Níveis e tamanhos de disco: por predefinição, os tamanhos dos discos do controlador e do executor são definidos para standard níveis e tamanhos. Pode adicionar propriedades para selecionar premiumníveis e tamanhos (em múltiplos de 375 GiB)
    . Para mais informações, consulte as propriedades de atribuição de recursos.

Consulte o artigo Envie uma carga de trabalho em lote do Spark para definir outros campos da API de carga de trabalho em lote.

Modelo de sessão

Ative o motor Lightning num modelo de sessão

Pode usar a Google Cloud consola, a CLI do Google Cloud ou a API Dataproc para ativar o Lightning Engine num modelo de sessão para uma sessão do Jupyter ou do Spark Connect.

Consola

Use a Google Cloud consola para ativar o Lightning Engine numa carga de trabalho em lote.

  1. Na Google Cloud consola:

    1. Aceda aos modelos de sessão do Dataproc.
    2. Clique em Criar para abrir a página Criar modelo de sessão.
  2. Selecione e preencha os seguintes campos:

    • Informações do modelo de sessão:
      • Selecione "Ativar o motor Lightning para acelerar o desempenho do Spark".
    • Configuração de execução:
    • Propriedades: introduza os seguintes pares Key (nome da propriedade) e Value para selecionar o nível Premium:

      Chave Valor
      dataproc.tier premium
      spark.dataproc.engine lightningEngine

      Opcional: introduza o par Key (nome da propriedade)Value seguinte para selecionar o tempo de execução da execução de consultas nativas:

      Chave Valor
      spark.dataproc.lightningEngine.runtime native

  3. Preencha, selecione ou confirme outras definições do modelo de sessão. Consulte o artigo Crie um modelo de sessão.

  4. Clique em Enviar para criar o modelo de sessão.

gcloud

Não pode criar diretamente um modelo de sessão do Serverless para Apache Spark através da CLI gcloud. Em alternativa, pode usar o comando gcloud beta dataproc session-templates import para importar um modelo de sessão existente, editar o modelo importado para ativar o Lightning Engine e, opcionalmente, o tempo de execução de consultas nativas e, em seguida, exportar o modelo editado através do comando gcloud beta dataproc session-templates export.

API

Para ativar o Lightning Engine num modelo de sessão, adicione "dataproc.tier":"premium" e "spark.dataproc.engine":"lightningEngine" a RuntimeConfig.properties como parte do seu pedido sessionTemplates.create.

Outro RuntimeConfig.properties:

  • Native Query Engine: spark.dataproc.lightningEngine.runtime:native: adicione esta propriedade a RuntimeConfig.properties para selecionar o tempo de execução Native Query Execution.

Consulte o artigo Crie um modelo de sessão para definir outros campos da API do modelo de sessão.

Sessão interativa

Ative o Lightning Engine numa sessão interativa

Pode usar a Google Cloud CLI ou a API Dataproc para ativar o Lightning Engine numa sessão interativa do Serverless para Apache Spark. Também pode ativar o Lightning Engine numa sessão interativa num bloco de notas do BigQuery Studio.

gcloud

Defina as seguintes flags de comando da CLI gcloud gcloud beta dataproc sessions create spark para ativar o Lightning Engine numa sessão interativa.

gcloud beta dataproc sessions create spark \
    --project=PROJECT_ID \
    --location=REGION \
    --properties=dataproc.tier=premium,spark.dataproc.engine=lightningEngine \
    OTHER_FLAGS_AS_NEEDED

Notas:

  • PROJECT_ID: o ID do seu Google Cloud projeto. Os IDs dos projetos estão listados na secção Informações do projeto no Google Cloud painel de controlo da consola.
  • REGION: Uma região do Compute Engine disponível para executar a carga de trabalho.
  • --properties=dataproc.tier=premium,spark.dataproc.engine=lightningEngine. Estas propriedades ativam o Lightning Engine na sessão.

  • Outras propriedades:

    • Native Query Engine: spark.dataproc.lightningEngine.runtime=native: adicione esta propriedade para selecionar o tempo de execução da execução de consultas nativas.
  • OTHER_FLAGS_AS_NEEDED: consulte o artigo Crie uma sessão interativa.

API

Para ativar o Lightning Engine numa sessão, adicione "dataproc.tier":"premium" e "spark.dataproc.engine":"lightningEngine" a RuntimeConfig.properties como parte do seu pedido sessions.create.

Outro RuntimeConfig.properties:

* Native Query Engine: spark.dataproc.lightningEngine.runtime:native: Adicione esta propriedade a RuntimeConfig.properties se quiser selecionar o tempo de execução Native Query Execution.

Consulte o artigo Crie uma sessão interativa para definir outros campos da API de modelos de sessões.

Bloco de notas do BigQuery

Pode ativar o Lightning Engine quando cria uma sessão num notebook PySpark do BigQuery Studio.

from google.cloud.dataproc_spark_connect import DataprocSparkSession
from google.cloud.dataproc_v1 import Session
session = Session()

# Enable Lightning Engine.
session.runtime_config.properties["dataproc.tier"] = "premium"
session.runtime_config.properties["spark.dataproc.engine"] = "lightningEngine"

# Enable THE Native Query Execution runtime.
session.runtime_config.properties["spark.dataproc.lightningEngine.runtime"] = "native"

# Create the Spark session.
spark = (
   DataprocSparkSession.builder
     .appName("APP_NAME")
     .dataprocSessionConfig(session)
     .getOrCreate())

# Add Spark application code here:

Verifique as definições do Lightning Engine

Pode usar a Google Cloud consola, a CLI do Google Cloud ou a API Dataproc para validar as definições do Lightning Engine numa carga de trabalho em lote, num modelo de sessão ou numa sessão interativa.

Carga de trabalho em lote

  • Para verificar se o nível do lote está definido como premium e o motor está definido como Lightning Engine:

    • Google Cloud console: na página Lotes, veja as colunas Nível e Motor do lote. Pode clicar no ID do lote para ver também estas definições na página de detalhes do lote.
    • CLI gcloud: execute o comando gcloud dataproc batches describe.
    • API: emita um pedido batches.get.

Modelo de sessão

  • Para verificar se o motor está definido como Lightning Engine para um modelo de sessão:

    • Google Cloud Consola: na página Modelos de sessões, consulte a coluna Motor do seu modelo. Pode clicar no Nome do modelo de sessão para ver também esta definição na página de detalhes do modelo de sessão.
    • CLI gcloud: execute o comando gcloud beta dataproc session-templates describe.
    • API: emita um pedido sessionTemplates.get.

Sessão interativa

  • Quando o motor está definido como Lightning Engine para uma sessão interativa:

    • Google Cloud Consola: na página Sessões interativas, veja a coluna Motor para o modelo. Pode clicar no ID da sessão interativa para ver também esta definição na página de detalhes do modelo de sessão.
    • CLI gcloud: execute o comando gcloud beta dataproc sessions describe.
    • API: emita um pedido sessions.get.

Execução de consultas nativas

A execução de consultas nativas (NQE) é uma funcionalidade opcional do Lightning Engine que melhora o desempenho através de uma implementação nativa baseada no Apache Gluten e no Velox, que foi concebida para o hardware da Google.

O tempo de execução da execução de consultas nativas inclui a gestão de memória unificada para a comutação dinâmica entre a memória fora do heap e no heap sem exigir alterações às configurações existentes do Spark. O NQE inclui suporte expandido para operadores, funções e tipos de dados do Spark, bem como inteligência para identificar automaticamente oportunidades de usar o motor nativo para operações de pushdown ideais.

Identifique cargas de trabalho de execução de consultas nativas

Use a execução de consultas nativas nos seguintes cenários:

A execução de consultas nativas não é recomendada para cargas de trabalho com entradas dos seguintes tipos de dados:

  • Byte: ORC e Parquet
  • Indicação de tempo: ORC
  • Struct, Array, Map: Parquet

Limitações de execução de consultas nativas

A ativação da execução de consultas nativas nos seguintes cenários pode causar exceções, incompatibilidades com o Spark ou o recurso de contingência da carga de trabalho para o motor do Spark predefinido.

Alternativos

A execução de consultas nativas na execução seguinte pode resultar no recurso da carga de trabalho para o motor de execução do Spark, o que resulta em regressão ou falha.

  • ANSI: se o modo ANSI estiver ativado, a execução recorre ao Spark.

  • Modo sensível a maiúsculas e minúsculas: a execução de consultas nativas suporta apenas o modo predefinido do Spark que não é sensível a maiúsculas e minúsculas. Se o modo sensível a maiúsculas e minúsculas estiver ativado, podem ocorrer resultados incorretos.

  • Análise de tabelas particionadas: a execução de consultas nativas suporta a análise de tabelas particionadas apenas quando o caminho contém as informações de partição. Caso contrário, a carga de trabalho recorre ao motor de execução do Spark.

Comportamento incompatível

Pode ocorrer um comportamento incompatível ou resultados incorretos quando usa a execução de consultas nativas nos seguintes casos:

  • Funções JSON: a execução de consultas nativas suporta strings entre aspas duplas e não aspas simples. Os resultados incorretos ocorrem com as aspas simples. A utilização de "*" no caminho com a função get_json_object devolve NULL.

  • Configuração de leitura de Parquet:

    • A execução de consultas nativas trata spark.files.ignoreCorruptFiles como definido para o valor false predefinido, mesmo quando definido para true.
    • A execução de consultas nativas ignora spark.sql.parquet.datetimeRebaseModeInRead e devolve apenas o conteúdo do ficheiro Parquet. As diferenças entre o calendário híbrido antigo (juliano-gregoriano) e o calendário gregoriano proléptico não são consideradas. Os resultados do Spark podem ser diferentes.
  • NaN: não suportado. Podem ocorrer resultados inesperados, por exemplo, quando usa NaN numa comparação numérica.

  • Leitura de colunas do Spark: pode ocorrer um erro fatal, uma vez que o vetor de colunas do Spark é incompatível com a execução de consultas nativas.

  • Transbordo: quando as partições de aleatorização estão definidas para um número elevado, a funcionalidade de transbordo para o disco pode acionar um OutOfMemoryException. Se isto acontecer, reduzir o número de partições pode eliminar esta exceção.