Partilhar via


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

O Lakehouse e o formato de tabela Delta Lake são fundamentais para o Microsoft Fabric, sendo um requisito essencial garantir que as tabelas estejam otimizadas para análise. 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 motores 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 RAM. 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 ordenamento 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 motores de cálculo para leitura, proporcionando eficiência de custo e desempenho. A classificação V-Order afeta os tempos médios de gravação em 15%, mas proporciona até 50% mais compressão.

É 100% compatível com o formato de parquet de código aberto; todos os motores de parquet podem lê-lo como ficheiros de parquet normais. As tabelas delta estão mais eficientes do que nunca; recursos como Z-Order são compatíveis com V-Order. As propriedades da tabela e os comandos de otimização podem ser usados para controlar a ordem V de 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.

Controlar escritas em 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 Descrição
spark.sql.parquet.vorder.default verdadeiro Controla a escrita V-Order no nível da sessão.
TBLPROPERTIES («delta.parquet.vorder.default») falso Modo V-Order padrão em tabelas
Opção do gravador de dataframe: parquet.vorder.default não definido Controle as gravações de V-Order utilizando o DataFrame writer

Utilize os seguintes comandos 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.default 

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

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

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

Importante

Quando ativado no nível da sessão. Todas as escritas no formato parquet são feitas com V-Order ativado. Isso inclui tabelas de parquet não Delta e tabelas Delta com a parquet.vorder.default propriedade da tabela definida como true ou false.

%%sql 
SET spark.sql.parquet.vorder.default=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.default" = "true");

Importante

Quando a propriedade da tabela é definida como verdadeira, os comandos INSERT, UPDATE e MERGE funcionarão conforme esperado e realizarão a otimização no momento da gravação. Se a configuração da sessão V-Order estiver definida como 'true' ou se o spark.write o habilitar, as gravações serão V-Order, mesmo que o TBLPROPERTIES esteja definido como 'false'.

Ative ou desative o V-Order modificando a propriedade da tabela:

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

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

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

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 tal como foi 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.default 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.default ","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.default","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 A necessidade do Otimize Write no 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 equipa do Microsoft Spark Delta implementou uma otimização específica chamada Low Shuffle Merge. Nesta otimização, as linhas que não são modificadas são excluídas de uma dispendiosa operação de embaralhamento, que é necessária para atualizar as linhas correspondentes.

A implementação é controlada pela spark.microsoft.delta.merge.lowShuffle.enabled configuração, habilitada por padrão em 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 com Baixa Redistribuição, leia o artigo Otimização de Mesclagem com Baixa Redistribuição em Tabelas Delta.

Manutenção da Tabela 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 em streaming podem resultar numa grande quantidade de ficheiros pequenos.
  • operações de atualização e exclusão eventualmente criam sobrecarga de leitura; os ficheiros Parquet são imutáveis por design, então as tabelas Delta adicionam novos ficheiros Parquet com o conjunto de alterações, o que 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.

Execute operações de compactação binária e limpeza nas tabelas Delta para manter as tabelas no melhor estado e obter o melhor desempenho. A compactação de bloco é alcançada pelo comando OTIMIZE, que funde todas as alterações em arquivos de parquet maiores e consolidados. A limpeza do armazenamento desreferenciado é realizada através do 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 da Fabric oferece uma funcionalidade para usar a interface de utilizador 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 tabela

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 ficheiros afetados usando a definição TBLPROPERTIES. Se TBLPROPERTIES for definido como V-Order, todos os arquivos afetados serão gravados em formato 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, ...)];