Configurar o Delta Lake para controlar o tamanho do arquivo de dados
Observação
As recomendações neste artigo não se aplicam às tabelas gerenciadas do Catálogo do Unity. O Databricks recomenda usar tabelas gerenciadas do Catálogo do Unity com configurações padrão para todas as novas tabelas Delta.
No Databricks Runtime 13.3 e em versões superiores, o Databricks recomenda utilizar o clustering para o layout de tabela Delta. Confira Usar clustering líquido para tabelas Delta.
O Databricks recomenda usar a otimização preditiva para executar OPTIMIZE
e VACUUM
automaticamente e para tabelas Delta. Consulte Otimização preditiva para tabelas gerenciadas do Catálogo do Unity.
No Databricks Runtime 10.4 LTS e superior, a compactação automática e as gravações otimizadas são sempre habilitadas para as operações MERGE
, UPDATE
e DELETE
. Você não pode desabilitar essa funcionalidade.
O Delta Lake fornece opções para configurar manual ou automaticamente o tamanho do arquivo de destino para gravações e para operações OPTIMIZE
. O Azure Databricks ajusta automaticamente muitas dessas configurações e permite recursos que melhoram automaticamente o desempenho da tabela ao buscar o tamanho certo dos arquivos.
Para as tabelas gerenciadas do Catálogo do Unity, o Databricks ajusta a maioria dessas configurações automaticamente se você estiver usando um warehouse do SQL ou o Databricks Runtime 11.3 LTS ou superior.
Se você estiver atualizando uma carga de trabalho do Databricks Runtime 10.4 LTS ou versões anteriores, confira Atualizar 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 arquivos pequenos, mas não substituem totalmente o OPTIMIZE
. Especialmente para tabelas maiores que 1 TB, o Databricks recomenda executar OPTIMIZE
em um agendamento para consolidar ainda mais os arquivos. O Azure Databricks não executa ZORDER
automaticamente em tabelas, portanto, você deve executar OPTIMIZE
com ZORDER
para permitir ignorar dados aprimorados. Confira Ignorar dados no Delta Lake.
O que é a otimização automática no Azure Databricks?
O termo otimização automática às vezes é usado para descrever a funcionalidade controlada pelas configurações delta.autoOptimize.autoCompact
e delta.autoOptimize.optimizeWrite
. Esse termo foi desativado em favor da descrição de cada configuração individualmente. Consulte Compactação automática do Delta Lake no Azure Databricks e Gravações otimizadas do Delta Lake no Azure Databricks.
Compactação automática para o Delta Lake no Azure Databricks
A compactação automática combina arquivos pequenos dentro das partições de tabela Delta para reduzir automaticamente os problemas de arquivos pequenos. A compactação automática ocorre depois que uma gravação em uma tabela é bem-sucedida e executada de maneira síncrona no cluster que realizou a gravação. A compactação automática compacta somente arquivos que não foram compactados anteriormente.
Você pode controlar o tamanho do arquivo de saída definindo a configuração do Spark spark.databricks.delta.autoCompact.maxFileSize
. O Databricks recomenda o uso do ajuste automático com base na carga de trabalho ou no tamanho da tabela. Consulte Ajuste automático do tamanho do arquivo com base na carga de trabalho e Ajuste automático do tamanho do arquivo com base no tamanho da tabela.
A compactação automática só é disparada para partições ou tabelas que tenham pelo menos um certo número de arquivos pequenos. Você pode alterar opcionalmente o número mínimo de arquivos necessários para disparar a compactação automática definindo spark.databricks.delta.autoCompact.minNumFiles
.
A compactação automática pode ser habilitada no nível da mesa ou da sessão usando as configurações a seguir:
- Propriedade da tabela:
delta.autoOptimize.autoCompact
- Configuração da SparkSession:
spark.databricks.delta.autoCompact.enabled
Essas configurações aceitam as opções a seguir:
Opções | Comportamento |
---|---|
auto (recomendada) |
Ajusta o tamanho do arquivo de destino, respeitando outras funcionalidades do ajuste automático. Requer o Databricks Runtime 10.4 LTS ou versões superiores. |
legacy |
Alias para true . Requer o Databricks Runtime 10.4 LTS ou versões superiores. |
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 no nível da sessão para substituir a compactação automática de todas as tabelas Delta 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 fazer com que esses outros trabalhos falhem com um conflito de transações. Isso não é um problema no Databricks Runtime 10.4 LTS e versões superiores.
Gravações otimizadas para o Delta Lake no Azure Databricks
As gravações otimizadas melhoram o tamanho do arquivo à medida que os dados são gravados e beneficiam as leituras subsequentes na tabela.
Gravações otimizadas são mais eficientes 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 você ainda pode ver um aumento na latência de gravação porque os dados são misturados antes de serem gravados.
A imagem a seguir demonstra como funcionam as gravações otimizadas:
Observação
Você pode ter um código que executa coalesce(n)
ou repartition(n)
pouco antes de gravar seus dados para controlar o número de arquivos gravados. As 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 superiores:
MERGE
UPDATE
com subconsultasDELETE
com subconsultas
As gravações otimizadas também são habilitadas para CTAS
instruções e INSERT
operações ao usar SQL Warehouses. No Databricks Runtime 13.3 LTS e versões superiores, todas as tabelas Delta registradas no Catálogo do Unity têm gravações otimizadas habilitadas para instruções CTAS
e operações INSERT
para tabelas particionadas.
As gravações otimizadas podem ser habilitadas no nível da tabela ou da sessão usando as configurações a seguir:
- Configuração da tabela:
delta.autoOptimize.optimizeWrite
- Configuração da SparkSession:
spark.databricks.delta.optimizeWrite.enabled
Essas configurações aceitam as opções a seguir:
Opções | Comportamento |
---|---|
true |
Use 128 MB como o tamanho do arquivo de destino. |
false |
Desativar gravações otimizadas. Pode ser definido no nível da sessão para substituir a compactação automática de todas as tabelas Delta modificadas na carga de trabalho. |
Definir o tamanho de um arquivo de destino
Se quiser ajustar o tamanho dos arquivos em sua tabela Delta, defina a propriedade tabela delta.targetFileSize
para o tamanho desejado. Se essa propriedade estiver configurada, todas as operações de otimização de layout de dados farão o máximo para gerar arquivos do tamanho especificado. Os exemplos aqui incluem otimizar ou ordenação Z, compactação automática e gravações otimizadas.
Observação
Ao usar tabelas gerenciadas do Catálogo do Unity e SQL warehouses ou Databricks Runtime 11.3 LTS e posteriores, somente os comandos OPTIMIZE
respeitam a configuração targetFileSize
.
Propriedade de tabela |
---|
delta.targetFileSize Tipo: tamanho em bytes ou unidades superiores. O tamanho do arquivo de destino. Por exemplo, 104857600 (bytes) ou 100mb .Valor padrão: nenhum |
Para tabelas existentes, você pode definir e remover propriedades por meio do comando SQL ALTER TABLE SET TBL PROPERTIES. Você também pode definir essas propriedades automaticamente durante a criação de novas tabelas com as configurações de sessão do Spark. Confira Referência de propriedades da tabela Delta para obter detalhes.
Ajuste automático do tamanho do arquivo com base na carga de trabalho
A Databricks recomenda definir a propriedade da tabela delta.tuneFileSizesForRewrites
para true
para todas as tabelas que são segmentadas por muitas operações MERGE
ou DML, independentemente do Databricks Runtime, Catálogo do Unity ou outras otimizações. Quando definido como true
, o tamanho do arquivo de destino da tabela é definido como um limite muito menor, o que acelera as operações intensivas de gravação.
Se não estiver explicitamente definido, o Azure Databricks detecta automaticamente se 9 das últimas 10 operações anteriores em uma tabela Delta foram MERGE
operações e define essa propriedade da tabela comotrue
. Você deve definir explicitamente essa propriedade como false
para evitar esse comportamento.
Propriedade de tabela |
---|
delta.tuneFileSizesForRewrites Digite: Boolean Para ajustar tamanhos de arquivo na otimização de layout de dados ou não. Valor padrão: nenhum |
Para tabelas existentes, você pode definir e remover propriedades por meio do comando SQL ALTER TABLE SET TBL PROPERTIES. Você também pode definir essas propriedades automaticamente durante a criação de novas tabelas com as configurações de sessão do Spark. Confira Referência de propriedades da tabela Delta para obter detalhes.
Ajuste automático do tamanho do arquivo com base no tamanho da tabela
Para minimizar a necessidade de ajuste manual, o Azure Databricks ajustará automaticamente o tamanho do arquivo das tabelas Delta com base no tamanho da tabela. O Azure Databricks usará tamanhos de arquivo menores em tabelas menores e tamanhos de arquivo maiores em tabelas maiores para que o número de arquivos na tabela não cresça muito. O Azure Databricks não ajusta automaticamente as 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 arquivo de destino é baseado no tamanho atual da tabela Delta. Para tabelas menores que 2,56 TB, o tamanho do arquivo de destino ajustado automaticamente é 256 MB. Para tabelas com um tamanho entre 2,56 TB e 10 TB, o tamanho de destino aumenta linearmente de 256 MB para 1 GB. Para tabelas maiores que 10 TB, o tamanho do arquivo de destino é 1 GB.
Observação
Quando o tamanho do arquivo de destino de uma tabela cresce, os arquivos existentes não são otimizados novamente como arquivos maiores pelo comando OPTIMIZE
. Portanto, uma tabela grande pode ter sempre alguns arquivos menores do que o tamanho de destino. Se for necessário otimizar esses arquivos menores também em arquivos maiores, você poderá configurar um tamanho de arquivo de destino fixo para a tabela usando a propriedade de tabela delta.targetFileSize
.
Quando uma tabela for gravada incrementalmente, os tamanhos do arquivo de destino e as contagens de arquivo terão aproximadamente os valores a seguir com base no tamanho da tabela. As contagens de arquivos na tabela são apenas um exemplo. Os resultados reais serão diferentes, dependendo de vários fatores.
Tamanho de tabela | Tamanho do arquivo de destino | Número aproximado de arquivos na tabela |
---|---|---|
10 GB | 256 MB | 40 |
1 TB | 256 MB | 4096 |
2,56 TB | 256 MB | 10240 |
3 TB | 307 MB | 12108 |
5 TB | 512 MB | 17339 |
7 TB | 716 MB | 20784 |
10 TB | 1 GB | 24437 |
20 TB | 1 GB | 34437 |
50 TB | 1 GB | 64437 |
100 TB | 1 GB | 114437 |
Limitar as linhas gravadas em um arquivo de dados
Ocasionalmente, tabelas com dados estreitos podem ter um erro em que o número de linhas em um determinado arquivo de dados excede os limites de suporte do formato Parquet. Para evitar esse erro, você pode usar a configuração de sessão SQL spark.sql.files.maxRecordsPerFile
para especificar o número máximo de registros a serem gravados em um único arquivo para uma tabela do Delta Lake. Especificar um valor de zero ou um valor negativo não representa nenhum limite.
No Databricks Runtime 11.3 LTS e versões posteriores, você também pode usar a opção maxRecordsPerFile
do DataFrameWriter ao usar as APIs do DataFrame para gravar em uma tabela do Delta Lake. Quando maxRecordsPerFile
é especificado, o valor de configuração spark.sql.files.maxRecordsPerFile
da sessão SQL é ignorado.
Observação
O Databricks não recomenda usar essa 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 pelo Catálogo do Unity com dados muito estreitos.
Atualizar para compactação automática em segundo plano
A compactação automática em segundo plano está disponível para tabelas gerenciadas do Catálogo do Unity no Databricks Runtime 11.3 LTS e superior. Ao migrar uma carga de trabalho ou tabela herdada, faça o seguinte:
- Remova a configuração
spark.databricks.delta.autoCompact.enabled
do Spark das configurações de cluster ou notebook. - Para cada tabela, execute
ALTER TABLE <table_name> UNSET TBLPROPERTIES (delta.autoOptimize.autoCompact)
para remover as configurações de compactação automática herdadas.
Depois de remover essas configurações herdadas, você deverá ver a compactação automática em segundo plano disparada automaticamente para todas as tabelas gerenciadas do Catálogo do Unity.