É necessário para este estudo que exista um repositório git com os projetos do Airflow, estruturado da seguinte organização de pastas: repositório/projeto/arquivos de projeto e pasta /config.
Também é necessário que exista disponível um deploy de Apache Airflow.
É necessário que seja em uma VM com Airflow. Este tutorial não se aplica a um ambiente serverless.
De início, crie uma pasta na Virtual Machine da sua instância do Apache Airflow, para colocar o repositório do Hop.
Em sequência, faça um Git Clone do seu repositório do Apache Hop.
Para sincronizar seu repositório, basta copiar a DAG de sincronização disponível aqui.
Após garantir a sincronização, você pode copiar o código da documentação do Apache Hop:
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.docker_operator import DockerOperator
from airflow.operators.python_operator import BranchPythonOperator
from airflow.operators.dummy_operator import DummyOperator
from docker.types import Mount
default_args = {
'owner' : 'airflow',
'description' : 'sample-pipeline',
'depend_on_past' : False,
'start_date' : datetime(2022, 1, 1),
'email_on_failure' : False,
'email_on_retry' : False,
'retries' : 1,
'retry_delay' : timedelta(minutes=5)
}
with DAG('sample-pipeline', default_args=default_args, schedule_interval=None, catchup=False, is_paused_upon_creation=False) as dag:
start_dag = DummyOperator(
task_id='start_dag'
)
end_dag = DummyOperator(
task_id='end_dag'
)
hop = DockerOperator(
task_id='sample-pipeline',
# use the Apache Hop Docker image. Add your tags here in the default apache/hop: syntax
image='apache/hop',
api_version='auto',
auto_remove=True,
environment= {
'HOP_RUN_PARAMETERS': 'INPUT_DIR=',
'HOP_LOG_LEVEL': 'Basic',
'HOP_FILE_PATH': '${PROJECT_HOME}/transforms/null-if-basic.hpl',
'HOP_PROJECT_DIRECTORY': '/project',
'HOP_PROJECT_NAME': 'hop-airflow-sample',
'HOP_ENVIRONMENT_NAME': 'env-hop-airflow-sample.json',
'HOP_ENVIRONMENT_CONFIG_FILE_NAME_PATHS': '/project-config/env-hop-airflow-sample.json',
'HOP_RUN_CONFIG': 'local'
},
docker_url="unix://var/run/docker.sock",
network_mode="bridge",
mounts=[Mount(source='LOCAL_PATH_TO_PROJECT_FOLDER', target='/project', type='bind'), Mount(source='LOCAL_PATH_TO_ENV_FOLDER', target='/project-config', type='bind')],
force_pull=False
)
start_dag >> hop >> end_dag
No código acima acontece o seguinte: através do DockerOperator, o Airflow irá subir uma imagem do Apache Hop do tipo short-lived¹, na VM do próprio Airflow, ao invés de dentro da imagem dele. Ele atinge isso através do mapeamento do caminho absoluto do docker url em
docker_url="unix://var/run/docker.sock",
Em sequência, são configuradas algumas variáveis de ambiente para o funcionamento do Apache Hop.
Para subir uma pipeline ou workflow do Hop dentro do Airflow, basta mexer em algumas linhas do código ali em cima:
A primeira das linhas a serem alteradas é esta:
mounts=[Mount(source='LOCAL_PATH_TO_PROJECT_FOLDER', target='/project', type='bind'), Mount(source='LOCAL_PATH_TO_ENV_FOLDER', target='/project-config', type='bind')],
Nesta linha, você irá mudar o primeiro source para o caminho absoluto (linux) do seu projeto, por exemplo:
mounts=[Mount(source='/home/userdev/airflow/hop/apache-hop-etls/MesaLimpaETL', target='/project', type='bind'), Mount(source='LOCAL_PATH_TO_ENV_FOLDER', target='/project-config', type='bind')],
E o segundo para a pasta onde ficam as variáveis de ambiente do seu projeto, conforme o exemplo:
mounts=[Mount(source='/home/userdev/airflow/hop/apache-hop-etls/MesaLimpaETL', target='/project', type='bind'), Mount(source='/home/userdev/airflow/hop/apache-hop-etls/MesaLimpaETL/config', target='/project-config', type='bind')],
Aqui, apache-hop-etls é o nosso repositório de Hop, e MesaLimpaETL é o nosso projeto.
Em sequência, basta mudar os valores das variáveis HOP_FILE_PATH e HOP_PROJECT_NAME dentro da variável enviroment, conforme nosso exemplo:
environment= {
'HOP_RUN_PARAMETERS': 'INPUT_DIR=',
'HOP_LOG_LEVEL': 'Basic',
'HOP_FILE_PATH': '${PROJECT_HOME}/mesa_limpa.hwf',
'HOP_PROJECT_DIRECTORY': '/project',
'HOP_PROJECT_NAME': 'MesaLimpaSeiDev',
'HOP_ENVIRONMENT_NAME': '',
'HOP_ENVIRONMENT_CONFIG_FILE_NAME_PATHS': '',
'HOP_RUN_CONFIG': 'local'
},
Onde HOP_FILE_PATH é o caminho do arquivo que se deseja executar, podendo ser tanto um workflow como uma pipeline, e HOP_PROJECT_NAME é só o nome do projeto, ficando a cargo do desenvolvedor.
Após todas essas configurações, está pronta e funcionando a DAG, que vai ser similar a esta:
from datetime import datetime, timedelta
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.docker_operator import DockerOperator
from airflow.operators.python_operator import BranchPythonOperator
from airflow.operators.dummy_operator import DummyOperator
from docker.types import Mount
default_args = {
'owner' : 'João Thomas',
'description' : 'sem',
'depend_on_past' : False,
'start_date' : datetime(2022, 1, 1),
'email_on_failure' : False,
'email_on_retry' : False,
'catchup' : False,
'retries' : 1,
'retry_delay' : timedelta(minutes=5)
}
with DAG('MESALIMPA_hop', default_args=default_args, schedule_interval='0 18 * * *', catchup=False, is_paused_upon_creation=False) as dag:
start_dag = DummyOperator(
task_id='start_dag'
)
end_dag = DummyOperator(
task_id='end_dag'
)
hop = DockerOperator(
task_id='pipeline_mesa_limpa_processos',
# use the Apache Hop Docker image. Add your tags here in the default apache/hop: syntax
image='apache/hop:2.5.0',
api_version='auto',
auto_remove=True,
environment= {
'HOP_RUN_PARAMETERS': 'INPUT_DIR=',
'HOP_LOG_LEVEL': 'Basic',
'HOP_FILE_PATH': '${PROJECT_HOME}/mesa_limpa.hwf',
'HOP_PROJECT_DIRECTORY': '/project',
'HOP_PROJECT_NAME': 'MesaLimpaSeiDev',
'HOP_ENVIRONMENT_NAME': '',
'HOP_ENVIRONMENT_CONFIG_FILE_NAME_PATHS': '',
'HOP_RUN_CONFIG': 'local'
},
docker_url="unix://var/run/docker.sock",
network_mode="bridge",
mounts=[Mount(source='/home/userdev/airflow/hop/apache-hop-etls/MesaLimpaETL', target='/project', type='bind'), Mount(source='/home/userdev/airflow/hop/apache-hop-etls/MesaLimpaETL/config', target='/project-config', type='bind')],
force_pull=False
)
start_dag >> hop >> end_dag
Podem ser feitas configurações adicionais, porém elas não são necessárias para o funcionamento da integração e portanto não serão descritas neste tutorial.