Em uma bela manhã de mais um dia de trabalho acontece o (nem tão) inesperado. Um ticket é aberto solicitando que um dashboard seja atualizado, pois o cliente tem uma reunião de apresentação de resultados às 10h. Sua primeira ação é checar se o pipeline apresentou erros em alguma etapa, mas não há erros. Existe um bom dia melhor do que esse? Eu acredito que não (contém muita ironia).
Este é um dos piores pesadelos para profissionais da área de dados. Como investigar esse erro? Há erro algum? Devo olhar os logs? Por onde começar?
O objetivo deste artigo é compartilhar algumas formas de depurar possíveis erros em pipelines de dados. Lembrando que esses são passos que eu sigo no meu dia a dia e que melhor me atende.
Primeiramente, vamos recapitular o que são pipelines de dados: são processos por onde os dados passam desde a sua origem até a disponibilização para o cliente. Dentro do pipeline existem diversos pontos importantes, como o horário de agendamento da ingestão, transformação dos dados ingeridos, forma de ingestão destes dados, gatilho que executa todo esse processo, entre outros.
Abaixo, deixo um exemplo de um simples pipeline de dados:
É importante lembrar que não existe uma forma única de se criar um pipeline de dados, pois diferentes empresas possuem demandas e necessidades diversas para diferentes tipos de arquitetura de dados. Dessa forma, os pontos tratados aqui serão os mais abrangentes possíveis.
Depurando um pipeline de dados
Antes de começar a depurar um pipeline de dados, é muito importante entender como é a arquitetura de dados da empresa. Isso inclui entender fatores como: as fontes de ingestão dos dados, formatos dos dados, esquemas, transformações, forma de atualização dos dados (incremental ou carga completa), agendamentos dos pipeline e gatilhos.
Assumindo que possuímos uma noção clara da arquitetura, podemos partir para os próximos passos — considerando o nosso exemplo inicial de inconsistência de dados em um dashboard:
Primeiro passo
Verificar se existe algum filtro aplicado diretamente no dashboard que possa estar impedindo a apresentação dos dados.
Segundo passo
Verificar as queries que são usadas no dashboard. Todos os gráficos do dashboard apresentam inconsistência? Anote todas as tabelas que são utilizadas nas queries. Pegue um ID de referência para verificar as informações dele em todas as tabelas.
Terceiro passo
Utilizando o mesmo ID que selecionamos, verifique se ele apresenta todas as devidas informações em cada uma das tabelas utilizada na query.
Se sim, o problema pode estar na própria query, recomendo que verifique CTE por CTE até entender em qual momento os dados deixam de apresentar todas as devidas informações — sempre verifique os joins e as chaves utilizadas nos joins.
Quarto passo
Se o ID não apresentar todas as devidas informações nas tabelas utilizadas na query, recomenda-se verificar se o dado existe na primeira camada da ingestão (também conhecida como camada RAW), ou mesmo no banco de produção.
O dado existe na camada RAW? Então verifique a transformação que está sendo aplicada na tabela que contém as informações desses dados. Como é feita a atualização desta tabela, é atualizada de forma incremental? Ou ela é carregada completamente todos os dias? Possui alguma cláusula WHERE filtrando dados?
Quinto passo
Se o dado não existir no banco de produção, recomenda-se entender com o time responsável por aquele banco de dados sobre a forma que os dados dele são atualizados. Há DELETE no banco? Se houver, vale a pena tentar entender como você poderia aplicar isso na atualização da tabela que consome dados deste banco, pois isso impacta diretamente as análises de seu cliente.
Sexto passo
Esse passo nem sempre fica tão evidente, mas vale sempre checar como está a saúde do sistema que executa os processos: checar memória no processamento, uso de disco, latência de escrita e leitura, entre outros.
Outros pontos que são relevantes na análise de uma inconsistência de dados: a atualização das tabelas segue a ordem de dependência entre elas? A coluna de data e hora utilizada para fazer a atualização incremental da tabela é a coluna ideal para esta tabela? Existe algum teste para verificar se não há dados duplicados? Além disso, sempre tente reproduzir o erro, pois é a partir daí que você entenderá onde está o bug a ser corrigido.
É importante ressaltar que você também pode pedir ajuda, seja para uma pessoa especialista, o time responsável pelo desenvolvimento de alguma feature ou mesmo pela pessoa vendedora de alguma plataforma que a sua empresa utilize. Além disso, sempre tente escrever um postmortem depois de o incidente ter sido resolvido.
Conclusão
Sim, existem múltiplos cenários para tentar depurar um pipeline de dados. Chega a ser um pouco cansativa e complexa toda essa investigação, né?
E quais medidas são possíveis implementar para evitar ter que percorrer por todos esses passos? Algumas formas:
- Implementar testes de qualidade de dados: permitem entender se temos chaves duplicadas na tabela; se os dados estão nas tipagens esperadas; se há valores nulos; entender a volumetria de dados gerada em uma tabela;
- Criar alertas em diferentes etapas do pipeline de dados: tanto na parte de infraestrutura quanto na parte de transformação dos dados, dessa forma, será mais fácil identificar em qual etapa do pipeline ocorreu o erro;
- Gerenciamento do pipeline: é muito interessante utilizar alguma ferramenta de gerenciamento de pipeline de dados como, por exemplo, o Apache Airflow, o que torna mais fácil o rastreio de erros em cada etapa do pipeline;
- Implementar logs em todas as etapas do pipeline.
Existem diversas formas de melhorar o monitoramento de pipelines de dados, mas esse é um tema para outro momento.
Como pode-se perceber, há diversos passos possíveis a serem revisitados caso você tenha que depurar um pipeline de dados. Espero que eu tenha conseguido ser clara em minhas explicações e contribua um pouco mais no assunto. Até mais!
Artigo escrito por Camila Marques, da Comunidade PrograMaria.
REFERÊNCIAS:
https://cloud.google.com/dataflow/docs/guides/troubleshooting-your-pipeline?hl=pt-br