Partilhar via


Tamanho do ficheiro de dados de controlo

Nota

As recomendações neste artigo não se aplicam às tabelas gerenciadas do Unity Catalog. O Databricks recomenda usar tabelas geridas do Unity Catalog com definições predefinidas para todas as novas tabelas.

No Databricks Runtime 13.3 e superiores, a Databricks recomenda o uso de clustering para a organização de tabelas. Veja Utilizar clustering líquido para tabelas.

O Databricks recomenda o uso da otimização preditiva para executar automaticamente OPTIMIZE e VACUUM para tabelas. Consulte Otimização preditiva para tabelas gerenciadas do Unity Catalog.

No Databricks Runtime 10.4 LTS e versões superiores, a compactação automática e as gravações otimizadas estão sempre habilitadas para MERGE, UPDATE e DELETE operações. Não é possível desativar essa funcionalidade.

Existem opções para configurar manual ou automaticamente o tamanho do ficheiro alvo para escritas e operações OPTIMIZE . O Azure Databricks ajusta automaticamente muitas dessas configurações e habilita recursos que melhoram automaticamente o desempenho da tabela, procurando arquivos de tamanho correto.

Para tabelas gerenciadas do Unity Catalog, o Databricks ajusta a maioria dessas configurações automaticamente se você estiver usando um SQL warehouse ou Databricks Runtime 11.3 LTS ou superior.

Caso esteja a atualizar uma tarefa do Databricks Runtime 10.4 LTS ou inferior, consulte Atualização para compactação automática em segundo plano.

Quando executar OPTIMIZE

A compactação automática e as gravações otimizadas reduzem os problemas de pequenos arquivos, mas não são um substituto completo para OPTIMIZE. Especialmente para tabelas maiores que 1 TB, o Databricks recomenda a execução OPTIMIZE em um cronograma para consolidar ainda mais os arquivos. O Azure Databricks não executa ZORDER automaticamente em tabelas, portanto, deve executar OPTIMIZE com ZORDER para ativar o salto de dados avançado. Ver Salto de dados.

O que é a otimização automática no Azure Databricks?

O termo auto otimizar às vezes é usado para descrever a funcionalidade controlada pelas configurações autoOptimize.autoCompact e autoOptimize.optimizeWrite. Este termo foi retirado em favor de descrever cada cenário individualmente. Veja Compactação automática e Escritas otimizadas.

Compactação automática

A autocompactação combina pequenos ficheiros dentro das partições de tabelas para reduzir automaticamente os problemas de pequenos ficheiros. A compactação automática ocorre depois que uma gravação em uma tabela é bem-sucedida e é executada de forma síncrona no cluster que executou a gravação. A compactação automática compacta apenas arquivos que não foram compactados anteriormente.

Controla o tamanho do ficheiro de saída definindo a configuração spark.databricks.delta.autoCompact.maxFileSize para o Delta ou spark.databricks.iceberg.autoCompact.maxFileSize para o Iceberg. O Databricks recomenda o uso do ajuste automático com base na carga de trabalho ou no tamanho da tabela. Consulte Autotune tamanho do ficheiro com base na carga de trabalho e Autotune tamanho do ficheiro com base no tamanho da tabela.

A compactação automática só é acionada para partições ou tabelas que tenham pelo menos um certo número de arquivos pequenos. Opcionalmente, altere o número mínimo de ficheiros necessários para ativar a autocompactação definindo spark.databricks.delta.autoCompact.minNumFiles para Delta, ou spark.databricks.iceberg.autoCompact.minNumFiles para Iceberg.

Ative a compactação automática ao nível da tabela ou sessão usando as seguintes definições:

  • Propriedade da tabela: autoOptimize.autoCompact
  • Configuração SparkSession: spark.databricks.delta.autoCompact.enabled (Delta) ou spark.databricks.iceberg.autoCompact.enabled (Iceberg)

Essas configurações aceitam as seguintes opções:

Opções Comportamento
auto (recomendado) Ajusta o tamanho do arquivo de destino enquanto respeita outras funcionalidades de ajuste automático. Requer Databricks Runtime 10.4 LTS ou superior.
legacy Alias para true. Requer Databricks Runtime 10.4 LTS ou superior.
true Use 128 MB como o tamanho do arquivo de destino. Sem dimensionamento dinâmico.
false Desativa a compactação automática. Pode ser definido ao nível da sessão para sobrepor a compactação automática para todas as tabelas modificadas na carga de trabalho.

Importante

