Compartilhar via


Mecanismo de execução nativo para o Fabric Spark

O mecanismo de execução nativo é um aprimoramento inovador para execuções de trabalho do Apache Spark no Microsoft Fabric. Esse mecanismo vetorizado otimiza o desempenho e a eficiência de suas consultas do Spark, executando-as diretamente em sua infraestrutura de lakehouse. A integração perfeita do mecanismo significa que ele não requer modificações de código e evita o bloqueio do fornecedor. Ela oferece suporte a APIs do Apache Spark, é compatível com o Runtime 1.2 (Spark 3.4) e funciona com os formatos Parquet e Delta. Independentemente da localização dos seus dados no OneLake, ou se você acessar os dados por meio de atalhos, o mecanismo de execução nativo maximiza a eficiência e o desempenho.

O mecanismo de execução nativo eleva significativamente o desempenho da consulta e, ao mesmo tempo, minimiza os custos operacionais. Ele oferece um notável aprimoramento de velocidade, alcançando um desempenho até quatro vezes mais rápido em comparação com o OSS (software de código aberto) tradicional Spark, conforme validado pelo benchmark TPC-DS de 1 TB. O mecanismo é hábil em gerenciar uma ampla gama de cenários de processamento de dados, que vão desde a ingestão de dados de rotina, trabalhos em lote e tarefas de ETL (extrair, transformar, carregar), até análises complexas de ciência de dados e consultas interativas responsivas. Os usuários se beneficiam de tempos de processamento acelerados, taxa de transferência aumentada e utilização otimizada de recursos.

O Native Execution Engine é baseado em dois componentes OSS principais: Velox, uma biblioteca de aceleração de banco de dados C++ introduzida pelo Meta, e Apache Gluten (incubação), uma camada intermediária responsável por descarregar a execução de mecanismos SQL baseados em JVM para mecanismos nativos introduzidos pela Intel.

Observação

O mecanismo de execução nativo está atualmente em visualização pública. Para obter mais informações, confira as limitações atuais. Nesta fase da pré-visualização, não há custo adicional associado à sua utilização.

Quando usar o mecanismo de execução nativo

O mecanismo de execução nativo oferece uma solução para executar consultas em conjuntos de dados de grande escala; ele otimiza o desempenho usando os recursos nativos das fontes de dados subjacentes e minimizando a sobrecarga normalmente associada à movimentação e serialização de dados em ambientes tradicionais do Spark. O mecanismo oferece suporte a vários operadores e tipos de dados, incluindo agregado de hash de rollup, BNLJ (Broadcast Nested Loop Unit) e formatos precisos de carimbo de data/hora. No entanto, para se beneficiar totalmente dos recursos do mecanismo, você deve considerar seus casos de uso ideais:

  • O mecanismo é eficaz ao trabalhar com dados nos formatos Parquet e Delta, que pode ser processado de forma nativa e eficiente.
  • As consultas que envolvem transformações e agregações complexas se beneficiam significativamente dos recursos de processamento colunar e vetorização do mecanismo.
  • O aprimoramento de desempenho é mais notável em cenários em que as consultas não acionam o mecanismo de fallback, evitando recursos ou expressões sem suporte.
  • O mecanismo é adequado para consultas que são computacionalmente intensivas, em vez de simples ou vinculadas a E/S.

Para obter informações sobre os operadores e funções suportados pelo mecanismo de execução nativo, consulte a documentação do Apache Gluten.

Habilitar o mecanismo de execução nativo

Para usar todos os recursos do mecanismo de execução nativo durante a fase de visualização, configurações específicas são necessárias. Os procedimentos a seguir mostram como ativar esse recurso para notebooks, definições de trabalho do Spark e ambientes inteiros.

Importante

O mecanismo de execução nativo atualmente suporta a versão mais recente do runtime do GA, que é o Runtime 1.2 (Apache Spark 3.4, Delta Lake 2.4).

Habilitar para um notebook ou definição de trabalho do Spark

Para habilitar o mecanismo de execução nativo para um único notebook ou definição de trabalho do Spark, você deve incorporar as configurações necessárias no início do script de execução:

%%configure 
{ 
   "conf": {
       "spark.native.enabled": "true", 
       "spark.gluten.enabled": "true", 
       "spark.shuffle.manager": "org.apache.spark.shuffle.sort.ColumnarShuffleManager" 
   } 
} 

Para notebooks, insira os comandos de configuração necessários na primeira célula. Para definições de trabalho do Spark, inclua as configurações na linha de frente da definição de trabalho do Spark.

Captura de tela mostrando como habilitar o mecanismo de execução nativo dentro do notebook.

O mecanismo de execução nativo é integrado a pools personalizados, o que significa que habilitar esse recurso inicia uma nova sessão, normalmente levando até dois minutos para ser iniciada.

Importante

A configuração do mecanismo de execução nativo deve ser feita antes do início da sessão do Spark. Depois que a sessão do Spark é iniciada, a configuração spark.shuffle.manager se torna imutável e não pode ser alterada. Certifique-se de que essas configurações estejam definidas dentro do bloco %%configure em notebooks ou no construtor de sessões do Spark para definições de trabalho do Spark.

Habilitar no nível do ambiente

Para garantir um aprimoramento uniforme do desempenho, habilite o mecanismo de execução nativo em todos os trabalhos e notebooks associados ao seu ambiente:

  1. Navegue até as configurações do seu ambiente.

  2. Vá para Propriedades do Spark.

  3. Preencha os campos na tela Propriedades do Spark, conforme mostrado na imagem a seguir.

