Compartilhar via


Otimização de tabela do Delta Lake e V-Order

Os formatos de tabela Lakehouse e Delta Lake são fundamentais para o Microsoft Fabric – garantir que as tabelas sejam otimizadas para análise é um requisito fundamental. Este guia aborda conceitos e configurações de otimização de tabelas do Delta Lake e como aplicá-las aos padrões de uso de Big Data mais comuns.

Importante

Os OPTIMIZE comandos neste artigo são comandos SQL do Spark e devem ser executados em ambientes spark, como:

Esses comandos NÃO têm suporte no SQL Analytics Endpoint ou no editor de consultas do Warehouse SQL, que suportam apenas comandos T-SQL. Para a manutenção de tabela por meio do endpoint de SQL Analytics, use as opções de manutenção da interface do usuário do Lakehouse ou execute os comandos em um notebook do Fabric.

O que é V-Order?

O V-Order é uma otimização de tempo de gravação para o formato de arquivo parquet que permite leituras rápidas nos mecanismos de computação do Microsoft Fabric, como Power BI, SQL, Spark e outros.

Os mecanismos do Power BI e do SQL usam a tecnologia Verti-Scan da Microsoft e arquivos parquet ordenados por V para obter tempos de acesso a dados como na memória. O Spark e outros mecanismos de computação que não sejam Verti-Scan também se beneficiam dos arquivos ordenados por V com uma média de tempos de leitura 10% mais rápidos, com alguns cenários de até 50%.

O V-Order otimiza arquivos Parquet por meio de classificação, distribuição de grupo de linhas, codificação e compactação, reduzindo o uso de recursos e melhorando o desempenho e a eficiência de custo. Embora adicione cerca de 15% a tempos de gravação, ele pode aumentar a compactação em até 50%. A classificação por V-Order tem um impacto de 15% em tempos médios de gravação, mas fornece até 50% mais compactação.

Seu formato parquet de software livre 100% compatível, todos os mecanismos parquet podem lê-lo como arquivos parquet regulares. As tabelas Delta estão mais eficientes do que nunca; recursos como o Z-Order são compatíveis com o V-Order. As propriedades da tabela e os comandos de otimização podem ser usados para controlar o V-Order de suas partições.

O V-Order é aplicado no nível do arquivo parquet. Tabelas Delta e seus recursos, como Z-Order, compactação, vácuo, viagem no tempo, etc., são ortogonais em relação ao V-Order e, como tal, são compatíveis e podem ser usados juntos para fornecer benefícios extras.

Controlando gravações de V-Order

O V-Order é usado para otimizar o layout de arquivo parquet para um desempenho de consulta mais rápido, especialmente em cenários de leitura pesada. No Microsoft Fabric, o V-Order é desabilitado por padrão para todos os workspaces recém-criados para otimizar o desempenho de cargas de trabalho de engenharia de dados intensivas em escrita.

O comportamento da ordem V no Apache Spark é controlado por meio das seguintes configurações:

Configuração Valor Padrão Descrição
spark.sql.parquet.vorder.default false Controla a escrita em Ordem-V no nível da sessão. Definido como false por padrão em novos workspaces do Fabric.
TBLPROPERTIES("delta.parquet.vorder.enabled") Remover definição Controla o comportamento padrão de V-Order no nível da tabela.
Opção de gravador DataFrame: parquet.vorder.enabled Remover definição Usado para controlar a Ordem V no nível da operação de gravação.

Use os comandos a seguir para habilitar ou substituir gravações de V-Order conforme necessário para seu cenário.

Importante

  • O V-Order é desabilitado por padrão em novos workspaces do Fabric (spark.sql.parquet.vorder.default=false) para melhorar o desempenho de pipelines de transformação e ingestão de dados.

  • Se a carga de trabalho for de leitura pesada, como consultas interativas ou dashboarding, habilite o V-Order com as seguintes configurações:

    • Defina a propriedade spark.sql.parquet.vorder.default Spark como verdadeira.
    • Altere os perfis de recursos para perfis readHeavyforSpark ou ReadHeavy. Esse perfil habilita automaticamente o V-Order para melhor desempenho de leitura.

