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, ...)];