我正在像这样注册一个新的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在未暂停的情况下正在立即运行。绝对不接受开始时间。我在网上找到的所有资源都无法在这里找到答案。
答案 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)