Propriedade Valor
spark.native.enabled true
spark.gluten.enabled true
spark.shuffle.manager org.apache.spark.shuffle.sort.ColumnarShuffleManager

Captura de tela mostrando como habilitar o mecanismo de execução nativo dentro do item de ambiente.

Quando habilitado no nível do ambiente, todos os trabalhos e notebooks subsequentes herdam a configuração. Essa herança garante que todas as novas sessões ou recursos criados no ambiente se beneficiem automaticamente dos recursos de execução aprimorados.

Controle no nível de consulta

Os mecanismos para habilitar o Mecanismo de Execução Nativo nos níveis de locatário, espaço de trabalho e ambiente, perfeitamente integrados à interface do usuário, estão em desenvolvimento ativo. Você pode desabilitar o mecanismo de execução nativo para consultas específicas, especialmente se elas envolverem operadores sem suporte no momento (consulte limitações). Para desabilitar, defina a configuração do Spark spark.gluten.enabled como false para a célula específica que contém sua consulta.

%%sql 
SET spark.native.enabled=FALSE; 
SET spark.gluten.enabled=FALSE; 

Captura de tela mostrando como desativar o mecanismo de execução nativo dentro de um notebook.

Depois de executar a consulta na qual o mecanismo de execução nativo está desabilitado, você deve reativá-lo para células subsequentes definindo spark.gluten.enabled como true. Essa etapa é necessária porque o Spark executa células de código sequencialmente.

%%sql 
SET spark.native.enabled=TRUE; 
SET spark.gluten.enabled=TRUE; 

Identificar operações executadas pelo mecanismo

Há vários métodos para determinar se um operador em seu trabalho do Apache Spark foi processado usando o mecanismo de execução nativo.

Interface do usuário do Spark e servidor de histórico do Spark

Acesse a interface do usuário do Spark ou o servidor de histórico do Spark para localizar a consulta que você precisa inspecionar. No plano de consulta exibido na interface, procure quaisquer nomes de nó que terminem com o sufixo Transformer. O sufixo indica que o mecanismo de execução nativo executou a operação. Por exemplo, nós podem ser rotulados como RollUpHashAggregateTransformer, ProjectExecTransformer, BroadcastHashJoinExecTransformer, ShuffledHashJoinExecTransformer ou BroadcastNestedLoopJoinExecTransformer.

Captura de tela mostrando como verificar a visualização do DAG que termina com o sufixo Transformer.

Explicação de DataFrame

Como alternativa, você pode executar o comando df.explain() em seu notebook para exibir o plano de execução. Dentro da saída, procure os mesmos sufixos Transformer. Esse método fornece uma maneira rápida de confirmar se operações específicas estão sendo manipuladas pelo mecanismo de execução nativo.

Captura de tela mostrando como verificar o plano físico da consulta e ver se a consulta foi executada pelo mecanismo de execução nativo.

Mecanismo de fallback

Em alguns casos, o mecanismo de execução nativo pode não ser capaz de executar uma consulta devido a motivos como recursos sem suporte. Nesses casos, a operação recai sobre o mecanismo Spark tradicional. Esse mecanismo de fallback garante que não haja interrupção no fluxo de trabalho.

Captura de tela mostrando o mecanismo de fallback.

Captura de tela mostrando como verificar logs associados ao mecanismo de fallback.

Limitações

Embora o mecanismo de execução nativo melhore o desempenho para trabalhos do Apache Spark, observe suas limitações atuais.

  • O mecanismo não oferece suporte à gravação particionada para tabelas Delta. Algumas operações específicas do Delta não são suportadas, incluindo operações de mesclagem, varreduras de ponto de verificação e vetores de exclusão.
  • Determinados recursos e expressões do Spark não são compatíveis com o mecanismo de execução nativo, como funções definidas pelo usuário (UDFs) e a função array_contains, bem como o streaming estruturado do Spark. O uso dessas operações ou funções incompatíveis como parte de uma biblioteca importada também causará fallback para o mecanismo do Spark.
  • Não há suporte para varreduras de soluções de armazenamento que utilizam pontos de extremidade privados.
  • O mecanismo não oferece suporte ao modo ANSI, então ele pesquisa e, uma vez que o modo ANSI está habilitado, ele volta para o Spark de baunilha.

Ao usar filtros de data em consultas, é essencial garantir que os tipos de dados em ambos os lados da comparação correspondam para evitar problemas de desempenho. Tipos de dados incompatíveis podem não trazer impulso de execução de consulta e podem exigir conversão explícita. Certifique-se sempre de que os tipos de dados do lado esquerdo (LHS) e do lado direito (RHS) de uma comparação sejam idênticos, pois os tipos incompatíveis nem sempre serão automaticamente convertidos. Se uma incompatibilidade de tipo for inevitável, use a conversão explícita para corresponder aos tipos de dados, como CAST(order_date AS DATE) = '2024-05-20'. Consultas com tipos de dados incompatíveis que exigem conversão não serão aceleradas pelo Native Execution Engine, portanto, garantir a consistência do tipo é crucial para manter o desempenho. Por exemplo, em vez de order_date em que order_date = '2024-05-20' é DATETIME e a cadeia de caracteres é DATE, converta explicitamente order_date em DATE garantir tipos de dados consistentes e melhorar o desempenho.

Observação

O mecanismo de execução nativo está atualmente em pré-visualização e seus insights são importantes para nós. Convidamos você a compartilhar seu feedback e os resultados de sua avaliação diretamente com nossa equipe de produtos. Preencha o formulário de comentários. Aguardamos sua valiosa contribuição e estamos ansiosos para discutir suas descobertas em detalhes.