Как запланировать задачу с воздушным потоком - PullRequest
0 голосов
/ 29 мая 2020

К сожалению, даже после прочтения множества вопросов здесь и на странице часто задаваемых вопросов на веб-сайте Airflow я все еще не понимаю, как Airflow планирует задачи. У меня есть очень простой пример задачи:

from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta

default_args = {
    "depends_on_past": False,
    "start_date": datetime(2020, 5, 29),
    "email_on_failure": False,
    "email_on_retry": False,
    "retries": 1,
    "retry_delay": timedelta(minutes=5),
}

dag = DAG(
    "example_dag_one",
    schedule_interval="30 8 * * *",
    catchup=False,
    default_args=default_args,
)

with dag:

    t1 = BashOperator(task_id="print_hello", bash_command="echo hello", dag=dag)

    t1

Я наивно полагаю, что эта задача будет запущена 29 мая в 08:30. Но по прошествии времени Airflow не запланировал эту задачу. Если я изменю выражение cron на что-то вроде: '* 8 * * *', он будет планировать задачу каждую минуту.

Однако, когда я использую тот же самый DAG с датой начала вчера (так что 28 мая case) задача будет запланирована на 08:30, но дата ее выполнения - 28-е (хотя она была запущена 29-го мая), а дата начала в веб-интерфейсе - 29-е мая. Это ОЧЕНЬ сбивает с толку.

То, что я хочу от воздушного потока, в конечном итоге просто: «Вот код python, запустите его в этот день». Итак, как я мог этого добиться. Снова предположим, что я хочу запланировать задачу на 08:30 каждый день, начиная с завтрашнего дня.

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Ответ можно найти в официальной документации Airflow :

Обратите внимание, что если вы запустите DAG на schedule_interval в один день, запуск с отметкой 2016-01-01 будет триггером вскоре после 2016-01-01T23: 59. Другими словами, экземпляр задания запускается по окончании периода, который он охватывает.

Давайте повторим это Планировщик запускает ваше задание через один schedule_interval ПОСЛЕ даты начала, в КОНЕЦ периода.

Итак, применительно к вашему случаю, если вы укажете дату начала 29 мая с исходным cron, он будет запускаться каждый день в 08:30, начиная с завтрашнего дня 30 мая.

В любом случае , если вам не нужен даг специально в какой-то момент дня, вы можете просто установить интервал расписания на «@daily», и он будет запускаться в начале (00:00) каждого дня. Если есть много дагов с @daily, не волнуйтесь, планировщик и рабочие будут знать, как с ним справиться, чтобы выполнить их все. Если у вас есть даги, зависящие от других дагов, есть механизмы для их объединения, так что вам все равно не придется беспокоиться об указании часов.

0 голосов
/ 29 мая 2020

Фактически Airflow будет ждать завершения всего интервала планирования (1 день), после чего начнется выполнение!

Итак, если вы хотите, чтобы ваша задача была выполнена сегодня 2020/ 5/ 29, вы должны установить время начала таким образом, чтобы интервал расписания закончился. Поэтому установите время начала: datetime(2020, 5, 28)

Если интервал расписания составляет 1 неделю, то задача будет запущена на 1 неделю позже времени начала и так далее ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...