Acelere as cargas de trabalho e sessões em lote do 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 Serviço Gerenciado para Apache Spark.

Visão geral

O Lightning Engine é um acelerador de consultas de alto desempenho com um mecanismo de otimização multicamadas que executa técnicas de otimização personalizadas, 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 de execução de consultas do Spark em uma carga de trabalho semelhante ao TPC-H (tamanho do conjunto de dados de 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 e a execução de consultas nativas estão disponíveis para uso com o ambiente de execução do Serviço Gerenciado para Apache Spark 2.3. O Lightning Engine e a execução de consultas nativas não estão disponíveis no ambiente de execução 3.0.

  • O Lightning Engine está disponível apenas com o nível de preço premium do Serviço Gerenciado 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 ativá-lo, consulte Ativar o Lightning Engine.

    • Perfis de ambiente de execução (modelos de sessão): quando você cria um perfil de ambiente de execução no console do Google Cloud , o nível Premium e a opção Ativar o Lightning Engine para acelerar o desempenho são selecionados por padrão. Quando você cria um modelo de sessão usando a Google Cloud CLI ou a API Dataproc, o Lightning Engine não é ativado por padrão. Para ativar ou configurar o recurso, 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, um perfil de ambiente de execução (modelo de sessão) e uma sessão interativa do Serviço Gerenciado para Apache Spark.

Carga de trabalho em lote

Ativar o Lightning Engine em uma carga de trabalho em lote

Use o console do 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 do Google Cloud para ativar o Lightning Engine em uma carga de trabalho em lote.

  1. No console do Google Cloud :

    1. Acesse os lotes do Serviço Gerenciado para Apache Spark.
    2. Clique em Criar para abrir a página Criar lote.
  2. Selecione e preencha os seguintes campos:

    • Contêiner:
      • Versão do ambiente de execução: selecione 2.3.
    • Configuração de nível:

      • Selecione Premium. Isso ativa e marca automaticamente "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 do nível Premium definidas automaticamente não podem ser substituídas para lotes que usam ambientes de execução anteriores a 3.0.

      É possível configurar o nível de disco do driver e o nível de disco do executor como Premium ou deixá-los no valor de nível 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 ambiente de execução Execução de consulta nativa:

      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 gcloud dataproc batches submit spark da CLI gcloud para ativar um Lightning Engine em uma carga de trabalho em lote.

gcloud dataproc batches submit spark \
    --project=PROJECT_ID \
    --region=REGION \
    --version=2.3 \
    --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 disponível do Compute Engine para executar a carga de trabalho.
  • --properties=dataproc.tier=premium. Definir o 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 do nível Premium definidas automaticamente não podem ser modificadas para lotes que usam ambientes 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 de 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. É possível adicionar propriedades para selecionar os níveis e tamanhos de disco do 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, como parte da solicitação batches.create:

  • Defina RuntimeConfig.version como 2.3.
  • Adicione "dataproc.tier":"premium" a RuntimeConfig.properties. 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 ambientes de execução anteriores a 3.0.

Outro RuntimeConfig.properties:

  • 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. É possível 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.

Perfil do ambiente de execução

Ativar o Lightning Engine em um perfil de ambiente de execução (modelo de sessão)

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

Console

Use o console do Google Cloud para ativar o Lightning Engine em um perfil de ambiente de execução (modelo de sessão):

  1. No console do Google Cloud , acesse a página Perfis de ambiente de execução:

    Acessar "Perfis de ambiente de execução"

  2. Clique em Criar para abrir a página Criar um perfil de ambiente de execução.

  3. Selecione e preencha os seguintes campos:

    • Nível: verifique se a opção Premium (padrão) está selecionada e se Ativar o Lightning Engine para acelerar o desempenho (selecionada por padrão, que define spark.dataproc.engine=lightningEngine) está selecionada.

    • Configuração adicional: defina as seguintes configurações de ambiente de execução e de propriedade do Spark:

      • Configuração do ambiente de execução: clique em Editar e verifique se a versão do ambiente de execução do Spark está definida como 2.3. Em seguida, clique em Salvar.

      • Outras personalizações: (opcional) para selecionar o ambiente de execução da execução de consulta nativa, clique em Editar, em Adicionar propriedade em Propriedades do Spark, insira o seguinte par de Chave (nome da propriedade) e Valor e clique em Salvar:

        Chave Valor
        spark.dataproc.lightningEngine.runtime native

  4. Preencha, selecione ou confirme outras configurações do perfil de ambiente de execução. Para mais informações sobre as configurações do perfil de ambiente de execução, consulte Criar um perfil de ambiente de execução.

  5. Clique em Criar.

gcloud

Não é possível criar diretamente um modelo de sessão do Serviço Gerenciado para Apache Spark (perfil de ambiente de execução) usando a CLI gcloud. Em vez disso, use o comando gcloud beta dataproc session-templates import para importar um modelo de sessão, editá-lo para ativar o Lightning Engine e, se quiser, o ambiente de execução de consulta nativa e, em seguida, exportar o modelo editado usando o comando gcloud beta dataproc session-templates export.

API

Para ativar o Lightning Engine em um modelo de sessão (perfil de ambiente de execução), 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.

Para mais informações sobre como definir outros campos da API de modelo de sessão, consulte Criar um perfil de ambiente de execução (modelo de sessão).

Sessão interativa

Ativar o Lightning Engine em uma sessão interativa

Use a Google Cloud CLI ou a API Dataproc para ativar o Lightning Engine em uma sessão interativa do Serviço Gerenciado 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 gcloud beta dataproc sessions create spark da CLI gcloud para ativar o Lightning Engine em uma sessão interativa.

gcloud beta dataproc sessions create spark \
    --project=PROJECT_ID \
    --location=REGION \
    --version=2.3 \
    --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 disponível do Compute Engine 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 ambiente 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, como parte da solicitação sessions.create:

Outros RuntimeConfig.properties:

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

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 do 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["version"] = "2.3"
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

Use o console do 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 perfil de ambiente de execução (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 o mecanismo está definido como Lightning Engine:

    • Console doGoogle Cloud : na página Lotes, consulte as colunas Nível e Mecanismo do lote. Clique no ID do lote para ver 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.

Perfil do ambiente de execução

  • Para verificar se engine está definido como Lightning Engine para um perfil de ambiente de execução (modelo de sessão):

    • Console doGoogle Cloud : na página Perfis de ambiente de execução, clique no nome do perfil para conferir as configurações na página de detalhes do perfil.

    • CLI gcloud: execute o comando gcloud beta dataproc session-templates describe.

    • API: emita uma solicitação sessionTemplates.get.

Sessão interativa

  • Para verificar se engine está definido como Lightning Engine para uma sessão interativa:

    • Console doGoogle Cloud : na página Sessões interativas, consulte a coluna Mecanismo da sessão. Clique no ID da sessão interativa para ver essa configuração na página de detalhes da sessão.

    • CLI gcloud: execute o comando gcloud beta dataproc sessions describe.

    • API: emita uma solicitação sessions.get.

Execução de consulta nativa

A execução de consulta nativa (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, projetada para o hardware do Google.

O ambiente de execução de consulta nativa inclui gerenciamento de memória unificado para alternância dinâmica entre memória fora do heap e no heap sem exigir mudanças nas configurações atuais do Spark. O 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 consulta nativa

Use a execução de consulta nativa 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
  • Carimbo de data/hora: ORC
  • Struct, Array, Map: Parquet

Limitações da execução de consulta nativa

Ativar a execução de consultas nativas nos cenários a seguir 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 na execução a seguir pode resultar em fallback da carga de trabalho para o mecanismo de execução do Spark, resultando em regressão ou falha.

  • ANSI: se o modo ANSI estiver ativado, a execução será revertida para o Spark.

  • Modo que diferencia maiúsculas de 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 que diferencia maiúsculas de minúsculas estiver ativado, podem ocorrer resultados incorretos.

  • Verificação de tabela particionada: a execução de consulta nativa só é compatível com a verificação de tabela particionada quando o caminho contém as informações da 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 consulta nativa nos seguintes casos:

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

  • Configuração de leitura do Parquet:

    • A execução de consulta nativa trata spark.files.ignoreCorruptFiles como definido como o valor padrão false, mesmo quando definido como true.
    • A execução de consulta nativa 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 proléptico 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: pode ocorrer um erro fatal porque o vetor colunar do Spark é incompatível com a execução de consulta nativa.

  • Spill: quando as partições de embaralhamento são definidas como um número grande, o recurso de spill para disco pode acionar um OutOfMemoryException. Se isso ocorrer, reduzir o número de partições pode eliminar essa exceção.