Otimização automática

Auto Otimize é um conjunto opcional de funcionalidades que compactam automaticamente pequenos ficheiros durante as escritas individuais para uma tabela Delta. Pagar um pequeno custo durante as escritas oferece benefícios significativos para as tabelas que são consultadas ativamente. A Auto Otimize é particularmente útil nos seguintes cenários:

  • Processos de utilização em streaming em que a latência na ordem dos minutos é aceitável
  • MERGE INTO é o método preferido de escrever em Delta Lake
  • CREATE TABLE AS SELECT ou INSERT INTO são operações comumente utilizadas

Como Otimizar Automaticamente trabalhos

A Auto Otimize consiste em duas características complementares: Escritas Otimizadas e Compactação Automática.

Escritos Otimizados

O Azure Databricks otimiza dinamicamente os tamanhos de partição do Apache Spark com base nos dados reais e tenta escrever 128 ficheiros MB para cada divisória de mesa. Este é um tamanho aproximado e pode variar dependendo das características do conjunto de dados.

Compactação automática

Depois de uma escrita individual, a Azure Databricks verifica se os ficheiros podem ser compactados e executa um trabalho rápido OPTIMIZE (com tamanhos de ficheiro 128 MB em vez de 1GB) para mais ficheiros compactos para divisórias que têm o maior número de pequenos ficheiros.

Escreve otimizados

Utilização

O Auto Otimize foi concebido para ser configurado para tabelas Delta específicas. Ativa as Escritas Otimizadas para uma mesa, definindo a propriedade da delta.autoOptimize.optimizeWrite = true mesa. Da mesma forma, definiu delta.autoOptimize.autoCompact = true para ativar a Auto Compaction.

  • Para as tabelas existentes, corra:

    ALTER TABLE [table_name | delta.`<table-path>`] SET TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true, delta.autoOptimize.autoCompact = true)
    
  • Para garantir que todas as novas tabelas Delta tenham estas funcionalidades ativadas, desabrote a configuração SQL:

    set spark.databricks.delta.properties.defaults.autoOptimize.optimizeWrite = true;
    set spark.databricks.delta.properties.defaults.autoOptimize.autoCompact = true;
    

Além disso, pode ativar e desativar ambas as funcionalidades para sessões spark com as configurações:

  • spark.databricks.delta.optimizeWrite.enabled
  • spark.databricks.delta.autoCompact.enabled

As configurações da sessão têm precedência sobre as propriedades da tabela, permitindo-lhe controlar melhor quando optar por entrar ou excluir estas funcionalidades.

Quando ativar e quando desativar

Esta secção fornece orientações sobre quando optar e optar por não ter funcionalidades de Auto Otimize.

Escritos Otimizados

A Optimized Writes tem como objetivo maximizar a produção de dados que estão a ser escritas para um serviço de armazenamento. Isto pode ser conseguido reduzindo o número de ficheiros que estão a ser escritos, sem sacrificar demasiado paralelismo.

As Escritas Otimizadas requerem a baralhação dos dados de acordo com a estrutura de partição da tabela-alvo. Esta baralhada incorre naturalmente num custo adicional. No entanto, os ganhos de produção durante a escrita podem pagar o custo da baralhada. Caso contrário, os ganhos de produção ao consultar os dados devem ainda fazer com que esta funcionalidade valha a pena.

A parte chave da Optimized Writes é que é uma baralhada adaptativa. Se tiver um caso de utilização de ingestão de streaming e as taxas de dados de entrada mudarem ao longo do tempo, a baralhada adaptativa ajustar-se-á em conformidade com as taxas de dados recebidas em micro-lotes. Se tiver cortes de código onde você coalesce(n) ou pouco antes de escrever o seu repartition(n) fluxo, pode remover essas linhas.

Quando optar

  • Processos de utilização de streaming em que minutos de latência são aceitáveis
  • Ao utilizar comandos SQL MERGE UPDATE como, DELETE , , INSERT INTO````CREATE TABLE AS SELECT

