O alto volume, as diferentes fontes e a necessidade de transformação de dados, constitui um cenário complexo para geração de informação útil para os usuários e organizações. E é nisso o que o APache Airflow trabalha.
Criar, manter e monitorar fluxos de trabalhos, garantindo a correta execução das tarefas de processamento de informações, e um desafio para as empresas e times de desenvolvimento como um todo, principalmente nas arquiteturas de sistemas atuais que são distribuídos com ou sem a utilização de Micro serviços.
Nesse contexto, o Apache Airflow oferece uma infraestrutura pronta para criação e gerenciamento de fluxos de trabalho complexos.
Este artigo tem como objetivo apresentar de forma rápida como funciona a plataforma através da implementação de modelos baseados em grafos do tipo DAG.
Fluxos de trabalho com Apache Airflow
Fluxos de trabalho são mais comuns do que se imagina em aplicações corporativas. Muitas atividades das organizações modernas se baseiam em um conjunto de processamentos de informações que podem estar restritos a um único sistema, ou na maioria dos casos, estar distribuído por varias aplicações, plataformas, linguagens, tecnologias e fontes de dados diferentes.
Considerando para fins de estudo neste artigo, uma aplicação corporativa ”X”, simplesmente denominada de CIA (Central de Integração Avançada), que diariamente necessita capturar, processar e disponibilizar informações para os seus usuários.
De forma resumida, essa tarefa parece ser simples, mas expandindo a visão um pouco mais, pode-se perceber um nível mais granular de etapas a serem cumpridas com o Apache Airflow, sendo: (1) capturar dados de um Webservice; (2) converter os dados para um formato estruturado; (3) transformar os dados em informações úteis para o contexto; (4) aplicar lógica de negócios; (5) validar as regras de negócios; (6) gerar novas informações; (7) armazenar as informações processadas; (8) enviar as informações por e-mail;
(9) disponibilizar as informações para os sistemas de inteligência de negócios (Business Intelligence – BI), dentre outros destinatários; e (10) notificar a equipe que o fluxo concluiu com sucesso.
Se expandirmos a visão para cada etapa citada, iremos perceber um nível maior de pequenas atividades dentro de cada etapa principal. Analisando o fluxo acima percebe-se que e necessário executar varias etapas ou atividades para colocar a informação a disposição do usuário.
Partindo do pressuposto que esta solução de software pode estar baseada em uma arquitetura de Micro serviços, onde cada etapa a ser cumprida pode estar em uma aplicação diferente, em locais distribuídos, utilizando tecnologias e/ou linguagens de programação diferentes, pois cada etapa pode possuir uma natureza distinta que exige soluções diferentes para se obter um melhor resultado, e fácil perceber o alto nível de complexidade requerido para executar todo o fluxo de trabalho de forma eficaz e eficiente.
Ser eficaz nesse tema se refere ao fato de disponibilizar a informação correta, enquanto ser eficiente se refere ao fato de disponibilizar a informação no tempo exigido pelo usuário.
Controlar esses fluxos de trabalhos e garantir que todas as rotinas necessárias para cumprir determinada tarefa ou etapa sejam executadas com sucesso e uma tarefa complexa e desafiadora, que exige um esforço de arquitetura e programação que pode extrapolar os limites de conhecimento, tempo e custos de uma empresa.
Nesse contexto, a Teoria dos Grafos pode fornecer um modelo de conjuntos denominado de DAG (Directed Acyclic Graph ou Grafo Acíclico Direcionado), formado por seus elementos e suas relações, fornecendo uma alternativa para criação, organização e visualização de fluxos de trabalho. “Esse modelo proporciona uma visão clara das etapas” a serem cumpridas e permitem aos desenvolvedores a criação de estratégias para lhe dar com a complexidade da orquestração destes elementos.
Dessa forma, este artigo tem como objetivo apresentar a solução de software Apache Airflow, como alternativa para gerenciar fluxos de trabalho complexos, através da implementação de grafos do tipo DAG.
Metodologia de Grafos do tipo DAG
Grafos
Um Grafo pode ser entendido como um conjunto de ele mentos ou nos, denominados Vértices ”V” que são unidos por Arestas ”A” (ver figura 1). Logo um grafo pode ser representado pela notação G(V, A).
A Teoria dos Grafos e um ramo da matemática que estuda as relações entre estes objetos. Dependendo do caso, as arestas podem ou não ter uma ˜ direção definida. Uma aresta pode ligar um vértice a ele próprio ou não.
Caso uma aresta tenha uma direção, representado graficamente por uma seta, este indica que grafo é do tipo direcionado ou orientando, podendo ser chamado ainda de Dígrafo. As arestas podem ainda ter um peso numérico associado a elas.
Grafos acíclico direcionado
Um grafo acíclico direcionado ou simplesmente DAG, e um grafo dirigido sem ciclo, ou seja, para qualquer um dos vértices do grafo, jamais haver a uma ligação dirigida que inicie e termine no mesmo vértice, por isso a denominação, acíclica ou sem ciclo.
Esse tipo de grafo e utilizado em um contexto onde não faz sentindo que um elemento tenha uma ligação com si próprio ou onde não possa haver ciclos. Um bom exemplo para este caso e a arvore de dependências ou bibliotecas dos sistemas operacionais com base no Unix, como e o caso do Ubuntu e Debian.
Ao instalar uma determinada biblioteca, o sistema automaticamente instala todas as dependências necessárias para o seu funcionamento.
Observando a figura 3 percebe-se que a biblioteca ”A” depende da biblioteca ”B”, e esta por sua vez, depende da biblioteca ”C” que depende de ”A”. Se for solicitado ao sistema operacional a instalação da biblioteca ˜ ”A”, possivelmente ocorrera um ´ loop infinito, pois ao instalar a biblioteca ”C”, a biblioteca ”A” seria instalada novamente reiniciando o fluxo de trabalho.
Um modelo de elementos baseado em DAG garante que nunca exista um caminho que saia de um determinado vértice e chegue nele mesmo, conforme mostra a figura 2. ´ O modelo fornecido por um DAG encaixa perfeitamente no cenário de fluxos de trabalhos de sistemas de informatização que necessitam executar etapas com uma direção única dentro de uma mesma instancia do processo, garantindo que o fluxo tenha um inicio, meio e fim, mesmo que haja caminhos alternativos a serem seguidos, além do fluxo principal.
Apache Airflow
Em tempos que a demanda por informação é muito grande, varias são as fontes de dados e diversas arquiteturas que os desenvolvedores necessitam trabalhar. Muitas vezes os dados estão distribuídos em banco de dados, arquivos (csv, txt, logs), API’s de terceiros, dentre outros.
A resposta para esse problema e a consolidação dos dados e dos fluxos de trabalho, e para que isso possa ocorrer e de fundamental importância um ”orquestrador”, pois em muitos casos algumas informações devem ser processadas primeiro que outras, seguindo uma sequencia lógica, para só assim no final, obter-se uma consolidação correta de informações para atingir o que se espera.
Nesse cenário de coordenar fluxos de trabalhos surge o Airflow que e uma ferramenta de código aberto para controlar fluxos de trabalho computacionais complexos, com poder de interagir com os dados entre varias etapas do processo.
O projeto teve inicio em outubro de 2014, sendo criado por Maxime Beachemin no Airbnb e servia para controle de fluxo de trabalho interno. Em junho de 2015 teve seu código aberto sob o Github da Airbnb e desde março de 2016 e mantido pela fundação˜ Apache.
A plataforma Airflow e uma ferramenta que descreve, executa e monitora fluxos de trabalho, por meio da criação de um Grafo Acíclico Direcionado (DAG) que mantém as tarefas organizadas de tal maneira que não existam quebras de seus relacionamentos e dependências.
Um fluxo de trabalho em Airflow e representado como um DAG que pode conter diversas tarefas independentes. Pode ainda possuir restrições de caráter temporal ou que necessite garantir que alguma tarefa anterior tenha sido executada corretamente.
Nesse sentido, temos um exemplo bem claro na própria documentação do “Airflow quando cita que: ”Um DAG simples pode consistir em três tarefas: A, B e C. Pode-se dizer que A precisa ser executado com êxito antes que B possa ser executado, mas C pode ser executado a qualquer momento.
Pode se dizer que a tarefa A expira após 5 minutos e B pode ser reiniciada ate 5 vezes no caso de falha. Pode também dizer que o fluxo de trabalho será executado todas as noites as 22h, mas não deve começar ate uma determinada data.”
A forma do grafo representa a funcionalidade geral do fluxo de trabalho, que pode conter varias ramificações, identificadas como tarefas ou etapas. O modelo pode definir se todas as tarefas serão executadas ou se alguma será ignorada, podendo inclusive definir qual tarefa ignorar em tempo de execução.
Instalando e Configurando o Airflow
O Airflow é desenvolvido em Python, por tanto, os arquivos de configuração e definição das DAG’s também são escritos em Python. A instalação e configuração do Airflow pode ser realizado seguindo alguns poucos passos.
O Airflow pode ser executado com Python versão 2.7 ou versão 3.6, sendo esta ultima a mais recomendada. Para instalar as seguintes etapas devem ser cumpridas, sendo:
- Configurar variável de ambiente para a pasta home do Airflow, que ira armazenar o banco de dados, arquivos de configurações e fluxos (DAG’s):
$ export AIRFLOW_HOME=˜/airflow
- Caso necessário, pode-se criar um novo ambiente virtual para o Python e suas dependências:
$ pip install virtualenv
$ virtualenv airflow
$ cd airflow/bin
$ source activate
- Instalar o Airflow:
$ pip install airflow
- Inicializar o banco de dados do Airflow:
$ python airflow initdb
- Iniciar o servidor do Airflow:
$ python airflow webserver -p 8080
- Para verificar se o Airflow esta executando corretamente, basta acessar o endereço via navegador: http://localhost:8080
Para utilização em ambiente de testes o Airflow cria uma base de dados local do tipo SQLite. Para utilização do Airflow em ambientes de produção recomenda-se a utilização de outros bancos de dados como PostgreSQL ou MySQL.
O banco de dados padrão vem populado com alguns exemplos de DAG’s que podem ser uteis para aprendizado sobre o funcionamento da plataforma.
Criando DAGs
A criação de novas DAGs segue um processo simplificado. Basta escrever um script Python e armazena-lo na pasta airflow_home/dags. Abaixo e apresentado um exemplo simplificado de um script Python que implementa uma DAG para o fluxo de trabalho citado no inıcio do artigo. O exemplo completo pode ser visualizado diretamente no repositório do GitHub:
from datetime import datetime
from airflow import DAG from airflow.operators.dummy_operator \ import DummyOperator
from airflow.operators import BashOperator dag = DAG(
‘carga_diaria_faturamento’, description=’Carga Diária de Faturamento’, schedule_interval=’0 12 * * *’, start_date=datetime(2017, 3, 20), catchup=False
)
capturar_webservice = DummyOperator( task_id=’tarefa_capturar_webservice’, retries=3, dag=dag
)
…
/
Conclusões
Como pode-se observar, o Airflow oferece uma infraestrutura pronta para criação e gerenciamento de fluxos de ˜ trabalho complexos através da implementação de modelos ˜ baseados em grafos do tipo DAG.
A combinação de DAG’s, operadores e instancias, permite a criação e gerenciamento de fluxos de trabalho complexos, facilitando a vida dos desenvolvedores que não precisam empregar esforço para criar tal infraestrutura.
O Airflow fornece: (1) ponto central de programação de fluxos; (2) flexibilidade na integração de diferentes tarefas; (3) possibilidade de distribuir e escalar a si próprio; (4) comunidade de código aberto que permite colaboração e evolução rápida da ferramenta.
A solução pode ser utilizada em ambientes de softwares corporativos, com dados centralizados ou distribuídos, arquiteturas baseadas em micro serviços, ou sis temas monolíticos que necessitam garantir que os fluxos de trabalho sejam executados de maneira eficaz (de forma correta) e eficiente (no tempo necessário).
A utilização da linguagem Python pode fornecer um ponto positivo para o desenvolvimento, pois simplifica e remove algumas barreiras relacionado a sintaxe durante a escrita do código, proporcionando mais rapidez na configuração dos fluxos.
Por fim, com Airflow e possível remover a complexidade de fluxos baseados em diversos scripts e componentes produzidos em diferentes linguagens, centralizando e fornecendo uma visão coesa de dependências, onde pode-se visualizar de forma clara cada etapa a ser executada, fornecendo gerenciamento e controle.
Gostou das dicas? Confira nosso post sobre como descomplicar o Apache Spark!