Escrito por Rafael Kehl,
5 minutos de leitura
Usando Airflow e dbt para encontrar os melhores e piores episódios da sua série favorita
Vamos juntos montar um processo de ELT do início ao fim com Docker, Airflow, Postgres e dbt usando os datasets não comerciais do IMDb!
Recentemente, com o sucesso avassalador de One Piece: A Série, eu finalmente me rendi e decidi começar a assistir o anime de One Piece. Não demorou muito para que eu estivesse fisgado e empolgado para saber quais seriam os próximos passos do bando do chapéu de palha! Porém, com a imensa quantidade de episódios pela frente, eu me perguntei: quais são os episódios com melhor avaliação? E os com pior avaliação?
Certamente, essas informações são encontradas facilmente na internet, mas simplesmente fazer essa pesquisa não teria a menor graça! Resolvi, então, construir um projeto de ELT com Airflow orquestrando e dbt transformando dados do IMDb para responder minhas perguntas não só para One Piece, mas para todas as séries disponíveis nos datasets não comerciais do IMDb!
Antes de começar
Se você quiser acompanhar meus passos, o projeto completo com todas as instruções de instalação e execução está disponível no GitHub, no repositório de cases da ilegra. Você pode baixar este e outros projetos manualmente ou usando o git, com o comando:
git clone https://github.com/ilegra-user/ilegra-datasolutions-cases.git
Com o repositório na sua máquina, navegue para a subpasta airflow-dbt-imdb-elt, que é a raiz deste projeto.
O único requisito para executar o projeto é o Docker, que usamos para isolar a aplicação inteira em um contêiner, simplificando a instalação e configuração do ambiente. As instruções de instalação do Docker podem ser encontradas diretamente no site ou no README do projeto.
No contêiner do projeto temos tudo que é necessário para executar o Airflow, uma ferramenta poderosa de orquestração que nos permite automatizar, agendar e monitorar fluxos de trabalho. Tudo isso apenas usando o Python! Também temos o dbt, uma ferramenta que, de forma resumida, nos permite transformar e testar nossos dados com scripts modulares, além de possibilitar a geração de uma documentação completa do modelo em uma página web estática.
Iniciando nossa jornada
Nosso ponto de partida será a imagem Docker oficial do Airflow 2.2.2, pois essa é uma das versões mais populares do Airflow, segundo uma pesquisa de 2022, além de ser uma das versões suportadas pelo MWAA, o Apache Airflow nos fluxos de trabalho gerenciados da Amazon Web Services.
As únicas modificações que faremos no contêiner serão: a adição do dbt-postgres==1.2.0 como requisito de instalação do Airflow e a adição de uma imagem do pgAdmin, para que possamos acessar nossos dados de maneira mais simples, sem precisar de nenhuma configuração adicional ou programa externo. O resultado final é o arquivo docker-compose.yml do nosso projeto! Com isso, estamos prontos para colocar nosso contêiner no ar, executando o comando abaixo na pasta raiz do projeto, a airflow-dbt-imdb-elt:
docker compose -p imdb_ratings up -d
O Docker vai fazer o download e execução das imagens e comandos contidos no nosso contêiner. Assim que estiver tudo pronto podemos acessar a interface do Airflow diretamente do nosso navegador, no endereço localhost:8080.
Extraindo e carregando
Como dito anteriormente, nosso objetivo é a construção de um ELT, onde extraímos, carregamos e aí transformamos os dados, o que é diferente de um ETL, onde os dados são transformados antes de serem carregados.
Essa diferença é importantíssima, pois o Airflow é uma ferramenta de orquestração e, portanto, não deve realizar nenhuma tarefa de computação. Além disso, o dbt realiza a transformação dos dados ao executar scripts diretamente no banco de dados, logo, nossos dados devem estar carregados para que possam ser transformados.
Nosso primeiro passo, então, é realizar a extração e carregamento dos dados. Para isso, acesse a UI do Airflow e faça o login usando airflow como usuário e senha. Após, selecione o DAG extract_and_load_datasets.
Para executar o DAG precisamos clicar no botão de play. Se quiser, você pode explorar as opções da execução com configuração, onde temos a opção de sobrescrever os datasets já extraídos anteriormente, já que o IMDb os atualiza diariamente. Eu encorajo você a explorar o código do DAG, bem como os logs de execução de cada uma das tarefas para entender melhor o que aconteceu durante a execução do DAG.
Com isso, você pode acessar a UI do pgAdmin no endereço localhost:8888, fazendo login com o email admin@admin.com e senha admin, para ver o schema raw_imdb e suas três tabelas, uma para cada dataset extraído. A senha para acessar o banco de dados é airflow.
Finalmente, transformando!
Com os dados crus já carregados no banco, podemos executar o nosso modelo dbt usando o DAG run_imdb_ratings_bash, onde usaremos o BashOperator do Airflow para executar o modelo, testar os dados e gerar a documentação do nosso projeto. Aperte o botão de play e veja a mágica acontecer!
Novamente, encorajo você a explorar o código do DAG e os logs das tarefas, em especial da tarefa de testes. Em resumo, neste DAG executamos três comandos:
- dbt run: compila e executa os scripts do modelo no banco de dados alvo, como definido nos arquivos dbt_project.yml e profiles.yml;
- dbt test: executa os testes definidos para cada um dos objetos criados pelo modelo, sejam eles testes genéricos ou customizados. Vale a pena conferir a documentação deste comando para aprender mais!
- dbt docs generate: compila o modelo e gera uma página web estática com a documentação do projeto. Para visualizá-la precisamos executar o comando dbt docs serve;
Esse DAG é bem simples e foi criado baseado em um exemplo provido pela AWS de uso do dbt no ambiente do MWAA, mas existem muitas outras formas de integrar Airflow e dbt, cada uma com suas vantagens e desvantagens. A implementação ideal vai depender do seu contexto.
Visualizando nosso modelo
Apesar do nosso DAG ter feito a geração da documentação, acontecerá um erro se você tentar acessar a página web diretamente de dentro da pasta target do projeto, impossibilitando sua visualização correta.
Para visualizar a página corretamente, você precisa ter instalado na sua máquina o Python 3.7 ou superior e o dbt 1.2.0, que pode ser instalado com o comando:
pip install dbt-postgres==1.2.0
Se você cumpre ambos os requisitos acima, basta executar os seguintes comandos para que a documentação se torne acessível em localhost:8001!
cd ./dbt/imdb_ratings
dbt docs serve –port 8001 –profiles-dir .
Mas e aí, quais são os episódios?
Finalmente, para responder a pergunta que nos motivou partir nessa jornada, basta acessar a interface do pgAdmin, conectar no banco de dados do projeto, selecionar o database airflow e pressionar Alt+Shift+Q para abrir a ferramenta de consulta. Agora podemos usar SQL para consultar os dados transformados e obter as respostas para nossas perguntas!
Observe que agora temos os schemas imdb_ratings e imdb_ratings_stg, que contém os objetos gerados pelo nosso modelo dbt. Para não perder o costume, encorajo você a explorar os objetos criados e comparar com os arquivos e configurações do modelo dbt para aprender mais sobre o funcionamento dessa ferramenta.
Caso esteja com pressa e queira pular direto pra ação, você pode usar o código abaixo para encontrar os melhores episódios da sua série favorita:
select
seriestitle,
episodetitle,
seasonnumber,
episodenumber,
averagerating
from imdb_ratings.dim_best_episodes_by_series
where series_code = ‘<CODIGO_DA_SERIE>‘
Substitua <CODIGO_DA_SERIE> pelo código da série que você quer e aperte F5 para ver o resultado! Além disso, se quiser saber quais são os piores episódios, basta consultar a tabela dim_worst_episodes_by_series. O código da série é encontrado no endereço URL da sua página no IMDb. Por exemplo, o endereço URL da página do anime de One Piece é dado por www.imdb.com/title/tt0388629/, logo seu código é tt0388629.
Experimente ajustar e modificar a consulta para descobrir mais sobre suas séries favoritas. Aproveite, também, para conferir os resultados de algumas das séries mais famosas da atualidade, como Game of Thrones, tt0944947, The Office, tt0386676, e Breaking Bad, tt0903747!
Chegamos ao nosso destino!
Espero que tenham se divertido e aprendido um pouco mais sobre Airflow e dbt durante nossa jornada. Este é só um pequeno exemplo do que pode ser feito com a junção dessas duas poderosas ferramentas, ainda mais se aliadas à serviços em nuvem, como a dbt Cloud!
Por fim, gostaria de salientar que o dbt ajuda a aliviar ou sanar algumas dores comuns de Engenheiros e Analistas de Dados, como a documentação, testagem e linhagem dos dados. Apesar de ser necessária uma curva de aprendizado inicial, os benefícios da automação dos pontos citados acima são muito maiores que o esforço para aprender a usar essa ferramenta, que é até intuitiva para quem já usa SQL no seu dia a dia.