Acelerar o Google Cloud sem servidor para Apache Spark com o Lightning Engine

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

Visão geral

O Lightning Engine é um acelerador de consultas de alta performance desenvolvido por um mecanismo de otimização multicamadas que realiza técnicas de otimização comuns, como otimizações de consulta e execução, além de otimizações selecionadas na camada do sistema de arquivos e nos conectores de acesso a dados.

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

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

Disponibilidade do Lightning Engine

  • O Lightning Engine está disponível para uso com ambientes de execução sem servidor compatíveis para Apache Spark que estão em disponibilidade geral (atualmente ambientes de execução 1.2, 2.2 e 2.3; não disponível no ambiente de execução do Spark 3.0).
  • O Lightning Engine está disponível apenas no 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. Você não precisa fazer nada.
    • Sessões interativas:o Lightning Engine não é ativado por padrão para sessões interativas. Para ativar, consulte Ativar o Lightning Engine.
    • Modelos de sessão:o Lightning Engine não é ativado por padrão para modelos de sessão. Para ativar, consulte Ativar o Lightning Engine.

Ativar o Lightning Engine

As seções a seguir mostram como ativar o Lightning Engine em uma carga de trabalho em lote do Serverless para Apache Spark, um modelo de sessão e uma sessão interativa.

Carga de trabalho em lote

Ativar o Lightning Engine em uma carga de trabalho em lote

Use o console Google Cloud , a Google Cloud CLI ou a API Dataproc para ativar o Lightning Engine em uma carga de trabalho em lote.

Console

Use o console Google Cloud para ativar o Lightning Engine em uma carga de trabalho em lote.

  1. No console do Google Cloud :

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

    • Contêiner:
    • Configuração de nível:

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

      Quando você seleciona o nível premium, o nível de computação do driver e o nível de computação do executor são definidos como Premium. Essas configurações de computação de nível premium definidas automaticamente não podem ser substituídas para lotes que usam tempos de execução anteriores a 3.0.

      Você pode configurar o nível do disco do driver e o nível do disco do executor como Premium ou deixar o valor padrão Standard. Se você escolher um nível de disco premium, selecione o tamanho do disco. Para mais informações, consulte propriedades de alocação de recursos.

    • Propriedades: opcional. Insira o seguinte par Key (nome da propriedade) e Value se quiser selecionar o tempo de execução Execução de consultas nativas:

      Chave Valor
      spark.dataproc.lightningEngine.runtime nativo

  3. Preencha, selecione ou confirme outras configurações de cargas de trabalho em lote. Consulte Enviar 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 em uma carga de trabalho em lote.

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

Observações:

  • PROJECT_ID: o ID do projeto do Google Cloud . Os IDs do projeto estão listados na seção Informações do projeto no painel do console do Google Cloud .
  • 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 são definidos como premium (consulte propriedades de alocação de recursos). Essas configurações de computação de nível premium definidas automaticamente não podem ser substituídas para lotes que usam tempos de execução anteriores a 3.0.
  • Outras propriedades

    • Mecanismo de consulta nativo: spark.dataproc.lightningEngine.runtime=native Adicione essa propriedade se quiser selecionar o ambiente de execução Execução de consulta nativa.

    • Níveis e tamanhos de disco: por padrão, os tamanhos de disco do driver e do executor são definidos como níveis e tamanhos standard. Você pode adicionar propriedades para selecionar níveis e tamanhos de disco premium (em múltiplos de 375 GiB).
      Para mais informações, consulte propriedades de alocação de recursos.

  • OTHER_FLAGS_AS_NEEDED: consulte Enviar uma carga de trabalho em lote do Spark.

API

Para ativar o Lightning Engine em uma carga de trabalho em lote, adicione "dataproc.tier":"premium" a RuntimeConfig.properties como parte da solicitação 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 são definidos como premium (consulte propriedades de alocação de recursos). Essas configurações de computação de nível premium definidas automaticamente não podem ser substituídas para lotes que usam tempos de execução anteriores ao 3.0.