No Databricks Runtime 9.1 LTS, quando outros gravadores executam operações como DELETE, MERGE, UPDATE ou OPTIMIZE simultaneamente, a compactação automática pode causar a falha desses outros processos devido a um conflito de transação. Este não é um problema no Databricks Runtime 10.4 LTS e superior.

Gravações otimizadas

As gravações otimizadas melhoram o tamanho do arquivo à medida que os dados são gravados e beneficiam as leituras subsequentes na tabela.

As gravações otimizadas são mais eficazes para tabelas particionadas, pois reduzem o número de pequenos arquivos gravados em cada partição. Gravar menos arquivos grandes é mais eficiente do que gravar muitos arquivos pequenos, mas pode ainda observar um aumento na latência de gravação porque os dados são reorganizados antes de serem gravados.

A imagem a seguir demonstra como as gravações otimizadas funcionam:

Gravações otimizadas

Nota

Você pode ter um código que é executado coalesce(n) ou repartition(n) pouco antes de escrever os seus dados de modo a controlar o número de arquivos escritos. Gravações otimizadas eliminam a necessidade de usar esse padrão.

As gravações otimizadas são habilitadas por padrão para as seguintes operações no Databricks Runtime 9.1 LTS e superior:

  • MERGE
  • UPDATE com subconsultas
  • DELETE com subconsultas

As gravações otimizadas também são habilitadas para CTAS instruções e INSERT operações ao usar armazéns SQL. No Databricks Runtime 13.3 LTS e superiores, todas as tabelas registadas no Unity Catalog têm escritas otimizadas ativadas para instruções CTAS e operações INSERT para tabelas particionadas.

As gravações otimizadas podem ser ativadas no nível da tabela ou da sessão usando as seguintes configurações:

  • Propriedade da tabela: autoOptimize.optimizeWrite
  • Configuração SparkSession: spark.databricks.delta.optimizeWrite.enabled (Delta) ou spark.databricks.iceberg.optimizeWrite.enabled (Iceberg)

Essas configurações aceitam as seguintes opções:

Opções Comportamento
true Use 128 MB como o tamanho do arquivo de destino.
false Desativa gravações otimizadas. Pode ser definido ao nível da sessão para substituir a compactação automática para todas as tabelas modificadas do workload.

Definir um tamanho de arquivo de destino

Se quiseres ajustar o tamanho dos ficheiros na tua tabela, define a propriedade targetFileSize para o tamanho desejado. Se essa propriedade for definida, todas as operações de otimização de layout de dados farão uma tentativa de melhor esforço para gerar arquivos do tamanho especificado. Exemplos aqui incluem otimizar ou ordem Z, compactação automática e gravações otimizadas.

Nota

Ao usar tabelas geridas do Unity Catalog e armazéns SQL ou o Databricks Runtime 11.3 LTS ou superior, apenas OPTIMIZE comandos respeitam a targetFileSize configuração.

Propriedade Description
delta.targetFileSize (Delta)
iceberg.targetFileSize (Iceberg)
Tipo: Tamanho em bytes ou unidades superiores.
Descrição: O tamanho alvo do ficheiro. Por exemplo, 104857600 (bytes) ou 100mb.
Valor padrão: Nenhum

Para tabelas existentes, você pode definir e desdefinir propriedades usando o comando SQL ALTER TABLESET TBL PROPERTIES. Você também pode definir essas propriedades automaticamente ao criar novas tabelas usando as configurações de sessão do Spark. Consulte a referência das propriedades da tabela para mais detalhes.

Ajuste automático do tamanho do arquivo com base na carga de trabalho

O Databricks recomenda definir a propriedade tuneFileSizesForRewrites para true para todas as tabelas que são destinadas a várias operações MERGE ou DML, independentemente do Databricks Runtime, Unity Catalog ou outras otimizações. Quando definido como true, o tamanho do arquivo de destino da tabela é definido como um limite muito mais baixo, o que acelera as operações com uso intensivo de gravação.

Se não for explicitamente definido, o Azure Databricks deteta automaticamente se 9 das últimas 10 operações anteriores numa tabela foram MERGE operações e define esta propriedade de tabela para true. Você deve definir explicitamente esta propriedade para false a fim de evitar este comportamento.

Propriedade Description
delta.tuneFileSizesForRewrites (Delta)
iceberg.tuneFileSizesForRewrites (Iceberg)
Tipo: Boolean
Descrição: Se deve ajustar o tamanho dos ficheiros para otimização do layout dos dados.
Valor padrão: Nenhum

