A demanda pelo Apache Flink está aumentando. Aprender Flink pode ser o trampolim para o avanço na carreira que você procura, mas você está pronto?
As APIs do Flink são mais fáceis de entender se você apreciar os problemas que seus designers estavam tentando resolver, que giram em torno do gerenciamento de estado para aplicativos de streaming de uma forma que seja de alto desempenho, tolerante a falhas e escalonável. Se você é um desenvolvedor experiente com ampla experiência, talvez possa simplesmente começar e descobrir as coisas à medida que avança. No entanto, o sucesso de uma estratégia de “pular no fundo do poço e afundar ou nadar” irá variar dependendo do seu histórico.
O que é Flink?
De acordo com o site do projeto Apache Flink:
“Apache Flink é uma estrutura e mecanismo de processamento distribuído para cálculos com estado em fluxos de dados ilimitados e limitados.”
O processamento de fluxo é uma forma natural de construir software que reaja ao fluxo de eventos subjacentes aos negócios modernos, como eventos que fornecem informações sobre pedidos, remessas ou pagamentos. Quando o Flink opera em modo de streaming, cada evento é processado imediatamente em vez de ser adicionado a um lote para processamento posterior. Isso permite que as empresas reajam imediatamente aos eventos recebidos.
No entanto, o Flink não se limita a fazer processamento de stream. Ele trata o processamento em lote como um caso especial de streaming em que os fluxos são “limitados”. A capacidade do Flink de cobrir casos de uso em lote e streaming com a mesma estrutura pode ser muito útil.
O Flink não pode controlar a taxa de chegada e a ordem dos dados de streaming recebidos e deve estar preparado para lidar com tudo o que as fontes de dados fornecem. Isto contrasta fortemente com o processamento em lote, onde os fluxos limitados a serem processados estão totalmente disponíveis antes do início do processamento. Esse modelo de execução de um evento por vez é altamente vantajoso para alguns casos de uso, mas apresenta desafios. Muitos desses desafios decorrem do fato de que a estrutura do Flink e seus aplicativos Flink devem estar sempre em execução. As interrupções devem ser minimizadas para disponibilizar os serviços fornecidos pelo Flink.
A recuperação rápida de falhas seria mais simples se os aplicativos Flink fossem sempre sem estado, mas isso seria muito restritivo. Embora alguns aplicativos simples não precisem armazenar nada relacionado a eventos passados, o estado é necessário para muitos casos de uso, como aplicativos que calculam estatísticas resumidas (por exemplo, contagem de eventos ou taxas de computação, como eventos por segundo) ou que procuram tendências nos dados. A detecção de fraudes e a detecção de anomalias são bons exemplos de aplicações que precisam processar eventos recebidos em um contexto estabelecido por eventos anteriores.
A função do Flink é processar fluxos de dados, não armazená-los. Um aplicativo Flink típico consome fluxos de dados de um serviço de armazenamento de fluxo escalável, como o Apache Kafka, e publica os resultados onde quer que sejam necessários. Os aplicativos Flink são executados em um cluster distribuído, com um Job Manager supervisionando o trabalho e um ou mais Task Managers executando o código do aplicativo.
A arquitetura de cluster do Flink foi projetada para permitir que cada máquina opere da forma mais independente possível. Sempre que a coordenação ou a sincronização são necessárias em um sistema de computação distribuído, isso introduz gargalos que prejudicarão o desempenho.
Como pode ser difícil adaptar-se ao forte desacoplamento do Flink, pode ser tentador tentar contorná-lo criando um backdoor para compartilhar o estado entre os componentes. Não faça isso. É provável que você introduza bugs sutis que aparecerão apenas ocasionalmente e serão muito difíceis de diagnosticar. Em vez disso, aprenda como compor soluções que sigam a filosofia de design da Flink.
Recursos
Escrevendo aplicativos Flink
Ao escrever um aplicativo Flink, você está implementando uma série de etapas em um pipeline de processamento de dados. Os eventos passam por esse pipeline e são transformados, filtrados, combinados e enriquecidos em cada etapa. As implantações típicas terão muitas instâncias do pipeline de processamento operando em paralelo, cada uma manipulando algum subconjunto de dados. Você pode estar se perguntando: “Quantas instâncias paralelas?” Qualquer coisa entre um punhado e algumas centenas de casos é comum. Algumas implantações grandes do Flink abrangem milhares de nós de computação e podem lidar com cargas de trabalho medidas em bilhões de eventos por segundo. Mas não se preocupe, todo mundo tem que começar de algum lugar e não há problema em começar aos poucos.
Flink tem algumas APIs diferentes. Na maioria dos casos, o melhor lugar para começar é com o Flink SQL ou a API Table. Essas APIs são mais ou menos igualmente poderosas; a diferença depende de você expressar sua lógica de processamento de fluxo como instruções SQL ou como programas escritos em Java ou Python. De qualquer forma, você precisará entender os conceitos da álgebra relacional do SQL — projeções, filtros, junções e agregações — pois eles formam a base de ambas as APIs.
Linguagens de programação
Flink oferece suporte a SQL, Java e Python. Não é necessário ter profundo conhecimento em nenhum desses idiomas antes de começar, mas é útil manter estas considerações em mente:
SQL: No mínimo, você deve entender SELECT, WHERE, JOIN e GROUP BY.
Java: Você vai querer ter um bom conhecimento da linguagem Java e de seu ecossistema. Também é possível usar outra linguagem JVM, como Scala ou Kotlin, para desenvolver aplicativos Flink usando APIs Java do Flink.
Pitão: A API PyFlink Table facilita a introdução ao Flink usando Python.
Recursos
Ferramentas de desenvolvimento Java
Ao trabalhar em Java, você precisará usar uma ferramenta de construção como Maven ou Gradle para configurar e gerenciar seus projetos Flink e suas dependências. Ambas as ferramentas de construção são populares na comunidade Flink e você encontrará guias de início rápido na documentação do Flink. Se você está se perguntando qual escolher, o Flink foi desenvolvido usando Maven e você encontrará muitos exemplos que o utilizam. Gradle parece uma abordagem mais moderna e poderosa, mas a curva de aprendizado é mais acentuada.
Se você nunca trabalhou com uma linguagem de programação fortemente tipada (como Java) antes, talvez não aprecie o valor que um IDE como IntelliJ ou Visual Studio Code pode fornecer. Se você não sabe por onde começar, a Community Edition do IntelliJ IDEA é gratuita, tem boa documentação e é amplamente usada na comunidade Flink, então você terá facilidade para obter respostas para qualquer dúvida que possa ter.
Streaming de dados: conectores, formatos, esquemas e governança
Para entrar e sair dados do Flink, você precisa conectar seus aplicativos Flink aos sistemas e serviços que sua organização usa para produzir e consumir dados. Alguns sistemas, como o Apache Kafka, produzem e consomem fluxos de dados naturalmente e são ideais para uso como solução de armazenamento de fluxo para aplicativos Flink.
Os processos de dados do Flink serão codificados em um formato como CSV, JSON, Avro ou Protobuf. Idealmente, os campos de dados e seus tipos serão descritos com esquemas que possam verificar se todos os dados são válidos. À medida que seus aplicativos evoluem, você precisará fazer alterações nesses esquemas de dados adicionando e removendo campos e alterando seus tipos, portanto, você desejará escolher um formato que suporte a evolução do esquema.
Avro e Protobuf são boas escolhas, já que as APIs SQL e Table do Flink têm suporte integrado para esses formatos e ambas suportam a evolução do esquema. Por outro lado, embora CSV e JSON possam ser convenientes para alguns casos de uso, o Flink atualmente não fornece suporte para definir ou impor esquemas para esses formatos.
Recursos
Bancos de dados e streaming
Muitas organizações possuem dados em bancos de dados transacionais que desejam processar com o Flink. Isso pode envolver a transferência de dados para um data lake, o armazenamento de recursos em um feature store para aprendizado de máquina ou o enriquecimento de dados de streaming com dados de referência armazenados no banco de dados.
Uma maneira de transmitir dados de um banco de dados para o Flink é usar o Kafka Connect com o conector JDBC Source para primeiro colocar os dados no Kafka e depois transmiti-los para o Flink. Outra técnica poderosa é conectar o Flink ao fluxo Change Data Capture do seu banco de dados usando Debezium.
Evitando pegadinhas
Antes de colocar seu primeiro aplicativo Flink em produção, leia a lista de verificação de preparação para produção na documentação. Isso o ajudará a evitar alguns dos erros mais comuns.
A equipe de engenharia da Lyft publicou uma série de artigos sobre as pegadinhas do processamento de stream. O primeiro artigo, que aborda a assimetria dos dados, é um bom ponto de partida. A distorção de dados ocorre quando mensagens sobre algumas entidades — por exemplo, usuários, produtos ou dispositivos — dominam o tráfego do evento. Este é um problema que afeta a eficiência e o rendimento de muitas aplicações Flink.
Implantando e solucionando problemas do Flink
Flink é complexo para operar em escala. Para a maioria das organizações, recomendo usar um serviço gerenciado baseado em nuvem, em vez de tentar fazer isso sozinho. Porém, se você preferir fazer isso sozinho, dê uma olhada no Operador Flink Kubernetes. Para uma introdução às métricas, monitoramento e alertas, Monitoring Apache Flink Applications 101 é um bom ponto de partida.
Flink depende marcas d’água para saber quando dados de streaming suficientes foram processados antes de acionar uma ação. A falha na configuração correta da marca d’água pode fazer com que os aplicativos de streaming não produzam nenhum resultado ou ignorem algumas de suas entradas. Um bom recurso para aprender sobre marcas d’água é Event Time and Watermarks, que o ajudará a evitar uma experiência frustrante de depuração.
O Flink nem sempre pode impedir que você escreva aplicativos que se comportarão mal e funcionarão mal, mas com experiência, é mais fácil antecipar e prevenir esses problemas. Comece aprendendo quais operações exigem a manutenção do estado e aproximadamente quanto estado está envolvido. Consulte Stateful Stream Processing com Flink SQL para obter uma introdução a este tópico.
A contrapressão é um problema comum em aplicativos de streaming. Isso ocorre quando um estágio do pipeline de processamento produz dados mais rápido do que os estágios downstream podem consumi-los. A documentação do Flink descreve como monitorar a contrapressão, o que o ajudará a identificar a causa.
Quando os aplicativos Flink apresentam baixo desempenho, geralmente isso é causado por serialização ineficiente. Se você seguir as APIs SQL e Table do Flink, isso não deverá ser um problema. No entanto, se você tiver problemas de desempenho, poderá usar os Flame Graphs integrados do Flink para diagnosticá-los.
Conclusão
Aprender Apache Flink pode ser muito gratificante. A estrutura é poderosa e pode ser usada para uma ampla variedade de casos de uso em lote e streaming. Compreender como o Flink funciona também apresentará uma nova maneira de pensar sobre como construir sistemas de computação, que parecerá que você ganhou um novo superpoder.
Quando você sentir que está pronto para mergulhar no Flink, o Apache Flink 101 é um ótimo lugar para começar.
YOUTUBE.COM/THENEWSTACK
A tecnologia avança rápido, não perca um episódio. Inscreva-se em nosso canal no YouTube para transmitir todos os nossos podcasts, entrevistas, demonstrações e muito mais.
SE INSCREVER
David Anderson é líder de prática de software na equipe de Developer Experience (DevX) da Confluent. Comprometidor e instrutor do Apache Flink, ele ajudou inúmeras empresas a adotar o processamento de stream. Antes de descobrir o Flink em 2016, ele trabalhou como engenheiro de dados,…
Este site utiliza cookies para melhorar sua experiência de navegação. Ao continuar, você concorda com o uso de cookies. Para mais informações, consulte nossa Política de Privacidade.
Funcional
Sempre ativo
O armazenamento ou acesso técnico é estritamente necessário para a finalidade legítima de permitir a utilização de um serviço específico explicitamente solicitado pelo assinante ou utilizador, ou com a finalidade exclusiva de efetuar a transmissão de uma comunicação através de uma rede de comunicações eletrónicas.
Preferências
O armazenamento ou acesso técnico é necessário para o propósito legítimo de armazenar preferências que não são solicitadas pelo assinante ou usuário.
Estatísticas
O armazenamento ou acesso técnico que é usado exclusivamente para fins estatísticos.O armazenamento técnico ou acesso que é usado exclusivamente para fins estatísticos anônimos. Sem uma intimação, conformidade voluntária por parte de seu provedor de serviços de Internet ou registros adicionais de terceiros, as informações armazenadas ou recuperadas apenas para esse fim geralmente não podem ser usadas para identificá-lo.
Marketing
O armazenamento ou acesso técnico é necessário para criar perfis de usuário para enviar publicidade ou para rastrear o usuário em um site ou em vários sites para fins de marketing semelhantes.