我正在尝试设置DAG,其中每分钟运行一个任务,然后在第5分钟(紧接1分钟任务之前)运行另一个任务。真的只是测试,我不打算在这么短的间隔内运行作业。
从外观上看,我的DAG看起来像这样:
代码本身是这样的:
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import BranchPythonOperator
from datetime import datetime, timedelta
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime(2018, 10, 9)
}
now = datetime.now()
minute_check = now.minute % 5
dag = DAG(
dag_id='test3',
default_args=default_args,
schedule_interval='* * * * *',
dagrun_timeout=timedelta(minutes=5),
catchup=False,
max_active_runs=99
)
def check_minute():
if minute_check == 0:
return "branch_fiveminute"
else:
return "branch_minute"
branch_task = BranchPythonOperator(
task_id='branch_task',
python_callable=check_minute,
trigger_rule='all_done',
dag=dag)
branch_minute = BashOperator(
task_id='branch_minute',
bash_command='test1min.sh ',
trigger_rule='all_done',
dag=dag)
branch_fiveminute = BashOperator(
task_id='branch_fiveminute',
bash_command='test5min.sh ',
trigger_rule='all_done',
dag=dag)
branch_task.set_downstream(branch_minute)
branch_task.set_downstream(branch_fiveminute)
branch_fiveminute.set_downstream(branch_minute)
我遇到的问题是,在第5分钟,气流跳过了1分钟的任务:
我尝试过使用trigger_rule设置,但没有成功。
任何想法有什么问题吗?如果有问题,我正在使用Airflow 1.10。
答案 0 :(得分:1)
由于5分钟任务的执行路径不同,因此跳过1分钟任务。从图中可以看出有些反常,但是只有1条执行路径。
所以您要做的是在开始处有一个分支,一条路径导致错误的虚拟运算符,一条路径导致5分钟的任务,但是5分钟任务和虚拟运算符都将导致1分钟的任务。
这样,无论选择哪个执行路径,虚拟任务都会被跳过,但是执行流程最终会在1分钟的任务中结束。
from airflow import DAG
from airflow.operators.python_operator import BranchPythonOperator
from airflow.operators.dummy_operator import DummyOperator
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime(2018, 10, 9)
}
now = datetime.now()
minute_check = now.minute % 5
dag = DAG(
dag_id='test3',
default_args=default_args,
schedule_interval='* * * * *',
dagrun_timeout=timedelta(minutes=5),
catchup=False,
max_active_runs=99
)
def check_minute():
if minute_check == 0:
return "branch_fiveminute"
else:
return "branch_false_1"
branch_task = BranchPythonOperator(
task_id='branch_task',
python_callable=check_minute,
trigger_rule='all_done',
dag=dag)
branch_minute = BashOperator(
task_id='branch_minute',
bash_command='test1min.sh ',
trigger_rule='all_done',
dag=dag)
branch_fiveminute = BashOperator(
task_id='branch_fiveminute',
bash_command='test5min.sh ',
trigger_rule='all_done',
dag=dag)
branch_false_1 = DummyOperator( task_id= "branch_false_1", dag=dag )
branch_task.set_downstream(branch_false_1)
branch_task.set_downstream(branch_fiveminute)
branch_fiveminute.set_downstream(branch_minute)
branch_false_1.set_downstream(branch_minute)