Proposta de site feita pela Genesis Innovation · conteúdo do LinkedIn de Daniel Santos

Pular para o conteúdo
Daniel Santos

Wiki Delta Lake

Delta Lake: transações ACID sobre arquivos

Uma tabela Delta é Parquet mais um log de transações (_delta_log). O log é o que dá atomicidade, isolamento, esquema e histórico.

Um data lake de arquivos Parquet soltos não tem transação: um job que falha no meio deixa metade dos arquivos escritos, e quem lê naquele instante vê dado pela metade. O Delta Lake resolve isso com um log de transações ao lado dos dados.

O que há numa tabela Delta

  • arquivos de dados em Parquet;
  • a pasta _delta_log/, com um arquivo JSON por commit (00000000000000000000.json, …01.json, …) e, de tempos em tempos, um *checkpoint* em Parquet que resume o estado para a leitura não precisar repassar todos os JSON.

Cada commit lista as ações: arquivos adicionados (add), removidos (remove), mudança de esquema (metaData). A versão atual da tabela é o resultado de aplicar o log em ordem.

ACID na prática

  • Atomicidade: um commit é a escrita de um arquivo de log. Ou ele existe (a escrita valeu inteira) ou não existe (nada mudou para quem lê).
  • Consistência: o esquema fica no log, e uma escrita com coluna de tipo errado é recusada (*schema enforcement*), a não ser que você peça evolução (mergeSchema).
  • Isolamento: quem lê usa uma versão fixa do log, então não vê escrita pela metade. Escritores concorrentes usam controle otimista: se dois mexem nos mesmos arquivos, um commit falha com conflito.
  • Durabilidade: os dados e o log ficam no armazenamento de objetos (ADLS, S3, GCS).
PySparkPrecisa de um cluster Spark: não roda aqui.
(pedidos.write.format("delta")
    .mode("append")
    .saveAsTable("silver.pedidos"))

# esquema com coluna nova: recusado, a menos que se peça
(pedidos_com_canal.write.format("delta")
    .mode("append")
    .option("mergeSchema", "true")
    .saveAsTable("silver.pedidos"))

Remover não apaga (ainda)

DELETE e UPDATE não reescrevem o arquivo inteiro no lugar: marcam arquivos antigos como removidos no log e escrevem novos. Os antigos continuam no disco até o VACUUM. É isso que permite voltar no tempo (veja Time travel), e é por isso que a pasta cresce se ninguém roda VACUUM.

  • No Databricks, Delta é o formato padrão de tabela.
  • *Deletion vectors* (recurso mais novo) marcam linhas apagadas sem reescrever o arquivo, deixando DELETE/UPDATE/MERGE mais baratos.

Fontes

Conhecimento compartilhado pela Genesis Innovation.