Partilhar via


Compactação de tabelas Delta

Como os sistemas de arquivos e bancos de dados relacionais, os dados tornam-se fragmentados ao longo do tempo, a menos que sejam gerenciados de perto, levando a custos excessivos de computação para ler os dados. Delta Lake não é uma exceção. Os arquivos de dados devem ser periodicamente regravados em um layout ideal para reduzir os custos de operação de arquivos individuais, melhorar a compactação de dados e otimizar o paralelismo do leitor. O OPTIMIZE comando aborda esse desafio: ele agrupa pequenos arquivos dentro de uma partição em compartimentos visando um tamanho de arquivo ideal e os reescreve no armazenamento. O resultado são os mesmos dados compactados em menos arquivos.

Métodos de compactação

O Microsoft Fabric oferece várias abordagens para manter tamanhos de arquivo ideais em tabelas Delta:

OPTIMIZE comando

O OPTIMIZE comando é a operação fundamental para compactar tabelas Delta. Ele regrava arquivos pequenos em arquivos maiores para melhorar o layout de dados em tabelas Delta.

OPTIMIZE dbo.table_name
Propriedade Description Valor predefinido Configuração da sessão
minFileSize Os arquivos menores que esse limite são agrupados e reescritos como arquivos maiores. 1073741824 (1 g) spark.databricks.delta.otimize.minFileSize
maxFileSize Tamanho do OPTIMIZE arquivo de destino produzido pelo comando. 1073741824 (1g) spark.databricks.delta.optimize.maxFileSize

Importante

Embora OPTIMIZE seja uma operação idempotente (o que significa que executá-la duas vezes seguidas não reescreve nenhum dado), usar um minFileSize que é muito grande em relação ao tamanho da tabela Delta pode causar amplificação de gravação, tornando a operação computacionalmente mais cara do que o necessário. Por exemplo, se o seu minFileSize estiver configurado para 1 GB e tiver um arquivo de 900 MB na sua tabela, esse arquivo de 900 MB será reescrito quando OPTIMIZE for executado após a gravação de um pequeno arquivo de 1 KB na sua tabela. Para obter orientação sobre como gerenciar automaticamente o tamanho do arquivo, consulte a documentação do tamanho do arquivo de destino adaptável .

OPTIMIZE com Z-Order

Quando a ZORDER BY cláusula é especificada, OPTIMIZE reescreve todos os arquivos ativos para que linhas com valores semelhantes para as colunas de ordem z sejam agrupadas nos mesmos arquivos, melhorando a eficácia da omissão de arquivos para consultas que aplicam filtros nessas colunas. Use Z-Order quando:

  • Suas consultas freqüentemente filtram duas ou mais colunas juntas (por exemplo, data + customer_id) e
  • Esses predicados são seletivos o suficiente para que o salto no nível do arquivo reduza o número de arquivos examinados.
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)

OPTIMIZE com V-Order

A cláusula VORDER resulta em aplicar a otimização V-Order aos arquivos com escopo para compactação. Para obter mais informações sobre o V-Order, consulte a documentação detalhada.

OPTIMIZE dbo.table_name VORDER

OPTIMIZE com agrupamento de líquidos

O agrupamento em líquido é especificado como uma opção de tabela; Veja Ativar Clustering em Líquido para obter detalhes. Quando a clusterização líquida está ativada, OPTIMIZE realiza uma reescrita física que aplica a política de clusterização.

Importante

Os dados só são agrupados quando OPTIMIZE são executados em tabelas habilitadas para clusterização líquida. As operações regulares de gravação NÃO agrupam os dados. Ter uma estratégia de compactação, como usar a compactação automática ou agendar manualmente trabalhos de otimização, é fundamental para garantir que os benefícios dos dados clusterizados (ou seja, o aprimoramento na omissão de arquivos Delta) possam ser realizados.

Otimização rápida

O Fast Otimize analisa de forma inteligente arquivos de tabela Delta e ignora operações de compactação que provavelmente não melhorarão significativamente o desempenho.

Em vez de compactar arquivos cegamente sempre que existam arquivos pequenos, a função "fast optimize" avalia se cada bin (grupo de arquivos pequenos) candidato atende às metas de compactação configuráveis de acordo com as práticas recomendadas. O Fast Otimize só executa a compactação em um compartimento de arquivos se é provável que a mesclagem atinja seu tamanho mínimo de destino ou se houver muitos arquivos pequenos. Caso contrário, ignora esse grupo ou reduz o número de ficheiros compactados.

