Partilhar via


Otimização da tabela Delta Lake e V-Order

O formato de tabela Lakehouse e Delta Lake é fundamental para o Microsoft Fabric, garantindo que as tabelas sejam otimizadas para análise é um requisito fundamental. Este guia aborda conceitos de otimização de tabela Delta Lake, configurações e como aplicá-la aos padrões de uso de Big Data mais comuns.

O que é V-Order?

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

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

V-Order funciona aplicando classificação especial, distribuição de grupo de linhas, codificação de dicionário e compressão em arquivos parquet, exigindo assim menos recursos de rede, disco e CPU em mecanismos de computação para lê-lo, proporcionando eficiência de custo e desempenho. A classificação V-Order tem um impacto de 15% nos tempos médios de gravação, mas fornece até 50% mais compactação.

É 100% compatível com o formato de parquet de código aberto, todos os motores de parquet podem lê-lo como um arquivo de parquet regular. As tabelas delta estão mais eficientes do que nunca; recursos como Z-Order são compatíveis com V-Order. Propriedades de tabela e comandos de otimização podem ser usados no controle V-Order em suas partições.

V-Order é aplicado no nível do arquivo parquet. As mesas Delta e suas características, como Z-Order, compactação, vácuo, viagem no tempo, etc. são ortogonais à V-Order, como tal, são compatíveis e podem ser usadas juntas para benefícios extras.

Controlando gravações V-Order

O V-Order é ativado por padrão no Microsoft Fabric e no Apache Spark é controlado pelas seguintes configurações.

Configuração Valor predefinido Description
spark.sql.parquet.vorder.enabled verdadeiro Controla a escrita V-Order de nível de sessão.
TBLPROPERTIES("delta.parquet.vorder.enabled") false Modo V-Order padrão em tabelas
Opção do gravador de dataframe: parquet.vorder.enabled desconfigurado Controle gravações V-Order usando o gravador Dataframe

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

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

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

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

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

Ativar a escrita V-Order na sessão Apache Spark

Importante

Quando ativado no nível da sessão. Todas as gravações em parquet são feitas com V-Order habilitado. Isso inclui tabelas de parquet não Delta e tabelas Delta com a parquet.vorder.enabled propriedade table definida como ou true false.

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

Controle V-Order usando propriedades de 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 executarão a otimização em tempo de gravação. Se a configuração da sessão V-Order estiver definida como true ou o spark.write habilitá-la, as gravações serão V-Order mesmo que o TBLPROPERTIES esteja definido como false.

Habilite ou desabilite 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 ativar ou desativar o V-Order usando as propriedades da tabela, somente gravações futuras na tabela serão afetadas. Os arquivos Parquet mantêm a ordem usada quando foram criados. Para alterar a estrutura física atual para aplicar ou remover V-Order, leia a seção "Control V-Order ao otimizar uma tabela" abaixo.

Controlando 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 escrevem usando 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

V-Order só se aplica a arquivos afetados pelo predicado.

Em uma sessão em que spark.sql.parquet.vorder.enabled está desdefinido ou definido como false, os seguintes comandos seriam gravados usando 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 é Otimize Write?

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 trabalhadores do Spark e suas configurações, desempenham um papel crítico no desempenho. A ingestão de dados em tabelas de data lake pode ter a característica herdada de escrever constantemente muitos arquivos pequenos; Esse cenário é comumente conhecido como o "problema de arquivo pequeno".

O Otimize Write é um recurso Delta Lake on Microsoft Fabric e Azure Synapse Analytics no mecanismo Apache Spark que reduz o número de arquivos gravados e visa aumentar o tamanho individual dos dados gravados. O tamanho do arquivo de destino pode ser alterado de acordo com os requisitos de carga de trabalho usando configurações.

O recurso é habilitado por padrão no Microsoft Fabric Runtime for Apache Spark. Para saber mais sobre os cenários de uso do Otimize Write, leia o artigo The need for otimize write on Apache Spark.

Otimização de mesclagem

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

A implementação é controlada pela configuração, habilitada spark.microsoft.delta.merge.lowShuffle.enabled por padrão no tempo de execução. Não requer alterações de código e é totalmente compatível com a distribuição de código aberto do Delta Lake. Para saber mais sobre os cenários de uso de Mesclagem Baixa Aleatória, leia o artigo Otimização de Mesclagem Baixa em Tabelas Delta.

Manutenção de mesa delta

À medida que as tabelas Delta mudam, o desempenho e a eficiência de custos de armazenamento tendem a diminuir pelos seguintes motivos:

  • Novos dados adicionados à tabela podem distorcer os dados.
  • As taxas de ingestão de dados em lote e streaming podem trazer muitos arquivos pequenos.
  • Operações de atualização e exclusão eventualmente criam sobrecarga de leitura; Os arquivos de parquet são imutáveis por design, então as tabelas Delta adicionam novos arquivos de parquet com o conjunto de alterações, amplificando 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 obter o melhor desempenho, execute operações de compactação de compartimento e aspiração nas tabelas Delta. Bin-compaction é alcançado pelo comando OTIMIZE , ele funde todas as alterações em arquivos de parquet maiores e consolidados. A limpeza do armazenamento desreferenciado é obtida pelo comando VACUUM .

Os comandos de manutenção de tabela OTIMIZE e VACUUM podem ser usados em notebooks e definições de trabalho do Spark e, em seguida, orquestrados usando recursos de plataforma. O Lakehouse in Fabric oferece uma funcionalidade para usar a interface do usuário para executar a manutenção de tabelas ad-hoc, conforme explicado no artigo de manutenção de tabelas 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.

Controle o V-Order ao otimizar uma mesa

As estruturas de comando a seguir compactam e reescrevem todos os arquivos afetados usando V-Order, independentemente da configuração TBLPROPERTIES ou da configuração da 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 definido true como V-Order, todos os arquivos afetados serão gravados como V-Order. Se TBLPROPERTIES estiver desdefinido ou definido como false como V-Order, ele herdará a configuração da sessão; portanto, para remover 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, ...)];