Para tabelas existentes, você pode definir e desdefinir propriedades usando o comando SQL ALTER TABLESET TBL PROPERTIES. Você também pode definir essas propriedades automaticamente ao criar novas tabelas usando as configurações de sessão do Spark. Consulte a referência das propriedades da tabela para mais detalhes.

Ajustar automaticamente o tamanho do ficheiro com base no tamanho da tabela

Para minimizar a necessidade de ajuste manual, o Azure Databricks ajusta automaticamente o tamanho do ficheiro das tabelas com base no tamanho da tabela. O Azure Databricks usará tamanhos de arquivo menores para tabelas menores e tamanhos de arquivo maiores para tabelas maiores, para que o número de arquivos na tabela não cresça muito. O Azure Databricks não ajusta automaticamente tabelas que você ajustou com um tamanho de destino específico ou com base em uma carga de trabalho com regravações frequentes.

O tamanho do ficheiro alvo baseia-se no tamanho atual da tabela. Para tabelas menores que 2,56 TB, o tamanho do arquivo de destino ajustado automaticamente é de 256 MB. Para tabelas com um tamanho entre 2,56 TB e 10 TB, o tamanho de destino aumentará linearmente de 256 MB para 1 GB. Para tabelas maiores que 10 TB, o tamanho do arquivo de destino é de 1 GB.

Nota

Quando o tamanho do arquivo de destino de uma tabela aumenta, os arquivos existentes não são reotimizados para arquivos maiores pelo OPTIMIZE comando. Portanto, uma tabela grande sempre pode ter alguns arquivos menores do que o tamanho de destino. Se for necessário otimizar esses arquivos menores em arquivos maiores também, você pode configurar um tamanho de arquivo de destino fixo para a tabela usando a targetFileSize propriedade table.

Quando uma tabela é escrita incrementalmente, os tamanhos de arquivo de destino e as contagens de arquivos serão próximos aos números a seguir, com base no tamanho da tabela. As contagens de ficheiros nesta tabela são apenas um exemplo. Os resultados reais serão diferentes dependendo de muitos fatores.

Tamanho da tabela Tamanho do arquivo de destino Número aproximado de arquivos na tabela
10 GB 256MB 40
1 TB 256MB 4096
2,56 TB 256MB 10240
3 TB 307 MB 12108
5 TB 512 MB 17339
7 TB 716 MB 20784
10 terabytes 1 GB 24437
20 TB 1 GB 34437
50 TB 1 GB 64437
100 TB 1 GB 114437

Limitar linhas gravadas em um arquivo de dados

Ocasionalmente, tabelas com dados estreitos podem encontrar um erro quando o número de linhas em um determinado arquivo de dados excede os limites de suporte do formato Parquet. Para evitar este erro, pode usar a configuração spark.sql.files.maxRecordsPerFile de sessão SQL para especificar o número máximo de registos a escrever num único ficheiro para uma tabela. Especificar um valor zero ou um valor negativo não representa limite.

No Databricks Runtime 11.3 LTS e superiores, pode também utilizar a opção maxRecordsPerFile do DataFrameWriter ao usar as APIs DataFrame para gravar numa tabela. Quando maxRecordsPerFile é especificado, o valor da configuração spark.sql.files.maxRecordsPerFile da sessão SQL é ignorado.

Nota

Databricks não recomenda o uso desta opção, a menos que seja necessário para evitar o erro acima mencionado. Essa configuração ainda pode ser necessária para algumas tabelas gerenciadas do Unity Catalog com dados muito restritos.

Atualize para a compactação automática em segundo plano

A compactação automática em segundo plano está disponível para tabelas gerenciadas do Unity Catalog no Databricks Runtime 11.3 LTS e superior. Ao migrar uma carga de trabalho ou tabela herdada, faça o seguinte:

  1. Remova a configuração Spark spark.databricks.delta.autoCompact.enabled (Delta) ou spark.databricks.iceberg.autoCompact.enabled (Iceberg) das definições do cluster ou do notebook.
  2. Para cada tabela, execute ALTER TABLE <table_name> UNSET TBLPROPERTIES (delta.autoOptimize.autoCompact) (Delta) ou ALTER TABLE <table_name> UNSET TBLPROPERTIES (iceberg.autoOptimize.autoCompact) (Iceberg) para remover quaisquer definições legadas de autocompactação.

Depois de remover essas configurações herdadas, você verá a compactação automática em segundo plano acionada automaticamente para todas as tabelas gerenciadas pelo Unity Catalog.