Compartilhar via


A necessidade de otimizar a gravação no Apache Spark

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 trabalhos do Spark e suas configurações, executa uma função crítica no desempenho. As cargas de trabalho de ingestão em tabelas de data lake podem ter a característica herdada de gravar constantemente muitos arquivos pequenos; Esse cenário é comumente conhecido como "problema de arquivo pequeno".

Otimizar gravação é um recurso delta lake no Synapse que reduz o número de arquivos gravados e visa aumentar o tamanho de arquivo individual dos dados gravados. Ele otimiza dinamicamente as partições enquanto gera arquivos com um tamanho padrão de 128 MB. O tamanho do arquivo de destino pode ser alterado de acordo com os requisitos de carga de trabalho usando configurações.

Esse recurso atinge o tamanho do arquivo usando uma fase extra de embaralhamento de dados em partições, causando um custo extra de processamento ao gravar os dados. A pequena penalidade de gravação deve ser superada pela eficiência de leitura nas tabelas.

Observação

  • Ele está disponível nos Pools do Synapse para o Apache Spark versões acima de 3.1.

Benefícios da otimização de gravações

  • Ele está disponível nas tabelas delta lake para padrões de gravação em Lote e Streaming.
  • Não é necessário alterar o spark.write padrão de comando. O recurso é habilitado por uma configuração ou uma propriedade de tabela.
  • Ele reduz o número de transações de gravação em comparação com o comando OPTIMIZE.
  • As operações OPTIMIZE serão mais rápidas, pois funcionarão em menos arquivos.
  • O comando VACUUM para exclusão de arquivos antigos não referenciados também funcionará mais rapidamente.
  • As consultas verificarão menos arquivos com tamanhos de arquivo mais ideais, melhorando o desempenho de leitura ou o uso de recursos.

Otimizar cenários de uso de gravação

Quando usar isso

  • As tabelas particionadas do Delta lake estão sujeitas a padrões de gravação que geram tamanhos de arquivos abaixo do ideal (menos de 128 MB) ou não padronizados (arquivos com tamanhos diferentes entre si).
  • Quadros de dados reparticionados que serão gravados em disco com tamanho de arquivos abaixo do ideal.
  • Tabelas particionadas do Delta Lake direcionadas por comandos SQL de lote pequeno, como UPDATE, DELETE, MERGE, CREATE TABLE AS SELECT, INSERT INTO, etc.
  • Cenários de ingestão de streaming com padrões de dados de acréscimo a tabelas particionadas do Delta Lake em que a latência de gravação extra é tolerável.

Quando evitá-lo

  • Tabelas não particionadas.
  • Use casos em que a latência de gravação extra não seja aceitável.
  • Tabelas grandes com agendamentos de otimização bem definidos e padrões de leitura.

Como habilitar e desabilitar o recurso de otimização de gravação

O recurso de otimização de gravação está desabilitado por padrão. No Pool do Spark 3.3, ele é habilitado por padrão para tabelas particionadas.

Depois que a configuração for definida para o pool ou sessão, todos os padrões de gravação do Spark usarão a funcionalidade.

Para usar o recurso de otimização de gravação, habilite-o usando a seguinte configuração:

  1. Scala e PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "true")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled` = true

Para verificar o valor da configuração atual, use o comando conforme mostrado:

  1. Scala e PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.enabled")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled`

Para desativar o recurso de otimização de gravação, altere a seguinte configuração, conforme mostrado:

  1. Scala e PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "false")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled` = false

Controlando a otimização da gravação usando as propriedades da tabela

Em novas tabelas

  1. SQL
CREATE TABLE <table_name> TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
  1. Scala

Usando a API do DeltaTableBuilder:

val table = DeltaTable.create()
  .tableName("<table_name>")
  .addColumn("<colName>", <dataType>)
  .location("<table_location>")
  .property("delta.autoOptimize.optimizeWrite", "true") 
  .execute()

Em tabelas existentes

  1. SQL
ALTER TABLE <table_name> SET TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
  1. Scala

Usando a API do DeltaTableBuilder

val table = DeltaTable.replace()
  .tableName("<table_name>")
  .location("<table_location>")
  .property("delta.autoOptimize.optimizeWrite", "true") 
  .execute()

Como obter e alterar a configuração atual do tamanho máximo do arquivo para o Optimize Write

Para obter o valor de configuração atual, use os comandos abaixo. O padrão é 128 MB.

  1. Scala e PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.binSize")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize`
  • Para alterar o valor da configuração
  1. Scala e PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.binSize", "134217728")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize` = 134217728

Próximas etapas