2016-08-03 2 views
25

Скажите, что у вас есть воздушный поток DAG, который не имеет смысла для обратной засыпки, а это означает, что после его запуска один раз его последующее время быстро будет совершенно бессмысленным.Как предотвратить воздушный поток от засыпки?

Например, если вы загружаете данные из какого-либо источника, который ежечасно обновляется только в вашей базе данных, засыпка, которая происходит в быстрой последовательности, будет просто импортировать одни и те же данные снова и снова.

Это особенно раздражает, когда вы создаете новую почасовую задачу, и она запускает N количество раз за каждый пропущенный час, делая избыточную работу, прежде чем она начнет работать в указанном вами интервале.

Единственное решение, которое я могу придумать что-то, что они специально не рекомендуемые в FAQ of the docs

Мы рекомендуем против использования динамических значений в качестве датой_начала, особенно datetime.now(), как это может быть довольно запутанным.

Есть ли способ отключить засыпку для DAG, или я должен сделать выше?

ответ

17

Обновите версию воздушного потока версии 1.8 и используйте catchup_by_default = False в airflow.cfg или примените catchup = False к каждому из ваших задержек.

https://github.com/apache/incubator-airflow/blob/master/UPDATING.md#catchup_by_default

+0

Спасибо. Это намного лучше, чем LastOnlyOperator. – m0meni

+2

У меня установлено catchup_by_default = False, но Airflow все еще заполняет задания. Любая идея почему? Я запускаю версию 1.8 –

+0

@OllieGlass Вы уверены, что применили ее к правильному контейнеру, я точно не знаю, что такое ваша установка, но это определенно имеет значение. Вы также можете попробовать применить его к конкретным группам DAG, если вы не уверены. – sage88

10

Это, как представляется, нерешенная проблема Airflow. Я знаю, что мне очень хотелось бы иметь точно такую ​​же особенность. Вот, насколько я получил; он может быть полезен другим.

Это функции пользовательского интерфейса (как минимум в 1.7.1.3), которые могут помочь в решении этой проблемы. Если вы перейдете в представление «Дерево» и выберите конкретную задачу (квадратные квадратики), появится диалоговая кнопка с кнопкой «Успех знака». Нажав «минус», нажмите «отметить успех», и все экземпляры этой задачи в DAG будут отмечены как успешные, и они не будут запущены. Верхний уровень DAG (круги сверху) также может быть помечен как успешный аналогичным образом, но, похоже, не существует способа маркировать несколько экземпляров DAG.

Я еще недостаточно изучил его, но можно использовать подкоманду 'trigger_dag' для обозначения состояний DAG. смотрите здесь: https://github.com/apache/incubator-airflow/pull/644/commits/4d30d4d79f1a18b071b585500474248e5f46d67d

CLI особенность отметить DAGs в работах: http://mail-archives.apache.org/mod_mbox/airflow-commits/201606.mbox/%[email protected]%3E https://github.com/apache/incubator-airflow/pull/1590

UPDATE (9/28/2016): Новый оператор 'LatestOnlyOperator' была добавлена ​​(https://github.com/apache/incubator-airflow/pull/1752), который будет работать только последняя версия последующих задач. Звучит очень полезно и, надеюсь, скоро выйдет в релизы

ОБНОВЛЕНИЕ 2: Начиная с воздушного потока 1.8, был выпущен LatestOnlyOperator.

+0

Обновление выглядит действительно многообещающим! Спасибо, что не отстает от вопроса. – m0meni

+1

Обратите внимание, что LastOnlyOperator устанавливает нижестоящие задачи в состояние «пропущено». В документах пропущенные состояния распространяются так, что там также пропускаются все непосредственно задачи по восходящему потоку. Это делает подход непригодным, если вы (ew) хотели бы, чтобы задания на восходящем направлении выполнялись успешно с устаревшими данными. В этом случае лучшим решением является добавление раннего оператора в ваш код, который ускользает к успеху, если задача выполняется особенно поздно. – russellpierce

+1

Команда backfill для cli выглядит так, как будто она теперь доступна и, вероятно, лучший способ сделать это пока. https://airflow.incubator.apache.org/cli.html обратная заправка воздушного потока -h [имя хоста здесь] -m = True -s [startdate] -e $ (date + "% Y-% m-% dT:% H:% M:% S ") – sage88