如何在气流中设置每周和每日 dag 之间的依赖关系

时间:2021-01-07 14:23:24

标签: python python-3.x airflow etl

我知道这种问题已经被问过几次了,但我只是没有让我的工作流程按照我想要的方式工作,我是 Python 和气流的新手。

我有两个 dag,一个每周一次,它将数据从 csv 文件加载到 mysql 数据库中,从数据库中获取某些列,准备数据并根据清理过的数据训练 DecisionTreeRegressor 模型,这完全正常。 每日 dag 加载有关要素的数据,并使用此数据使用每周 dag 中创建的模型预测某个值。这是我正在使用的 dag 代码:

import datetime as dt

from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.utils.dates import days_ago

from data_handling import load_data, insert_into_db, clean_data
from ml_handling import create_model, predict_prices


default_args = {
    'owner': 'me',
    'start_date': days_ago(2),
    'retries': 1,
    'retry_delay': dt.timedelta(minutes=5),
}

with DAG('weekly_etl_dag',
         default_args=default_args,
         schedule_interval='0 * * * 
         ) as dag:                       

    insert_into_db = PythonOperator(task_id='insert_into_db',
                                    python_callable=insert_into_db)

    load_data = PythonOperator(task_id='load_data',
                               python_callable=load_data)

    clean_data = PythonOperator(task_id='clean_data',
                                python_callable=clean_data)

    create_model = PythonOperator(task_id='create_model',
                                  python_callable=create_model)


insert_into_db >> load_data >> clean_data >> create_model

import datetime as dt

from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.sensors.external_task import ExternalTaskSensor
from airflow.utils.dates import days_ago

from ml_handling import predict_prices, load_pred_data_daily

# definition of the dag to handle the daily tasks such as loading the feature data for the houses whose prices shall
# be predicted and actually predicting these prices

default_args = {
    'owner': 'me',
    'start_date': days_ago(2),
    'retries': 1,
    'retry_delay': dt.timedelta(minutes=5),
}

with DAG('daily_etl_dag',
         default_args=default_args,
         schedule_interval='0 * * * *', 
         ) as dag:                       

    load_pred_data_daily = PythonOperator(task_id='load_pred_data_daily',
                                          python_callable=load_pred_data_daily)

    predict_prices = PythonOperator(task_id='predict_prices',
                                    python_callable=predict_prices)

    weekly_dag = ExternalTaskSensor(
        task_id='wait_for_the_weekly_dag_to_be_completed',
        external_dag_id='weekly_dag',
        external_task_id=None,
        timeout=10,
        allowed_states=['success'],
        failed_states=['failed', 'running'],
        mode="reschedule",
        check_existence=True
    )

    weekly_dag >> [load_pred_data_daily >> predict_prices]

如前所述,每周 dag 有效,并且两个 dag 中的 PythonOperators 都可以正常工作,通过将所有这些都放在一个 dag 中进行测试。 我正在尝试使用 ExternalTask​​Sensor 实现每周和每日 dag 之间的依赖关系,但我不确定如何测试我已经编写的代码。我希望在本周的每周 dag 成功完成后开始每日 dag。

我做错了什么,如何在气流中测试我的代码?

感谢您的帮助!

0 个答案:

没有答案