Outro RuntimeConfig.properties:

  • Native Query Engine: spark.dataproc.lightningEngine.runtime:native. Adicione essa propriedade se quiser selecionar o ambiente de execução Execução de consultas nativas.

  • Níveis e tamanhos de disco: por padrão, os tamanhos de disco do driver e do executor são definidos como níveis e tamanhos standard. Você pode adicionar propriedades para selecionar níveis e tamanhos de premium (em múltiplos de 375 GiB).
    Para mais informações, consulte propriedades de alocação de recursos.

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

Modelo de sessão

Ativar o Lightning Engine em um modelo de sessão

Use o console Google Cloud , a Google Cloud CLI ou a API Dataproc para ativar o Lightning Engine em um modelo de sessão para uma sessão do Jupyter ou do Spark Connect.

Console

Use o console Google Cloud para ativar o Lightning Engine em uma carga de trabalho em lote.

  1. No console do Google Cloud :

    1. Acesse os 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 Lightning Engine para acelerar o desempenho do Spark".
    • Configuração de execução:
    • Propriedades:insira 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: insira o seguinte par Key (nome da propriedade) e Value 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 configurações do modelo de sessão. Consulte Criar um modelo de sessão.

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

gcloud

Não é possível criar diretamente um modelo de sessão do Serverless para Apache Spark usando a CLI gcloud. Em vez disso, use o comando gcloud beta dataproc session-templates import para importar um modelo de sessão atual, edite o modelo importado para ativar o Lightning Engine e, opcionalmente, o ambiente de execução de consultas nativas. Em seguida, exporte o modelo editado usando o comando gcloud beta dataproc session-templates export .

API

Para ativar o Lightning Engine em um modelo de sessão, adicione "dataproc.tier":"premium" e "spark.dataproc.engine":"lightningEngine" a RuntimeConfig.properties como parte da solicitação sessionTemplates.create.

Outro RuntimeConfig.properties:

  • Mecanismo de consulta nativo: spark.dataproc.lightningEngine.runtime:native: adicione essa propriedade a RuntimeConfig.properties para selecionar o ambiente de execução Execução de consulta nativa.

Consulte Criar um modelo de sessão para definir outros campos da API de modelo de sessão.

Sessão interativa

Ativar o Lightning Engine em uma sessão interativa

É possível usar a Google Cloud CLI ou a API Dataproc para ativar o Lightning Engine em uma sessão interativa do Serverless para Apache Spark. Também é possível ativar o Lightning Engine em uma sessão interativa em um notebook do BigQuery Studio.

gcloud

Defina as seguintes flags de comando da CLI gcloud gcloud beta dataproc sessions create spark para ativar o Lightning Engine em uma 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

Observações:

  • PROJECT_ID: o ID do projeto do Google Cloud . Os IDs do projeto estão listados na seção Informações do projeto no painel do console do Google Cloud .
  • REGION: uma região do Compute Engine disponível para executar a carga de trabalho.
  • --properties=dataproc.tier=premium,spark.dataproc.engine=lightningEngine. Essas propriedades ativam o Lightning Engine na sessão.

  • Outras propriedades:

    • Mecanismo de consulta nativo: spark.dataproc.lightningEngine.runtime=native: adicione essa propriedade para selecionar o tempo de execução da Execução de consulta nativa.
  • OTHER_FLAGS_AS_NEEDED: consulte Criar uma sessão interativa.

API

Para ativar o Lightning Engine em uma sessão, adicione "dataproc.tier":"premium" e "spark.dataproc.engine":"lightningEngine" a RuntimeConfig.properties como parte da sua solicitação sessions.create.

Outro RuntimeConfig.properties:

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

Consulte Criar uma sessão interativa para definir outros campos da API de modelo de sessão.

Notebook do BigQuery

É possível ativar o Lightning Engine ao criar uma sessão em um 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:

Verificar as configurações do Lightning Engine

É possível usar o console Google Cloud , a Google Cloud CLI ou a API Dataproc para verificar as configurações do Lightning Engine em uma carga de trabalho em lote, um modelo de sessão ou uma sessão interativa.