SET spark.microsoft.delta.optimize.fast.enabled = TRUE

A otimização rápida pode ser ajustada com base nas suas expectativas de compactação:

Propriedade Description Valor predefinido Configuração da sessão
minNumFicheiros O número de arquivos pequenos que precisam existir num contentor para que a otimização seja executada se o contentor não contiver dados suficientes, estimados para produzir um arquivo compactado. 50 spark.microsoft.delta.optimize.fast.minNumFiles
Coeficiente Parquet Multiplicado pelo tamanho mínimo do arquivo de contexto otimizado para determinar a quantidade mínima de dados de arquivos pequenos que devem existir em um compartimento para que o compartimento seja incluído no escopo da compactação. 1.3 spark.microsoft.delta.optimize.fast.parquetCoefficient

Observação

O parquetCoefficient resultado no tamanho de destino de um compartimento ser maior do que o tamanho mínimo de ficheiro de destino no contexto de otimização. Este coeficiente leva em consideração o fato de que a combinação de vários pequenos arquivos parquet resulta em melhor compressão e, portanto, menos dados do que a soma dos pequenos arquivos. Esse valor pode ser aumentado para ser mais conservador na frequência com que a otimização rápida ignorará compartimentos, ou diminuído para permitir uma ignorância de compartimentos mais permissiva.

Como funciona

A otimização rápida introduz verificações extras antes que os compartimentos sejam compactados. Para cada caixa de candidato, o Fast Optimize avalia:

  • A quantidade estimada de dados brutos no compartimento (soma de tamanhos de arquivo pequenos)
  • Se a combinação de arquivos pequenos é estimada para produzir um arquivo que atenda ao tamanho mínimo de destino configurado
  • Se o compartimento contém pelo menos o número mínimo configurado de arquivos pequenos

O Fast Otimize avalia cada compartimento de arquivos pequenos e compacta apenas os arquivos pequenos que provavelmente atingirão o tamanho mínimo de destino ou excederão a contagem mínima de arquivos. Os compartimentos que não atendem a esses limites são ignorados ou parcialmente compactados. Evitar compartimentos abaixo do ideal reduz regravações desnecessárias, diminui a amplificação de escrita e torna os trabalhos OTIMIZAR mais idempotentes.

Captura de tela mostrando a rapidez com que a otimização avalia se um compartimento está compactado.

Observação

A implementação exata está sujeita a evoluir ao longo do tempo.

A otimização rápida pode resultar em menos dados sendo reescritos ao longo de um ciclo de vida de tabelas Delta. Como ilustrado no diagrama a seguir, a otimização rápida ignora a compactação de compartimentos subótimos. O resultado final são trabalhos OPTIMIZE mais rápidos e idempotentes e menor amplificação de escrita.

Captura de tela mostrando a rapidez com que a otimização resulta em menos regravação de dados ao longo do tempo.

Observação

Apenas para fins de ilustração, os diagramas acima assumem que o tamanho do arquivo escrito a partir da compactação é a soma do tamanho de arquivos pequenos. Também implica um parquetCoefficient igual a 1.

Limitações
  • Não aplicável a operações de agrupamento de líquidos e Z-Order
  • A otimização rápida não modifica o comportamento da compactação automática

Objetivos de compactação ao nível de arquivo

Para evitar a regravação de dados que anteriormente eram considerados compactados (grandes o suficiente) com base na alteração dos destinos de tamanho mínimo e máximo de arquivo de compactação, spark.microsoft.delta.optimize.fileLevelTarget.enabled pode ser habilitado para evitar a recompactação de arquivos já compactados. Quando habilitado, os arquivos não são recompactados se anteriormente atingissem pelo menos metade do tamanho do arquivo de destino no momento da compactação. A manutenção dos objetivos a nível de ficheiro minimiza a amplificação de gravação à medida que o tamanho alvo das modificações de compactação muda ao longo do tempo (por exemplo, a partir da avaliação e definição de um tamanho de arquivo alvo adaptativo maior). Se ativada, a tag OPTIMIZE_TARGET_SIZE é adicionada a novos arquivos quando OTIMIZE é executado ou para qualquer operação de gravação se a propriedade delta.targetFileSize ou a tabela delta.targetFileSize.adaptive estiver definida.

Observação

