气流未从DAG中拾取“开始日期”

时间:2020-06-19 19:56:48

标签: airflow airflow-scheduler

我正在像这样注册一个新的DAG:

SELECT rr.report_id, rr.topic, string_agg(pa.title,',') as program_areas 
FROM RESEARCH_REPORTS rr 
INNER JOIN PROGRAM_AREAS_REPORTS_REL parr ON rr.report_id = parr.report_id 
INNER JOIN PROGRAM_AREAS pa ON parr.program_area_id = pa.program_area_id 
WHERE rr.report_id = 141
group by rr.report_id, rr.topic

我希望它在from airflow import DAG from airflow.operators.python_operator import PythonOperator from airflow.operators.bash_operator import BashOperator from airflow.utils.dates import days_ago from airflow.hooks.base_hook import BaseHook from datetime import datetime, timedelta, timezone import pendulum local_tz = pendulum.timezone("UTC") default_args = { 'owner': 'me', 'depends_on_past': False, 'start_date': datetime(2020, 6, 19, 9, 37, 35, tzinfo=local_tz), 'email': ["blah@blah.com"], 'email_on_failure': False, 'email_on_retry': False, 'retries': 1, 'retry_delay': timedelta(minutes=15) } dag = DAG( dag_id="some_id", default_args=default_args, description= "Some description", schedule_interval="@once" ) def to_be_executed_py(): print("I did it, ma!") with dag: t1 = PythonOperator( task_id="some_id", python_callable=to_be_executed_py) 中给出的时间仅运行一次。在上传DAG(使用S3)之后,我没有看到“ start_date”的详细信息。相反,我在start_date下看到了详细信息:

default_args

我在这里做错什么了吗?我是否正确假设此操作应在给定的{'owner': 'me', 'depends_on_past': False, 'start_date': datetime.datetime(2020, 6, 19, 9, 37, 35, tzinfo=<TimezoneInfo [UTC, GMT, +00:00:00, STD]>), 'email': ['bleh@blah.com'], 'email_on_failure': False, 'email_on_retry': False, 'retries': 1, 'retry_delay': datetime.timedelta(0, 900)} 上执行?我一直在寻找类似的用例,但是没有多少人将其start_time设置为包含时间。

更新

当前,DAG在未暂停的情况下正在立即运行。绝对不接受开始时间。我在网上找到的所有资源都无法在这里找到答案。

2 个答案:

答案 0 :(得分:1)

找出问题所在。这是双重的。一个,我们使用的翻译器是12小时制。就像在傍晚那样,将其设置为过去(导致Airflow出现赶超情况)。

第二,我们不需要时区。另外,我们没有在任务中设置dag。因此,代码应如下所示:

from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from airflow.operators.bash_operator import BashOperator
from airflow.utils.dates import days_ago
from airflow.hooks.base_hook import BaseHook
from datetime import datetime, timedelta, timezone

default_args = {
    'owner': 'me',
    'depends_on_past': False,
    'start_date': datetime(2020, 6, 19, 21, 37, 35),
    'email': ["blah@blah.com"],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=15)
}
dag = DAG(
    dag_id="some_id",
    default_args=default_args,
    description= "Some description",
    schedule_interval="@once"
)

def to_be_executed_py(ds, **kwargs):
    print("I did it, ma!")

with dag:
    t1 = PythonOperator(
        dag=dag,
        provide_context=True,
        task_id="some_id",
        python_callable=to_be_executed_py)

有了这些更改,一切都会在给定的时间运行一次,并且只有一次。

答案 1 :(得分:0)

结合使用schedule_interval='@daily'ShortCircuitOperator和气流变量,您可以解决此问题; DAG每天运行,并检查今天是否在您作为气流变量输入的日期列表中。如果是这样,请继续并运行下游任务,否则,它将跳过下游任务并等待直到明天的后续执行。 这是DAG的定义:

import airflow.utils.helpers
from airflow.models import DAG, Variable
from airflow.operators.dummy_operator import DummyOperator
from airflow.operators.python_operator import ShortCircuitOperator

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

dag = DAG(
    dag_id='run_on_release_day',
    default_args=args,
    schedule_interval='@daily'
)

def check_release_date(**context):
    release_dates = Variable.get('release_dates')
    print(context, release_dates)
    return context['ds'] in release_dates

cond = ShortCircuitOperator(
    task_id='condition',
    python_callable=check_release_date,
    dag=dag,
    provide_context=True,
)

tasks = [DummyOperator(task_id='task_' + str(i), dag=dag) for i in [1, 2]]

airflow.utils.helpers.chain(cond, *tasks)