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.

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 funciona aplicando classificação especial, distribuição de grupo de linhas, codificação de dicionário e compactação em arquivos parquet, exigindo menos recursos de rede, disco e CPU em mecanismos de computação para lê-los, fornecendo eficiência e desempenho de custo. 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 no controle V-Order em 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 é habilitado por padrão no Microsoft Fabric e, no Apache Spark, é controlado pelas configurações a seguir.

Configuração Valor padrão Descrição
spark.sql.parquet.vorder.enabled true Controla a gravação V-Order no nível da sessão.
TBLPROPERTIES(“delta.parquet.vorder.enabled”) falso Modo de V-Order padrão em tabelas
Opção de gravador de dataframe: parquet.vorder.enabled remover definição Controlar gravações V-Order usando o gravador de dataframe

Use os comandos a seguir para controlar o uso de gravações V-Order.

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

%%sql 
SET spark.sql.parquet.vorder.enabled 

Desabilitar gravações V-Order na sessão do Apache Spark

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

Habilitar gravações 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 o V-Order habilitado. Isso inclui tabelas parquet não Delta e tabelas Delta com a propriedade de tabela parquet.vorder.enabled definida como true ou false.

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

Controlar o V-Order usando as propriedades da tabela Delta

Habilite a propriedade da tabela V-Order 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 table é definida como true; Os comandos INSERT, UPDATE e MERGE se comportarão conforme o esperado e desempenharão a otimização do tempo de gravação. Se a configuração da sessão V-Order estiver definida como true ou 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 table:

%%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 V-Order, leia a seção "Controlar V-Order ao otimizar uma tabela" abaixo.

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.enabled 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 Delta Lake no Microsoft Fabric e Azure Synapse Analytics no mecanismo Apache Spark que reduz o número de arquivos gravados e visa aumentar o tamanho do arquivo individual dos dados gravados. 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 otimizar cenários de uso de gravação, 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. Você pode fazer atualização de dados de uma tabela de origem, exibição ou DataFrame em uma tabela de destino usando o comando MESCLAR. 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 podem criar sobrecarga de leitura; os arquivos parquet são imutáveis por design, portanto, as tabelas Delta adicionam novos arquivos parquet com o conjunto de alterações, ampliando 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 de armazenamento desreferenciado é obtida 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

Projetar corretamente a estrutura física da tabela com base na frequência de ingestão e nos padrões de leitura esperados, provavelmente é mais importante do que executar os comandos de otimização descritos 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 for não definida ou for definida como false para V-Order, ela herdará a configuração da sessão; portanto, para remover o V-Order da tabela, defina a configuração da sessão como false.

%%sql 
OPTIMIZE <table|fileOrFolderPath>;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate;

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