O processamento de fluxo com estado se refere ao processamento de um fluxo contínuo de eventos em tempo real, mantendo um estado baseado nos eventos vistos até agora. Isso permite que o sistema rastreie mudanças e padrões ao longo do tempo no fluxo de eventos e possibilita a tomada de decisões ou ações com base nessas informações.
O processamento de fluxo com estado no Apache Spark Structured Streaming é suportado usando operadores integrados (como agregação em janela, junção de fluxo-fluxo, eliminação de duplicatas etc.) para lógica predefinida e usando flatMapGroupWithState ou mapGroupWithState para lógica arbitrária. A lógica arbitrária permite que os usuários escrevam seu código personalizado de manipulação de estado em seus pipelines. No entanto, à medida que a adoção de streaming cresce na empresa, aplicações de streaming mais complexas e sofisticadas exigem vários recursos adicionais para facilitar aos desenvolvedores a escrita de pipelines de streaming com estado.
Para suportar essas novas aplicações de streaming com estado em crescimento ou casos de uso operacionais, a comunidade Spark está introduzindo um novo operador Spark chamado transformWithState. Este operador permitirá modelagem de dados flexível, tipos compostos, temporizadores, TTL, encadeamento de operadores stateful após transformWithState, evolução de esquema, reutilização de estado de uma consulta diferente e integração com uma série de outros recursos do Databricks, como Catálogo Unity, Delta Live Tables e Spark Connect. Usando este operador, os clientes podem desenvolver e executar seus casos de uso operacionais complexos e críticos de forma confiável e eficiente na plataforma Databricks usando linguagens populares como Scala, Java ou Python.
Muitas aplicações orientadas a eventos dependem de realizar cálculos com estado para acionar ações ou emitir eventos de saída que geralmente são escritos em outro log de eventos/ônibus de mensagens como Apache Kafka/Apache Pulsar/Google Pub-Sub etc. Essas aplicações geralmente implementam uma máquina de estado que valida regras, detecta anomalias, rastreia sessões, etc., e gera os resultados derivados, que são geralmente usados para acionar ações em sistemas a jusante, baseado em:
Exemplos de tais aplicações incluem Rastreamento de Experiência do Usuário, Detecção de Anomalias, Monitoramento de Processos de Negócios e Árvores de Decisão.
O Apache Spark agora apresenta o transformWithState, um operador de processamento com estado de próxima geração projetado para tornar a construção de aplicações de streaming complexas, em tempo real, mais flexíveis, eficientes e escaláveis. Esta nova API desbloqueia capacidades avançadas para gerenciamento de estado, processamento de eventos, gerenciamento de temporizadores e evolução de esquema, permitindo aos usuários implementar lógica de streaming sofisticada com facilidade.
Estamos introduzindo uma nova abordagem de API em camadas, flexível e extensível para lidar com as limitações mencionadas. Um diagrama de arquitetura de alto nível da arquitetura em camadas e os recursos associados em várias camadas são mostrados abaixo.
Como mostrado na figura, continuamos a usar os backends de estado disponíveis hoje. Atualmente, o Apache Spark suporta dois backends de armazenamento de estado:
O novo operador transformWithState será inicialmente suportado apenas com o provedor de armazenamento de estado RocksDB. Fazemos uso de várias funcionalidades do RocksDB em torno de varreduras de intervalo, operadores de mesclagem, etc. para garantir o desempenho ideal para os vários recursos usados dentro do transformWithState. Em cima desta camada, construímos outra camada de abstração que usa o StatefulProcessorHandle para trabalhar com tipos compostos, temporizadores, metadados de consulta, etc. No nível do operador, habilitamos o uso de um StatefulProcessor que pode incorporar a lógica de aplicação usada para entregar essas poderosas aplicações de streaming. Finalmente, você pode usar o StatefulProcessor dentro das consultas do Apache Spark baseadas nas APIs DataFrame.
Aqui está um exemplo de uma consulta de streaming do Apache Spark usando o operador transformWithState:
Com transformWithState, os usuários podem agora definir múltiplas variáveis de estado independentes dentro de um StatefulProcessor baseado no modelo de programação orientada a objetos. Essas variáveis funcionam como membros de classe privados, permitindo um gerenciamento de estado granular sem a necessidade de uma estrutura de estado monolítica. Isso facilita a evolução da lógica da aplicação ao longo do tempo, adicionando ou modificando variáveis de estado sem reiniciar consultas a partir de um novo diretório de checkpoint.
Os usuários agora podem registrar temporizadores para acionar a lógica da aplicação orientada a eventos. A API suporta tanto o tempo de processamento (baseado em relógio) quanto o tempo do evento (baseado em coluna). Quando um temporizador dispara, um callback é emitido, permitindo um manuseio eficiente de eventos, atualizações de estado e geração de saída. A capacidade de listar, registrar e deletar temporizadores garante um controle preciso sobre o processamento de eventos.
O gerenciamento de estado agora é mais intuitivo com suporte integrado para estruturas de dados compostas:
O Spark codifica e persiste automaticamente esses tipos de estado, reduzindo a necessidade de serialização manual e melhorando o desempenho.
Para conformidade e eficiência operacional, o transformWithState introduz suporte nativo para tempo de vida (TTL) para variáveis de estado. Isso permite que os usuários definam políticas de expiração, garantindo que os dados de estado antigos sejam automaticamente removidos sem a necessidade de limpeza manual.
Com esta nova API, operadores com estado agora podem ser encadeados após transformWithState, mesmo ao usar o tempo de evento como o modo de tempo. Ao referenciar explicitamente colunas de tempo de evento no esquema de saída, operadores downstream podem realizar filtragem de registros atrasados e evicção de estado de forma contínua - eliminando a necessidade de soluções alternativas complexas envolvendo múltiplos pipelines e armazenamento externo.
Os usuários podem inicializar o estado a partir de consultas existentes, facilitando a reinicialização ou clonagem de trabalhos de streaming. A API permite integração perfeita com o leitor de fonte de dados de estado, permitindo que novas consultas aproveitem o estado previamente escrito sem processos de migração complexos.
transformWithState suporta evolução de esquema, permitindo mudanças como:
Apache Spark detecta e aplica automaticamente atualizações de esquema compatíveis, garantindo que as consultas possam continuar sendo executadas dentro do mesmo diretório de checkpoint. Isso elimina a necessidade de reconstruções completas do estado e reprocessamento, reduzindo significativamente o tempo de inatividade e a complexidade operacional.
Para facilitar a depuração e observabilidade, transformWithState é integrado nativamente com o leitor de fonte de dados de estado. Os usuários podem inspecionar variáveis de estado e consultar dados de estado diretamente, simplificando a solução de problemas e análise, incluindo recursos avançados como readChangeFeed etc.
A API transformWithState está disponível agora com o lançamento do Databricks Runtime 16.2 em Clusters Dedicados No-Isolation e Unity Catalog. Suporte para Clusters Padrão do Catálogo Unity e Computação Serverless será adicionado em breve. A API também está prevista para estar disponível em código aberto com o lançamento do Apache Spark™ 4.0.
Acreditamos que todas as melhorias de recursos embutidas na nova API transformWithState permitirão a construção de uma nova classe de cargas de trabalho operacionais confiáveis, escaláveis e críticas para a missão, alimentando os casos de uso mais importantes para nossos clientes e usuários, tudo dentro do conforto e facilidade de uso das APIs DataFrame do Apache Spark. Importante, essas mudanças também estabelecem a base para futuros aprimoramentos para operadores com estado integrados e novos no Apache Spark Structured Streaming. Estamos animados com as melhorias no gerenciamento de estado no Apache Spark™ Structured Streaming nos últimos anos e aguardamos os desenvolvimentos planejados para o roadmap nesta área no futuro próximo.
Você pode ler mais sobre processamento de fluxo com estado e transformWithState no Databricks aqui.
(This blog post has been translated using AI-powered tools) Original Post