Ir para o conteúdo principal
Produto

Levando o AUTO CDC para o próximo nível: resolvendo os casos de uso mais difíceis do mundo real

Da conformidade bitemporal às atualizações parciais de registros: fornecendo captura de dados alterados robusta e pronta para auditoria sem código personalizado

por Josh Seidel, Shanelle Roman e Sudhanva Huruli

  • O AUTO CDC substitui a lógica MERGE manual para captura de dados alterados por um pipeline declarativo
  • O Spark Declarative Pipelines agora suporta AUTO CDC bitemporal para rastrear o tempo de negócios e do sistema de forma independente, além de Atualizações Parciais para lidar com segurança com campos ausentes
  • Os recursos do AUTO CDC foram expandidos para o Apache Spark 4.2 de código aberto para trazer captura de dados alterados padronizada e fora de ordem para o ecossistema mais amplo

A captura de dados alterados (CDC) é uma das tarefas mais comuns que engenheiros de dados criam no Spark, e uma das mais tediosas de se fazer manualmente. Em nossa publicação anterior, Pare de codificar manualmente pipelines de captura de dados alterados, apresentamos como o AUTO CDC no Apache™ Spark Declarative Pipelines (SDP) automatiza o SCD Tipo 1, SCD Tipo 2 e o Snapshot CDC, substituindo centenas de linhas de lógica MERGE frágil por algumas declarações simples.

À medida que os requisitos de pipeline evoluem, os engenheiros se deparam com situações que esses padrões de CDC tradicionais têm dificuldade para resolver:

  • Lidar com cronogramas bitemporais fora de ordem
  • Processar atualizações parciais de registros sem corromper os dados existentes
  • Manter a auditabilidade que dure mais que as janelas de retenção de armazenamento

Hoje, estamos levando o AUTO CDC para o próximo nível para resolver exatamente esses desafios do mundo real, e expandindo esses recursos para o Apache Spark 4.2 de código aberto.

Rastreamento de histórico em dois eixos com AUTO CDC bitemporal

Tabelas SCD Tipo 2 padrão podem informar quando um fato mudou no mundo real, mas não podem dizer no que seu sistema acreditava em um determinado momento.

De acordo com a Regra 17a-4 da SEC e as regras de manutenção de registros da FINRA, as empresas devem ser capazes de reconstruir os registros como eles existiam em um determinado momento; a varredura de manutenção de registros da SEC sozinha gerou mais de US$ 2 bilhões em multas em mais de 100 empresas desde 2021. A parte difícil raramente é armazenar o valor de hoje. É responder, meses depois, o que os dados de referência diziam na data do relatório e no que nossos sistemas acreditavam na época.

O SCD Tipo 2 padrão rastreia uma linha do tempo: quando um fato mudou. O AUTO CDC bitemporal rastreia duas, de forma independente:

  • Tempo de negócios (também conhecido como tempo do evento ou tempo válido): quando o fato era realmente verdadeiro no mundo real. O símbolo de uma ação tornou-se reportável na segunda-feira; o código de um país foi descontinuado no final do trimestre.
  • Tempo do sistema (também conhecido como tempo de transação ou processamento): quando o sistema de registro tomou conhecimento dos dados. A alteração de segunda-feira pode não chegar ao pipeline até quarta-feira.

Cada tabela de destino recebe quatro colunas gerenciadas pelo sistema: __START_AT e __END_AT para o tempo de negócios, __SYSTEM_START_AT e __SYSTEM_END_AT para o tempo do sistema. Um único fato lógico pode ter várias linhas físicas, uma por combinação de versão de negócios/versão do sistema, que é o que torna possível a reconstrução em um ponto específico no tempo ao longo de qualquer um dos eixos. A principal garantia de comportamento: os eventos podem chegar em qualquer ordem em qualquer uma das linhas do tempo.

Quando uma correção aparece com um tempo de negócios ou tempo do sistema anterior a algo já processado, o mecanismo reescreve o histórico afetado em vez de apenas anexá-lo ao final. Sem lógica escrita manualmente, basta declarar as duas colunas de sequenciamento e o mecanismo mantém ambos os intervalos. Isso funciona igualmente bem para tabelas de dimensão, como cadastros de símbolos, e para tabelas de fatos, como histórico de transações ou leituras de sensores, que exigem auditabilidade estrita. Veja como isso se parece em relação aos dados de referência do FINRA CAT:

Observe que a cláusula SQL exata é STORED AS BITEMPORAL, não STORED AS SCD TYPE BITEMPORAL, e ela requer tanto SEQUENCE BY quanto SYSTEM SEQUENCE BY. Digamos que a flag reportável da Acme mude em 1º de janeiro (tempo de negócios), mas o feed não a receba até 5 de janeiro (tempo do sistema). Uma correção retroativa chega em 8 de janeiro dizendo que a mudança real foi em 1º de janeiro, mas com um valor diferente. O AUTO CDC bitemporal pode responder a ambas as perguntas:

Em 3 de janeiro, a primeira consulta não retorna nada, a resposta correta e auditável para o que o sistema mostrava na época. A segunda consulta, executada hoje, reflete a verdade corrigida. Dois relógios, duas respostas, ambos corretos. As colunas de sequenciamento devem ser de tipos ordenáveis, sem valores de sequenciamento NULL. O recurso é executado no SDP sem servidor (serverless) ou nas edições de produto Pro/Advanced, e está atualmente em Beta, portanto, fixe o pipeline no canal: PREVIEW.

Além da viagem no tempo (time travel): ML reproduzível que sobrevive ao VACUUM

