Migrar um data lake Parquet para Delta Lake

Este artigo fornece recomendações para converter um data lake Parquet existente em Delta Lake. Delta Lake é o formato subjacente no Lakehouse do Databricks. Veja O que é Delta Lake?.

Considerações antes de converter para Delta Lake

Seu data lake Parquet provavelmente tem uma estratégia de particionamento que foi otimizada para suas cargas de trabalho e sistemas existentes. Embora você possa converter para Delta Lake e manter essa estrutura de particionamento, as tabelas superparticionadas são um dos principais culpados que causam cargas de trabalho lentas no Delta Lake. Consulte Quando particionar tabelas no Databricks e diretrizes para adaptar o código Spark ao Databricks.

Você também precisa considerar se os dados que estão sendo convertidos ainda estão crescendo ou não, bem como com que frequência os dados estão sendo query no momento. Você pode escolher diferentes abordagens para diferentes tabelas Parquet em seu data lake.

Abordagens para a conversão do Delta Lake

A matriz a seguir descreve as quatro abordagens principais para converter um data lake Parquet em Delta Lake e algumas das compensações. Para esclarecer cada coluna:

  • Incremental: denota a funcionalidade que oferece suporte à conversão de dados adicionais anexados à fonte de conversão após o início da conversão.

  • Dados duplicados: indica se os dados são gravados em um novo local ou modificados no local.

  • Mantém a estrutura de dados: indica se a estratégia de particionamento é mantida durante a conversão.

  • Dados de preenchimento: denota a funcionalidade que oferece suporte aos dados de preenchimento que foram adicionados à fonte de conversão após o início da conversão.

  • Facilidade de uso: Indica o nível de esforço do usuário para configurar e executar a conversão de dados.

Método

incremental

dados duplicados

Mantém a estrutura de dados

dados de preenchimento

Fácil de usar

Parquet CLONE profundo

Sim

Sim

Sim

Sim

Fácil

Parquet raso CLONE

Sim

Não

Sim

Sim

Fácil

CONVERT TO DELTA

Não

Não

Sim

Não

Fácil

Carregador automático

Sim

Sim

Não

Opcional

Alguma configuração

lotes Spark Job

Lógica personalizada

Sim

Não

Lógica personalizada

Lógica personalizada

As seções a seguir discutem cada uma dessas opções em maior profundidade.

Migrar dados do Parquet com CLONE Parquet

Você pode usar o CLONE Parquet para copiar dados de forma incremental de um data lake Parquet para o Delta Lake. Clones rasos criam ponteiros para arquivos Parquet existentes, mantendo sua tabela Parquet em seu local e formato originais enquanto fornecem acesso otimizado por meio de estatísticas de arquivo coletadas. Você pode gravar na tabela criada por um clone superficial sem afetar a fonte de dados original.

O clone profundo copia todos os arquivos de dados da fonte para um novo local durante a conversão para o Delta Lake. A clonagem profunda permite que você detecte de forma incremental novos arquivos, incluindo operações de preenchimento, na execução subsequente da lógica. Consulte Clonar gradualmente tabelas Parquet e Iceberg para Delta Lake.

O exemplo a seguir demonstra o uso de CLONE:

CREATE OR REPLACE TABLE <target-table-name> [SHALLOW] CLONE parquet.`/path/to/data`;

Migrar dados do Parquet com CONVERT TO DELTA

Você pode usar CONVERT TO DELTA para transformar um diretório de arquivos Parquet em uma tabela Delta com um único comando. Depois de converter uma tabela em Delta Lake, você deve parar de ler e gravar na tabela usando a lógica Parquet. Os dados gravados no diretório de destino após a conversão começar podem não ser refletidos na tabela Delta resultante. Consulte Converter em Delta Lake.

O exemplo a seguir demonstra o uso de CONVERT TO DELTA:

CONVERT TO DELTA parquet.`s3://my-bucket/parquet-data`;

Migrar dados do Parquet com o Auto Loader

Embora o Auto Loader seja um produto projetado para ingestão incremental de dados do armazenamento de objetos cloud , você pode aproveitá-lo para implementar um padrão que copia incrementalmente todos os dados de um determinado diretório para uma tabela de destino. Veja O que é Auto Loader?.

O exemplo de código a seguir inclui configurações que:

  • Processe todos os arquivos existentes no diretório de origem.

  • Acione um Job de preenchimento semanal automático para capturar arquivos que podem ter sido perdidos.

  • Permita que o Apache Spark use muitos Job do Spark para evitar erros de derramamento e falta de memória associados a grandes partições de dados.

  • Forneça garantias de processamento exatamente uma vez de ponta a ponta.

(spark.readStream
  .format("cloudFiles")
  .option("cloudFiles.format", "parquet")
  .option("cloudFiles.includeExistingFiles", "true")
  .option("cloudFiles.backfillInterval", "1 week")
  .option("cloudFiles.schemaLocation", checkpoint_path)
  .load(file_path)
  .writeStream
  .option("checkpointLocation", checkpoint_path)
  .trigger(availableNow=True)
  .toTable(table_name)
)

Você pode usar o Auto Loader em Delta Live Tables com Python ou SQL:

Migre os dados do Parquet com a lógica personalizada de lotes do Apache Spark

Escrever a lógica personalizada do Apache Spark fornece grande flexibilidade no controle de como e quando diferentes dados do seu sistema de origem são migrados, mas pode exigir configuração extensiva para fornecer recursos integrados a outras abordagens.

No centro dessa abordagem está uma operação simples de leitura e gravação do Apache Spark, como as seguintes:

spark.read.format("parquet").load(file_path).write.mode("append").saveAsTable(table_name)

Para executar preenchimentos ou migração incremental, você pode contar com a estrutura de particionamento de sua fonte de dados, mas também pode precisar escrever uma lógica personalizada para rastrear quais arquivos foram adicionados desde a última vez que você carregou dados da fonte. Embora você possa usar os recursos de mesclagem do Delta Lake para evitar a gravação de registros duplicados, comparar todos os registros de uma grande tabela de origem Parquet com o conteúdo de uma grande tabela Delta é uma tarefa computacional cara.

Quando você não deve converter para Delta Lake?

Antes de converter todos os dados existentes do Parquet em Delta Lake, é provável que você considere possíveis compensações.

A Databricks projeta muitos recursos otimizados do lakehouse em torno do Delta Lake, e o Delta Lake fornece um rico ecossistema de código aberto com conectores nativos para vários idiomas e sistemas de dados corporativos. Delta compartilhamento estende a capacidade de compartilhar dados armazenados com Delta Lake para outros clientes.

O Delta Lake é construído sobre o Parquet e, como tal, o Databricks também otimizou leitores e gravadores para interagir com arquivos Parquet.

Databricks recomenda usar Delta Lake para todas as tabelas que recebem atualizações regulares ou query de Databricks. Você pode optar por manter os dados no formato Parquet em alguns casos, como os seguintes:

  • Um sistema upstream que grava dados no Parquet não oferece suporte à gravação nativa no Delta Lake.

  • Um sistema downstream que lê dados do Parquet não pode ler Delta Lake.

Em ambos os casos, convém replicar suas tabelas para Delta Lake para aproveitar os benefícios de desempenho durante a leitura, gravação, atualização e exclusão de registros na tabela.

Observação

A modificação simultânea de dados na mesma tabela Delta armazenada no S3 de vários workspace ou sistemas de dados não é recomendada. Consulte as limitações do Delta Lake no S3.