2017-12-27 24 views
0

아파치 에어 플로우 DAG 정의 파일로 모듈을 가져 오는 방법을 이해하지 못하는 것 같습니다. 예를 들어, 비슷한 설정으로 작업을 선언하는 라이브러리를 만들 수 있기를 원합니다.Apache Airflow DAG가 로컬 모듈을 가져올 수 없습니다.

다음은이 문제를 재현 한 가장 간단한 예입니다. 모듈을 가져 와서 해당 모듈에서 정의를 실행하기 위해 에어 가이드 (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는 단순한 데프 인 당신이 2를주고, 결과를 출력 어떤 입력 증식하지만, 이것은 수입 문제이기 때문에 분명히 중요하지 않습니다.

튜토리얼 문서에 따라 airflow test tutorial print_date 2015-06-01을 성공적으로 실행할 수 있습니다. 즉, dag가 실행되고 print_double이 성공합니다. 4이 예상대로 콘솔에 인쇄됩니다. 모두 잘 나타납니다.

그런 다음 웹 UI로 이동하여 Broken DAG: [/home/airflow/airflow/dags/tutorial.py] No module named 'lib'으로 인사합니다. dag를 일시 중단 해제하고 UI를 사용하여 수동 실행을 시도하면 "실행 중"상태가되지만 결코 성공 또는 실패하지 않습니다. 그것은 단지 영원히 "달리기"에 있습니다. 내가 원하는만큼 많은 큐를 대기시킬 수 있지만 모두 "실행 중"상태에 머무를 것입니다.

공기 흐름 로그를 확인 했으므로 유용한 디버그 정보가 보이지 않습니다.

그래서 나는 무엇을 놓치고 있습니까?

+0

이것은 나의 지역에서 이것을 테스트했고 작동했습니다; 적절한 디렉토리에 파일을 가지고 있습니까? dag 폴더에 실제로 있지 않은 tutorial.py 파일을 편집 할 수 있습니까? 경로는 두 개의 "airflow"가있는 것으로 보입니다./home/airflow/airflow/dags/tutorial.py' – listik

+0

컨텍스트가이 문제로 전환되었지만 완전히 신선한 공기 흐름을 시도합니다. VM이되고 기회가 생기면 다시 복제하려고합니다. 그러나 나는'airflow'가 사용자 이름이고'airflow/airflow'가 설치 디렉토리라는 것을 확인할 수 있습니다. 그래서 적어도 그 부분은 문제가 아닙니다. 나는 또한 디렉토리 구조가 질문에 게시 된 것과 같은'cd '로 확인 할 수 있습니다. 그러나 나는 당신이 그것이 당신을 위해 일한다고 말하고 있기 때문에 나의 실사를하고 고립 된 환경에서 모든 것을 복제 할 것입니다. – fildred13

답변

0

공기 흐름 1.9.0을 사용하고 있습니까? 이것은 거기에서 고정 될지도 모른다.

Airflow가 DAG를로드하는 방식으로 인해 문제가 발생합니다. 프로세스를 다시 시작하지 않고 다시로드 할 수 있기를 원하기 때문에 일반적인 Python 모듈로 가져 오는 것이 아닙니다. 결과적으로 .은 python 검색 경로에 없습니다.

1.9.0에서이 문제가 해결되지 않으면 가장 쉬운 변경은 export PYTHONPATH=/home/airflow/airflow/:$PYTHONPATH을 시작 스크립트에 넣는 것입니다. 그것의 정확한 형식은 당신이 사용하고있는 것 (systemd vs init 스크립트 등등)에 달려 있습니다.

+0

컨텍스트가 잠시 동안 전환되었으므로 최대한 빨리이 대답을 조사 할 것입니다! – fildred13

+0

아직 수정 사항이 있습니까? – moku