J'ai regardé la section sous-DAG Airflow et essayé de trouver quoi que ce soit d'autre en ligne qui serait utile, mais je n'ai rien trouvé qui explique en détail comment faire fonctionner un sous-DAG. L'une des exigences pour qu'un sous-DAG s'exécute est qu'il doit être activé. Comment activer/désactiver un sous-dag?
J'ai écrit un exemple de code qui ne montre aucune erreur dans le flux d'air, mais lorsque j'essaie de l'exécuter, aucun des opérateurs du sous-DAG n'est exécuté.
Ceci est mon principal code DAG:
import os
from airflow import DAG
from airflow.operators import BashOperator
from datetime import datetime, timedelta
from airflow.operators.subdag_operator import SubDagOperator
from linecount_subdag import sub_dag
parent_dag_name = 'example_linecount_dag'
child_dag_name = 'example_linecount_subdag'
args = {
'owner': 'airflow',
'start_date': datetime(2016, 04, 20),
'retries': 0,
}
main_dag = DAG(
dag_id=parent_dag_name,
default_args=args,
schedule_interval=timedelta(minutes=5),
start_date=datetime(2016, 04, 20),
max_active_runs=1
)
subdag = SubDagOperator(
subdag=sub_dag(parent_dag_name, child_dag_name, args, main_dag.schedule_interval),
task_id=child_dag_name,
default_args=args,
dag=main_dag)
t = BashOperator(
task_id='start',
bash_command='echo "waiting for subdag..."',
default_args=args,
dag=main_dag)
t.set_downstream(subdag)
Dans ce code, la tâche 'start' réussit, mais la tâche subdag ne fait rien et n'échoue ni ne réussit.
Voici mon code subDAG:
from airflow.models import DAG
from airflow.operators import BashOperator
# Dag is returned by a factory method
def sub_dag(parent_dag_name, child_dag_name, args, schedule_interval):
dag = DAG(
'%s.%s' % (parent_dag_name, child_dag_name),
default_args=args,
start_date=args['start_date'],
max_active_runs=1,
)
t1 = BashOperator(
task_id='count_lines',
bash_command='cat /root/airflow/airflow.cfg | wc -l',
default_args=args,
xcom_Push=True,
dag=dag)
t2 = BashOperator(
task_id='retrieve_val',
bash_command='grep "airflow_home" /root/airflow/airflow.cfg',
default_args=args,
xcom_Push=True,
dag=dag)
templated_command = """
{
echo "{{ ti.xcom_pull(task_ids='count_lines') }}"
echo "{{ ti.xcom_pull(task_ids='retrieve_val') }}"
}"""
t3 = BashOperator(
task_id='print_values',
bash_command=templated_command,
default_args=args,
dag=dag)
t3.set_upstream(t1)
t3.set_upstream(t2)
return dag
Les 3 opérateurs de ce code obtiennent le nombre de lignes du fichier "airflow.cfg", recherchent la valeur de "airflow_home" dans ce fichier et renvoient ces deux valeurs à imprimer. Ce code fonctionne seul, donc je ne pense pas que ce soit le problème.
Que dois-je changer pour que le sous-DAG exécute ses opérateurs?
J'ai utilisé votre code localement et cela fonctionne très bien.
Les seules choses que j'ai modifiées ont été de définir à la fois le dag externe et le sous-dag pour avoir schedule_interval = None et les ont déclenchés manuellement.
Avoir une date de début datetime (2016, 04, 20) et schedule_interval de 5 minutes va inonder le planificateur de flux d'air avec beaucoup remblayage requêtes.
Vous devrez peut-être passer de l'utilisation d'un LocalExecutor à CeleryExecutor. LocalExecutor est assez limité.
Voici la sortie de la dernière étape du sous-dag:
[2017-03-08 15:35:18,994] {base_task_runner.py:95} INFO - Subtask: {
[2017-03-08 15:35:18,994] {base_task_runner.py:95} INFO - Subtask: echo "226"
[2017-03-08 15:35:18,994] {base_task_runner.py:95} INFO - Subtask: echo "airflow_home = /root/airflow/"
[2017-03-08 15:35:18,994] {base_task_runner.py:95} INFO - Subtask: }