Apache Airflow DAG не может импортировать локальный модуль

Кажется, я не понимаю, как импортировать модули в файл определения DAG воздушного потока APA. Я хотел бы сделать это, чтобы создать библиотеку, которая, например, объявляет задачи с похожими настройками менее подробными.

Вот простейший пример, который я могу вспомнить, что реплицирует проблему: я изменил учебник воздушного потока (https://airflow.apache.org/tutorial.html#recap), чтобы просто импортировать модуль и запустить определение из этого модуля. Вот так:

Структура каталога:

- dags/
-- __init__.py
-- lib.py
-- tutorial.py

tutorial.py:

"""
Code that goes along with the Airflow located at:
http://airflow.readthedocs.org/en/latest/tutorial.html
"""
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta

# Here is my added import
from lib import print_double

# And my usage of the imported def
print_double(2)

## -- snip, because this is just the tutorial code, 
## i.e., some standard DAG defintion stuff --

print_double - просто простой def, который умножает любой ввод, который вы даете ему на 2, и печатает результат, но, очевидно, это даже не имеет значения, поскольку это проблема импорта.

Я могу запустить airflow test tutorial print_date 2015-06-01 в соответствии с учебными документами успешно - запускается dag, и, кроме того, print_double успешно завершается. 4 печатается на консоль, как и ожидалось. Все выглядит хорошо.

Затем я Broken DAG: [/home/airflow/airflow/dags/tutorial.py] No module named 'lib' к веб-интерфейсу и приветствую Broken DAG: [/home/airflow/airflow/dags/tutorial.py] No module named 'lib'. Отказ от дага и попытки ручного запуска с использованием пользовательского интерфейса заставляют "работать" статус, но он никогда не преуспевает или не сработает. Он просто сидит на "беге" навсегда. Я могу стоять в очереди столько, сколько захочу, но они все будут сидеть на "запущенном" статусе.

Я проверил журналы воздушного потока и не вижу там никакой полезной отладочной информации.

Так что я пропущу?

Ответ 1

Используете ли вы Airflow 1.9.0? Это может быть исправлено.

Проблема связана с тем, как Airflow загружает DAG: он не просто импортирует их как обычные модули python, потому что он хочет перезагрузить его без перезапуска процессов. В результате . не находится в пути поиска python.

Если 1.9.0 не исправить это, самым простым изменением является установка export PYTHONPATH=/home/airflow/airflow/:$PYTHONPATH в сценарии запуска. Точный формат этого будет зависеть от того, что вы используете (скрипты systemd vs init и т.д.),

Ответ 2

Добавление пути sys снова сработало для меня,

import sys
sys.path.insert(0,os.path.abspath(os.path.dirname(__file__)))