A necessidade de otimizar a escrita no Apache Spark

Cargas de trabalho analíticas em motores de processamento de Big Data, como o Apache Spark, funcionam de forma mais eficiente quando utilizam tamanhos de ficheiros maiores padronizados. A relação entre o tamanho do ficheiro, o número de ficheiros, o número de trabalhadores da Spark e as suas configurações, desempenham um papel crítico no desempenho. As cargas de trabalho de ingestão em tabelas de data lake podem ter a característica herdada de escrever constantemente muitos pequenos arquivos; este cenário é comumente conhecido como o "pequeno problema de arquivo".

Otimize Write é uma funcionalidade delta lake on Synapse que reduz o número de ficheiros escritos e pretende aumentar o tamanho individual do ficheiro dos dados escritos. Otimiza dinamicamente as divisórias enquanto gera ficheiros com um tamanho padrão de 128 MB. O tamanho do ficheiro-alvo pode ser alterado por requisitos de carga de trabalho utilizando configurações.

Esta funcionalidade consegue o tamanho do ficheiro utilizando uma fase extra de baralhar dados sobre as divisórias, causando um custo extra de processamento enquanto escreve os dados. A pequena penalidade de escrita deve ser superada pela eficiência de leitura nas tabelas.

Nota

  • A otimização da escrita está disponível como uma funcionalidade de Pré-visualização.
  • Está disponível em Piscinas De Sinapse para as versões Apache Spark 3.1 e 3.2.

Benefícios da Otimize Writes

  • Está disponível nas tabelas delta lake para padrões de escrita de Batch e Streaming.
  • Não há necessidade de mudar o padrão de spark.write comando. A funcionalidade é ativada por uma configuração ou uma propriedade de mesa.
  • Reduz o número de transações de escrita em comparação com o comando OTIMIZE.
  • As operações otimize serão mais rápidas, uma vez que funcionará em menos ficheiros.
  • O comando VACUUM para eliminação de ficheiros antigos não-relatados também funcionará mais rapidamente.
  • As consultas digitalizarão menos ficheiros com tamanhos de ficheiro mais ideais, melhorando o desempenho da leitura ou o uso do recurso.

Otimizar cenários de utilização de escrita

Quando Utilizar

  • Tabelas divisórias delta lake sujeitas a padrões de escrita que geram tamanhos sub-ideais (menos de 128 MB) ou tamanhos de ficheiros não padronizados (ficheiros com tamanhos diferentes entre si).
  • Quadros de dados repartidos que serão escritos em disco com tamanho de ficheiros sub-ideais.
  • Tabelas divisórias delta lake visadas por pequenos comandos SQL de lote como UPDATE, DELETE, MERGE, CREATE TABLE AS SELECT, INSERT INTO, etc.
  • Streaming de cenários de ingestão com padrões de dados de apêndice às tabelas partitioned delta lake onde a latência extra de escrita é tolerável.

Quando evitá-lo

  • Mesas não divididas.
  • Use casos em que a latência extra escrita não é aceitável.
  • Mesas grandes com horários de otimização bem definidos e padrões de leitura.

Como ativar e desativar a funcionalidade de escrita otimizada

A função de escrita otimizada é desativada por padrão.

Uma vez definida a configuração para a piscina ou sessão, todos os padrões de escrita Spark utilizarão a funcionalidade.

Para utilizar a função de escrita otimizar, ative-a utilizando a seguinte configuração:

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

Para verificar o valor de configuração atual, utilize o comando como mostrado abaixo:

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

Para desativar a função de escrita otimizada, altere a seguinte configuração como mostrado abaixo:

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

Controlar otimizar escrever usando propriedades de mesa

Em novas mesas

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

Utilização da API DeltaTableBuilder:

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

Nas tabelas existentes

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

Usando a API DeltaTableBuilder

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

Como obter & a configuração do tamanho do ficheiro max atual para Otimize Write

Para obter o valor config atual, use os comandos de fole. O padrão é de 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 config
  1. Scala e PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.binSize", "134217728")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize` = 134217728

Passos seguintes