Airflow

Automatizando seu fluxo de trabalho

O que é?

  • Execução de workflow de dados
    • Escritos em Python
    • Forma de DAGs
  • Criado pelo Airbnb
  • Open Source (Apache License)
  • Desenvolvido em Python
    • Flask, SQLAlchemy, Jinja, etc
  • Alternativa ao Luigi do Spotify

O que não é?

  • Não trabalha com streaming de dados
    • Spark Streaming
    • Storm
  • Não transfere dados de uma tarefa para outra
    • Tasks transferem metadados

Princípios

Dinâmico

Pipeline as a code

Extensível

Estenda os componentes para o seu workflow

Elegante

Pipelines enxutos e parametrizáveis com Jinja

Escalável

Mensageria e workers para orquestrar

Instalação

# Instalação mínima
pip install apache-airflow

# Instalação com suporte extra (S3 e PostgreSQL)
pip install "apache-airflow[s3, postgres]"
# Define a pasta em que o airflow vai trabalhar
# Isso é necessário
export AIRFLOW_HOME=~/airflow

# Inicializa o banco de dados (padrão: SQLite)
airflow initdb

# Iniciar o seridor local (porta padrão: 8080)
airflow webserver -p 8080

Conceitos

DAG

  • Directed Acyclic Graphs
  • Rede de jobs
  • Possui agendamento próprio
  • Código enxuto e fácil de entender quando criado

Default Arguments

  • Dicionário de propridades definidas
  • Passando para a DAG, é aplicado para todos os Operators

Operators

  • Representa um uma tarefa na DAG
  • Eles são usualmente (não sempre) atômicos
  • Podem trocar uma quantidade pequena de informações entre eles

Tasks

  • Instância de um Operator
  • Ela se torna um nó na DAG

Primeira DAG

Caso de Exemplo

  1. Imprime a data na saída padrão
  2. Define um sleep de 5 segundos
  3. Salva a data em um arquivo texto
import airflow

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import, timedelta

args = {
    'owner': 'airflow',
    'start_date': airflow.utils.dates.days_ago(2)
}


dag = DAG(
    dag_id='tutorial',
    default_args=args,
    schedule_interval=timedelta(days=1),
    dagrun_timeout=timedelta(minutes=60)
)

Definindo a DAG

# 1. Imprime a data na saída padrão
task1 = BashOperator(
    task_id='print_date',
    bash_command='date',
    dag=dag)

# 2. Faz uma sleep de 5 segundos.
# Dando errado tente em no máximo 3 vezes
task2 = BashOperator(
    task_id='sleep',
    bash_command='sleep 5',
    retries=3,
    dag=dag)

# 3. Salve a data em um arquivo texto
task3 = BashOperator(
    task_id='save_date',
    bash_command='date > /tmp/date_output.txt',
    retries=3,
    dag=dag)

Registrando as tasks

# Interligando task1 ao task2
task1.set_downstream(task2)

# Interligando task2 ao task3
task2.set_downstream(task3)

Interligando as tasks

# salve o módulo na pasta dags (definido por padrão)
$ cd $AIRFLOW_HOME/dags
$ vim tutorial_dag.py

# Executando em linha de comando
# mas pode executar via interface também
$ airflow backfill tutorial -s 2018-03-30 -e 2015-03-30

Salvar e executar a DAG

Demo

Comandos com Airflow

Arquitetura

Executors

Sequential

  • Modo default
  • Uso mínimo (SQLite)
  • 1 tarefa por vez
  • Bom para testes e usos locais

Local

  • Executa tarefas paralelas localmente
  • Gerado por scheduler
  • Escala vertical
  • Preparado para produção
  • Não precisa de broker

Celery

  • Executa tarefas paralelas remotamente
  • Gerado por scheduler
  • Escala vertical e horizontal
  • Preparado para produção
  • Precisa de um broker

Airflow UI

Alguns processos feitos com Airflow

  • Data warehousing: cleanse, organize, data quality check

  • Growth analytics

  • Experimentation: compute our A/B testing

  • Email targeting

  • Sessionization: compute clickstream

  • Search: compute search ranking related metrics

  • Data infrastructure maintenance: database scrapes, folder cleanup, applying data retention policies, …

feitos pelo Airbnb

Outras informações

Documentação Airflow

https://airflow.apache.org/

Apache Airflow in the Cloud: Programmatically orchestrating workloads

https://www.youtube.com/watch?v=ZZ5okeRGRB8

Blog: df.python.org.br

Telegram: @grupydf

Meetup: PyData-Brasilia

Telegram: @pydatabsb

Email: me@gilsondev.in

Blog: gilsondev.in

Telegram: @gilsondev

Github: @gilsondev

Twitter: @gilsonfilho

Dúvidas?

Made with Slides.com