Quando optar por sair

Quando os dados escritos estão na ordem dos terabytes e as instâncias otimizadas de armazenamento não estão disponíveis.

Compactação automática

A Auto Compaction ocorre depois de uma escrita para uma mesa ter sido bem sucedida e correr sincronizadamente no cluster que executou a escrita. Isto significa que se tiver padrões de código onde faz uma escrita para o Delta Lake e, em seguida, ligar OPTIMIZE imediatamente, pode remover a chamada se ativar a OPTIMIZE Auto Compaction.

A Auto Compaction utiliza heurísticas diferentes do que OPTIMIZE . Uma vez que funciona sincronizadamente após uma escrita, sintonizamos a Auto Compaction para correr com as seguintes propriedades:

  • A Azure Databricks não suporta Z-Ordering com Compaction Automática, uma vez que a Z-Ordering é significativamente mais cara do que apenas a compactação.
  • A Compactação Automática gera ficheiros menores (128 MB) do que OPTIMIZE (1 GB).
  • Auto Compaction escolhe gananciosamente um conjunto limitado de divisórias que melhor alavancam a compactação. O número de divisórias selecionadas variará consoante o tamanho do cluster em que é lançado. Se o seu cluster tiver mais CPUs, mais divisórias podem ser otimizadas.

Quando optar

  • Processos de utilização de streaming em que minutos de latência são aceitáveis
  • Quando não tem chamadas regulares OPTIMIZE na mesa

Quando optar por sair

Quando outros escritores podem estar a realizar operações como DELETE MERGE , ou UPDATE OPTIMIZE simultaneamente como Auto Compaction pode causar um conflito de transações para esses empregos. Se a Auto Compaction falhar devido a um conflito de transações, a Azure Databricks não falha nem recomprê a compactação.

Exemplo de fluxo de trabalho: Ingestão de transmissões em fluxo com eliminações ou atualizações simultâneas

Este fluxo de trabalho pressupõe que você tem um cluster executando um trabalho de streaming 24/7 ingerindo dados, e um cluster que funciona em uma base de hora, dia ou ad-hoc para apagar ou atualizar um lote de registos. Para este caso de utilização, a Azure Databricks recomenda que:

  • Ativar as gravações otimizadas no nível da tabela utilizando

    ALTER TABLE <table_name|delta.`table_path`> SET TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
    

    Isto garante que o número de ficheiros escritos pelo stream e os trabalhos de eliminação e atualização são de tamanho ideal.

  • Ativar a Compactação Automática no nível de sessão utilizando a seguinte definição no trabalho que executa a eliminação ou atualização.

    spark.sql("set spark.databricks.delta.autoCompact.enabled = true")
    

    Isto permite que os ficheiros sejam compactados em toda a sua mesa. Uma vez que acontece após a eliminação ou atualização, atenua os riscos de um conflito de transações.

Perguntas Mais Frequentes (FAQ)

O Auto Otimize os ficheiros Z-Order?

A Auto Otimize executa a compactação apenas em ficheiros pequenos. Não tem ficheiros Z-Order.

A Auto Otimize ficheiros corruptos do Z encomendado?

A Auto Otimize ignora ficheiros que são encomendados por Z. Só compacta novos ficheiros.

Se eu tiver o Auto Otimize ativado numa mesa que estou a transmitir, e uma transação simultânea entrar em conflito com o otimizado, o meu trabalho falhará?

Não. Os conflitos de transações que fazem com que a Auto Otimize falhe são ignorados e o fluxo continuará a funcionar normalmente.

Preciso de agendar empregos se o OPTIMIZE Auto Otimize estiver ativado na minha mesa?

Para tabelas com tamanho superior a 10 TB, recomendamos que continue OPTIMIZE a funcionar num horário para consolidar ainda mais os ficheiros e reduzir os metadados da sua tabela Delta. Uma vez que a Auto Otimize não suporta o Z-Ordering, deve ainda agendar OPTIMIZE ... ZORDER BY trabalhos para executar periodicamente.