Carga de trabalho em lote

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

    • Google Cloud console: na página Lotes, consulte as colunas Nível e Mecanismo do lote. Clique no ID do lote para conferir essas configurações na página de detalhes do lote.
    • CLI gcloud: execute o comando gcloud dataproc batches describe.
    • API: emita uma solicitação batches.get.

Modelo de sessão

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

    • Console doGoogle Cloud : na página Modelos de sessão, consulte a coluna Mecanismo do seu modelo. Clique no Nome do modelo de sessão para conferir essa configuração na página de detalhes do modelo.
    • CLI gcloud: execute o comando gcloud beta dataproc session-templates describe.
    • API: emita uma solicitação sessionTemplates.get.

Sessão interativa

  • O mecanismo é definido como Lightning Engine para uma sessão interativa:

    • Google Cloud console: na página Sessões interativas, consulte a coluna Mecanismo do modelo. Clique no ID da sessão interativa para conferir essa configuração na página de detalhes do modelo de sessão.
    • CLI gcloud: execute o comando gcloud beta dataproc sessions describe.
    • API: emita uma solicitação sessions.get.

Execução de consultas nativas

A execução de consultas nativas (NQE, na sigla em inglês) é um recurso opcional do Lightning Engine que melhora o desempenho com uma implementação nativa baseada no Apache Gluten e no Velox, projetado para hardware do Google.

O ambiente de execução de consultas nativas inclui gerenciamento unificado de memória para alternância dinâmica entre memória fora da heap e na heap sem exigir mudanças nas configurações atuais do Spark. A NQE inclui suporte expandido para operadores, funções e tipos de dados do Spark, além de inteligência para identificar automaticamente oportunidades de usar o mecanismo nativo para operações de pushdown ideais.

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

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

Não é recomendável usar a execução de consultas nativas com cargas de trabalho que têm entradas dos seguintes tipos de dados:

  • Byte: ORC e Parquet
  • Carimbo de data/hora: ORC
  • Struct, Array, Map: Parquet

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

Ativar a execução de consultas nativas nos seguintes cenários pode causar exceções, incompatibilidades do Spark ou fallback da carga de trabalho para o mecanismo padrão do Spark.

Substitutos

A execução de consultas nativas pode resultar em um fallback da carga de trabalho para o mecanismo de execução do Spark, causando regressão ou falha.

  • ANSI:se o modo ANSI estiver ativado, a execução vai voltar para o Spark.

  • Modo sensível a maiúsculas e minúsculas:a execução de consultas nativas só é compatível com o modo padrão do Spark que não diferencia maiúsculas de minúsculas. Se o modo sensível a maiúsculas e minúsculas estiver ativado, poderão ocorrer resultados incorretos.

  • Verificação de tabela particionada:a execução de consultas nativas é compatível com a verificação de tabela particionada somente quando o caminho contém as informações de partição. Caso contrário, a carga de trabalho volta para o mecanismo de execução do Spark.

Comportamento incompatível

Comportamento incompatível ou resultados incorretos podem ocorrer ao usar a execução de consultas nativas nos seguintes casos:

  • Funções JSON:a execução de consultas nativas é compatível com strings entre aspas duplas, não simples. Resultados incorretos ocorrem com aspas simples. Usar "*" no caminho com a função get_json_object retorna NULL.

  • Configuração de leitura do Parquet:

    • A execução de consultas nativas trata spark.files.ignoreCorruptFiles como definido para o valor padrão false, mesmo quando definido como true.
    • A execução de consultas nativas ignora spark.sql.parquet.datetimeRebaseModeInRead e retorna apenas o conteúdo do arquivo Parquet. As diferenças entre o calendário híbrido legado (juliano gregoriano) e o calendário gregoriano proleptico não são consideradas. Os resultados do Spark podem variar.
  • NaN:não compatível. Resultados inesperados podem ocorrer, por exemplo, ao usar NaN em uma comparação numérica.

  • Leitura colunar do Spark:um erro fatal pode ocorrer porque o vetor colunar do Spark é incompatível com a execução de consultas nativas.

  • Transbordamento:quando as partições de embaralhamento são definidas com um número grande, o recurso de transbordamento para disco pode acionar um OutOfMemoryException. Se isso acontecer, reduza o número de partições para eliminar essa exceção.