No runtime do Fabric 1.3 e versões superiores, a spark.sql.parquet.vorder.enable configuração é removida. Como a V-Order é aplicada automaticamente durante a otimização Delta usando instruções OPTIMIZE, não é necessário habilitar manualmente essa configuração em versões de execução mais recentes. Se você estiver migrando o código de uma versão de runtime anterior, poderá remover essa configuração, pois o mecanismo agora o manipula automaticamente.

Verificar a configuração do V-Order na sessão do Apache Spark

%%sql 
SET spark.sql.parquet.vorder.default 

Desativar a escrita em V-Order na sessão do Apache Spark

%%sql 
SET spark.sql.parquet.vorder.default=FALSE 

Habilitar a escrita em V-Order na sessão do Apache Spark

Importante

Quando habilitado no nível da sessão. Todas as gravações parquet são feitas com ordem V habilitada, que inclui tabelas parquet não Delta e tabelas Delta com a propriedade de parquet.vorder.enabled tabela definida como true ou false.

%%sql 
SET spark.sql.parquet.vorder.default=TRUE 

Controlar o V-Order usando as propriedades da tabela Delta

Habilite a propriedade V-Order da tabela durante a criação da tabela.

%%sql 
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

Importante

Quando a propriedade da tabela é definida como true, os comandos INSERT, UPDATE e MERGE se comportam conforme o esperado e executam a otimização de tempo de gravação. Se a configuração da sessão V-Order for definida como true ou se o spark.write a habilitar, as gravações serão V-Order mesmo se TBLPROPERTIES estiver definida como false.

Habilite ou desabilite o V-Order alterando a propriedade da tabela.

%%sql 
ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "false");

ALTER TABLE person UNSET TBLPROPERTIES("delta.parquet.vorder.enabled");

Depois de habilitar ou desabilitar o V-Order usando as propriedades da tabela, somente gravações futuras na tabela serão afetadas. Os arquivos parquet mantêm a ordenação usada quando ela foi criada. Para alterar a estrutura física atual para aplicar ou remover a ordem V, veja como controlar a ordem V ao otimizar uma tabela.

Controlando a V-Order diretamente em operações de gravação

Todos os comandos de gravação do Apache Spark herdam a configuração da sessão se não forem explícitos. Todos os comandos a seguir são gravados usando o V-Order herdando implicitamente a configuração da sessão.

df_source.write\
  .format("delta")\
  .mode("append")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .location("Files/people")\
  .execute()

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-01-31'")\
  .saveAsTable("myschema.mytable") 

Importante

O V-Order se aplica apenas para arquivos afetados pelo predicado.

Em uma sessão em que spark.sql.parquet.vorder.default não está definido ou está definido como false, os seguintes comandos gravariam usando A V-Order:

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-01-31'")\
  .option("parquet.vorder.enabled ","true")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .option("parquet.vorder.enabled","true")\
  .location("Files/people")\
  .execute()

O que é Otimizar Gravação?

As cargas de trabalho analíticas em mecanismos de processamento de Big Data, como o Apache Spark, têm um desempenho mais eficiente ao usar tamanhos de arquivo maiores padronizados. A relação entre o tamanho do arquivo, o número de arquivos, o número de trabalhos do Spark e suas configurações, executa uma função crítica no desempenho. A ingestão de dados em tabelas de data lake pode ter a característica herdada de gravar constantemente muitos arquivos pequenos. Esse cenário é comumente conhecido como o “problema dos arquivos pequenos”.

"Optimize Write é um recurso do Delta Lake no Fabric e Synapse que reduz a contagem de arquivos e aumenta o tamanho de arquivos individuais durante operações de gravação no Apache Spark." O tamanho do arquivo de destino pode ser alterado por requisitos de carga de trabalho usando as configurações.

O recurso é habilitado por padrão no Microsoft Fabric Runtime para Apache Spark. Para saber mais sobre os cenários de uso do Optimize Write, leia o artigo A necessidade de otimizar a gravação no Apache Spark.