Quando um modelo é treinado em dados de referência ou de recursos (features), a reprodutibilidade significa ser capaz de reconstruir o conjunto de dados exato que o modelo usou, meses depois, durante uma revisão ou auditoria. O instinto é recorrer à viagem no tempo (time travel) do Delta Lake, mas essa é uma propriedade do histórico de arquivos da tabela, não um registro permanente. O VACUUM exclui permanentemente arquivos de dados que não são mais referenciados por versões recentes; uma vez passada a janela de retenção padrão de 7 dias, um TIMESTAMP AS OF registrado no momento do treinamento pode silenciosamente deixar de ser resolvido. Uma tabela bitemporal armazena esse histórico como dados, não como versões de arquivo. VACUUM e OPTIMIZE compactam arquivos, mas nunca tocam no histórico lógico, de modo que cada versão anterior de negócios ou do sistema ainda é uma linha consultável. Existem duas maneiras de obter reprodutibilidade a partir disso: registre dois instantes "as-of" (tempo de negócios e do sistema) como parâmetros do MLflow e fixe a consulta de treinamento nesse estado de crença:

Ou, se a tabela expuser uma visualização atual, registre um único instante do sistema no momento do treinamento e reconstrua-o mais tarde com uma consulta de tempo do sistema nesse timestamp:

De qualquer forma, o contrato de reprodutibilidade consiste em alguns timestamps na execução do MLflow e, como o histórico bitemporal é armazenado como linhas, esse contrato se mantém mesmo depois que o VACUUM tenha limpado os arquivos subjacentes.

As atualizações parciais do AutoCDC agora estão em disponibilidade geral (GA)

Nem todas as fontes de captura de dados alterados (CDC) emitem linhas completas para atualizações. Em vezes disso, muitas enviam apenas os campos que foram alterados, representando todas as outras colunas como NULL. Sem um tratamento especial, esses valores NULL podem substituir acidentalmente os dados existentes na tabela de destino. Até agora, os clientes precisavam criar uma lógica personalizada para contornar esse comportamento. Com as Atualizações Parciais do AutoCDC, isso agora é tratado de forma automática.

As Atualizações Parciais estendem o AutoCDC permitindo que os eventos de atualização modifiquem apenas um subconjunto de colunas. Para colunas selecionadas, os valores NULL em uma atualização recebida são interpretados como "não atualizar" em vez de substituir o valor existente.

Isso é particularmente útil para fontes de CDC que omitem valores inalterados emitindo NULL. Sem as Atualizações Parciais, esses NULLs substituiriam os dados existentes na tabela de destino.

Por exemplo, suponha que a tabela de destino contenha: (1, 'A', 20)

Um evento de atualização recebido contém: (1, NULL, 30)

Por padrão, o AutoCDC atualizaria a linha para: (1, NULL, 30).

Com as Atualizações Parciais ativadas, o NULL em name é tratado como "deixar o valor existente inalterado", resultando em: (1, 'A', 30).

Ativar as Atualizações Parciais exige apenas a adição de um parâmetro à sua definição do AutoCDC. Você pode escolher entre três maneiras de especificar quais colunas devem ser tratadas como atualizações parciais:

  1. uma lista de colunas que deve ignorar valores NULL:
    IGNORE NULL UPDATES ON columnList
  2. uma lista de colunas que NÃO deve ignorar valores NULL:
    IGNORE NULL UPDATES ON * EXCEPT (columnList)
  3. um nome de coluna de origem que pode ser diferente para cada linha:
    COLUMNS TO UPDATE

Para obter a sintaxe completa, exemplos e orientações de uso, consulte a documentação de Aplicação de Atualizações Parciais.

Continuamos comprometidos com o open source

O Spark Declarative Pipelines é open source, então seu tipo de fluxo mais amplamente utilizado também deveria ser. Estamos começando ao contribuir com a API Python para AUTO CDC Type 1 para o Apache Spark 4.2.

Nós contribuímos da mesma forma que o restante do Spark evolui: como uma série de propostas revisadas e pull requests, e não como uma entrega única de código (consulte o SPIP e o SPARK-56249). A correção com dados fora de ordem já vem integrada: uma pequena tabela auxiliar rastreia o estado de eventos que chegam mais cedo, como delete tombstones, microbatches repetidos convergem em vez de corromper o destino e, por se basear nas abstrações de streaming e tabela do Spark em vez de um formato de armazenamento, ele é executado tanto no Delta Lake quanto no Apache Iceberg.

O que vem a seguir, no open source:

  • Recursos da próxima versão: Já mesclamos a interface SQL (CREATE FLOW ... AS AUTO CDC INTO) na master, que será lançada na próxima versão do Apache Spark.
  • Semântica avançada de pipeline: O desenvolvimento está em andamento para o gerenciamento de histórico completo de SCD Type 2, entradas de changelog nativas e suporte a atualizações parciais para evitar que valores NULL substituam os dados de destino.
  • Confiabilidade e testes: Estamos adicionando recursos de aplicação como truncamento (apply-as-truncate) enquanto expandimos nossos conjuntos de testes automatizados para dados fora de ordem e tentativas idempotentes.

Primeiros passos

Quer você queira implementar a conformidade bitemporal, configurar atualizações parciais ou explorar o AutoCDC de código aberto no Apache Spark, confira os recursos abaixo para começar:

(Esta publicação no blog foi traduzida utilizando ferramentas baseadas em inteligência artificial) Publicação original

Receba os posts mais recentes na sua caixa de entrada

Assine nosso blog e receba os posts mais recentes diretamente na sua caixa de entrada.