Embora não esteja ativada por padrão, a Microsoft recomenda ativar destinos de compactação ao nível de arquivo para limitar a potencial amplificação de gravação.

SET spark.microsoft.delta.optimize.fileLevelTarget.enabled = TRUE

Compactação automática

A compactação automática avalia a integridade da partição após cada operação de gravação. Quando ele deteta fragmentação excessiva de arquivos (muitos arquivos pequenos) dentro de uma partição, ele dispara uma operação síncrona OPTIMIZE imediatamente após a gravação ser confirmada. Essa abordagem orientada por escritor para a manutenção de arquivos é ideal porque a compactação só é executada quando determinado programaticamente como benéfico.

Defina no nível da sessão para permitir a compactação automática em novas tabelas:

SET spark.databricks.delta.autoCompact.enabled = TRUE

Defina no nível da tabela para habilitar apenas para tabelas selecionadas:

CREATE TABLE dbo.table_name
TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Utilize a opção DataFrameWriter para ativar em novas tabelas.

df.write.option('delta.autoOptimize.autoCompact', 'true').saveAsTable('dbo.table_name')

Ativar em tabelas existentes:

ALTER TABLE dbo.table_name
SET TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

O comportamento da compactação automática pode ser ajustado através das seguintes configurações de sessão do Spark:

Propriedade Description Valor predefinido Configuração da sessão
maxFileSize O tamanho máximo do arquivo de destino em bytes para arquivos compactados. 134217728b (128 MB) spark.databricks.delta.autoCompact.maxFileSize
minFileSize O tamanho mínimo em bytes para que um arquivo seja considerado compactado. Qualquer coisa abaixo deste limiar é considerada para compactação e incluída no cálculo do minNumFiles limiar. Unset por padrão, calculado como 1/2 de maxFileSize a menos que defina explicitamente um valor. spark.databricks.delta.autoCompact.minFileSize
minNumFicheiros O número mínimo de arquivos que devem existir abaixo do limite para que a minFileSize compactação automática seja acionada. 50 spark.databricks.delta.autoCompact.minNumFicheiros

Observação

A Microsoft recomenda o uso da compactação automática em vez de agendar OPTIMIZE trabalhos. A compactação automática geralmente supera os trabalhos de compactação programados maximizando o desempenho de leitura/gravação e, muitas vezes, elimina a sobrecarga de manutenção de codificação, agendamento e otimização da frequência de execução de trabalhos agendados. A compactação automática é recomendada quando os objetivos de nível de serviço de processamento de dados toleram a latência adicional que ocorre quando a compactação automática é acionada e é necessária. Se os requisitos de latência de dados forem rigorosos, talvez seja mais eficaz agendar a otimização para execução em um pool Spark separado para que as operações de gravação não vejam picos periódicos devido às operações de compactação síncronas que estão sendo acionadas.

Importante

Embora a compactação seja uma estratégia crítica a ser empregada, ela também deve ser adequadamente emparelhada com a prevenção de escrever pequenos arquivos por meio de recursos como otimizar a gravação. Para obter mais informações, consulte as orientações sobre como otimizar a gravação.

Manutenção de tabelas Lakehouse

Os usuários podem executar operações de manutenção ad-hoc como OPTIMIZE a partir da interface do usuário do Lakehouse. Para obter mais informações, consulte Lakehouse table maintenance.

Resumo das melhores práticas

  • Habilite a compactação automática para pipelines de ingestão com gravações pequenas frequentes (streaming ou microlote) para evitar o agendamento manual e manter os arquivos compactados automaticamente.
    • Para outros padrões de gravação, pode ser benéfico habilitar como seguro contra o acúmulo de arquivos pequenos, mas pondere se seus objetivos de nível de serviço de processamento de dados toleram picos periódicos no tempo de processamento.
  • Agende operações de tabela completa OPTIMIZE durante períodos de baixa atividade quando precisar reescrever muitas partições ou executar Z-Order.
  • Habilite a otimização rápida para reduzir a amplificação de gravação e tornar OPTIMIZE mais idempotente.
  • Habilite destinos de compactação no nível de arquivo para evitar a amplificação de gravação à medida que as tabelas aumentam de tamanho e usam tamanhos de arquivo de destino maiores.
  • Lembre-se de que a compactação antes da gravação (otimização de gravação) é menos dispendiosa do que a compactação após a gravação (otimização). Consulte a documentação de optimize write para obter as melhores práticas.