Otimização de mesclagem

O comando MESCLAR do Delta Lake permite que os usuários atualizem uma tabela delta com condições avançadas. Pode atualizar dados de uma tabela de origem, visão ou DataFrame em uma tabela de destino usando o comando MERGE. No entanto, o algoritmo atual na distribuição código aberto do Delta Lake não é totalmente otimizado para lidar com linhas não modificadas. A equipe do Delta do Microsoft Spark implementou uma otimização de Mesclagem em ordem aleatória baixa personalizada, as linhas não modificadas são excluídas de uma operação de embaralhamento dispendiosa necessária para atualizar linhas correspondentes.

A implementação é controlada pela configuração spark.microsoft.delta.merge.lowShuffle.enabled, habilitada por padrão no runtime. Ele não requer alterações de código e é totalmente compatível com a distribuição de software livre do Delta Lake. Para saber mais sobre cenários de uso de Mesclagem em ordem aleatória baixa, leia o artigo Otimização de mesclagem em ordem aleatória baixa em tabelas Delta.

Manutenção de tabela Delta

À medida que as tabelas Delta mudam, o desempenho e a eficiência do custo de armazenamento tendem a se degradar pelos seguintes motivos:

  • Novos dados adicionados à tabela podem distorcer dados.
  • As taxas de ingestão de dados em lote e streaming podem trazer muitos arquivos pequenos.
  • As operações de atualização e exclusão adicionam sobrecarga de leitura. Os arquivos Parquet são imutáveis por design; como as tabelas Delta adicionam novos arquivos Parquet com o conjunto de alterações, isso amplifica ainda mais os problemas impostos pelos dois primeiros itens.
  • Não são mais necessários arquivos de dados e arquivos de log disponíveis no armazenamento.

Para manter as tabelas no melhor estado para melhor desempenho, execute operações de compactação de compartimento e de vácuo nas tabelas Delta. A compactação de bin é obtida pelo comando OPTIMIZE; ele mescla todas as alterações em arquivos parquet maiores e consolidados. A limpeza do armazenamento desreferenciado é feita pelo comando VACUUM.

Os comandos de manutenção da tabela OPTIMIZE e VACUUM, podem ser usados em notebooks e definições de trabalho do Spark e, em seguida, orquestrados usando recursos de plataforma. O Lakehouse no Fabric oferece uma funcionalidade para usar a interface do usuário para executar a manutenção de tabela ad hoc, conforme explicado no artigo Manutenção da Tabela do Delta Lake.

Importante

A criação da estrutura física da tabela com base na frequência de ingestão e nos padrões de leitura geralmente é mais importante do que os comandos de otimização nesta seção.

Controlar a V-Order ao otimizar uma tabela

Os seguintes comandos estruturam bin-compact e reescrevem todos os arquivos afetados usando o V-Order, independentemente da configuração de TBLPROPERTIES ou da configuração de sessão:

%%sql 
OPTIMIZE <table|fileOrFolderPath> VORDER;

OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> VORDER;

OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> [ZORDER  BY (col_name1, col_name2, ...)] VORDER;

Quando ZORDER e VORDER são usados juntos, o Apache Spark executa bin-compaction, ZORDER, VORDER sequencialmente.

Os comandos a seguir compactam e reescrevem todos os arquivos afetados usando a configuração TBLPROPERTIES. Se TBLPROPERTIES for definida como V-Order, todos os arquivos afetados serão gravados como V-Order. Se TBLPROPERTIES não estiver definido ou definido como false, ele herdará a configuração da sessão. Para remover o V-Order da tabela, defina a configuração da sessão como false.

Observação

Ao usar esses comandos em blocos de anotações do Fabric, verifique se há um espaço entre o comando %%sql e o comando OPTIMIZE. A sintaxe correta é:

%%sql 
OPTIMIZE table_name;

Não:%%sqlOPTIMIZE table_name; (isso causará um erro de sintaxe)

%%sql 
OPTIMIZE <table|fileOrFolderPath>;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate [ZORDER BY (col_name1, col_name2, ...)];