작성
·
318
·
수정됨
0
안녕하세요. 좋은 강의 감사히 잘 들었습니다.
강의에서 궁금한 점이 있어서 질문 드립니다.
1) 첫 번째 질문
강의 제목 : 외부 파이썬 함수 수행하기
환경 구성 : macOS, Docker, Airflow 2.7
문의 내용 : 강의 초반에 언급한 환경변수로 설정하는 방법
상세 내용 : 강의 후반에 알려주신 내용은 방법을 이해했습니다. 다만 초반에 알려주신 항목 중 sys.path 는 명시적 구현이라 쉽게 가능했으나, 환경변수 쪽은 찾아봐도 쉽게 이해가 안 돼서 질문하게 됐습니다. 복습하면서 여러 방법을 알면 좋을 것 같아서 질문 드립니다.
2) 두 번째 질문
강의 제목 : 없음
환경 구성 : Docker 설치 시 생성하는 디렉터리 이외에 추가 디렉터리 생성 후 볼륨 마운트. 예를 들어 utils 라는 디렉터리를 생성 후 docker-compose.yaml 의 volumes 에 ${AIRFLOW_PROJ_DIR:-.}/utils:/opt/airflow/utils 를 추가 할 경우
문의 내용 : 추가로 디렉터리 생성할 경우 plugins 디렉터리 외에서 py 파일을 읽어야 하는 경우
상세 내용 : 첫 번째 질문과 유사하게 환경변수에 관한 질문일 것 같습니다. 새로운 디렉터리를 생성해서 작업할 때 경로를 인식 시켜야 하는데, sys.path 로만 하는 것은 번거로운 것 같아서 어떤 방식으로 접근을 하면 좋을지 조언을 듣고 싶습니다. 간략하게 정리하면 plugins 디렉터리 이외의 환경도 같이 사용을 하는 방법이 궁금합니다.
3) 세 번째 질문
강의 제목 : 없음
환경 구성 : 1, 2와 동일
문의 내용 : 새로운 패키지 설치 할 때 설치 방법 및 운영 관리 노하우
상세 내용 : docker compose 할 때 yaml 에 PIPADDITIONAL_REQUIREMENTS
부분에 설치할 패키지 목록을 입력해서 설치를 하고 있습니다. 이렇게 해도 되는 것 같긴한데, 나중에 더 많은 패키지를 설치하게 될 경우 좋지 않은 형태라고 생각이 들었습니다. 실제로 현업에서 업무를 하실 때 다양한 패키지를 어떤 식으로 설치 및 운영 관리 하시는지 궁금합니다.
감사합니다. 다른 강의도 기대하겠습니다.
답변 1
0
안녕하세요 화이팅님!
정성스런 질문글이네요 ^-^
순서대로 답변드리자면
1) 환경변수 쪽 이해가 안된다는 말씀이 어떤건지 잘 모르겠는데, OS에서 PYTHONPATH 설정하는 부분이 이해가 안되신 걸까요? 보통 OS에서 PYTHON 경로를 등록하기 위해
$HOME/.bashrc
파일에다가 이렇게 파이썬 경로를 추가하곤 합니다.
export PYTHONPATH=PYTHONPATH:"{등록하고자하는 경로}"
이렇게 작성해두고 쉘 로그인을 하면 PYTHON 경로가 추가된 상태에서 python 수행이 가능합니다.
그런데 이런 작업을 명시적으로 하지 않아도 dags 폴더와 plugins 폴더, config 폴더는 airflow가 알아서 PYTHON 경로에 추가하게 된다는 의미에요.
2) 음... 일반적으로 airflow용 파이썬 프로그램을 작성한다면 config 폴더나 plugins 폴더 아래 작성을 해둡니다. 정 다른 폴더에 있는 파일을 인식시켜야 한다면 가장 쉬운 해결 방법은 soft link를 구성하는 것입니다.
soft link를 구성하는 방법은 운영 환경이 도커냐, on-premise냐에 따라 좀 다를 수 있는데
도커환경이라면 docker-compose.yaml 파일 내 volumes 항목에서 아래처럼 원하고자 하는 경로를 추가해주시구요, ($HOME/airflow/test 폴더 아래에 원하는 파이썬 파일이 있다고 가정해보겠습니다)
volumes:
- ${AIRFLOW_PROJ_DIR:-.}/airflow/test:/opt/airflow/test
그리고
$HOME/airflow/config 디렉토리 또는
$HOME/airflow/plugins 디렉토리에서 아래처럼 soft link 를 생성해줍니다.
ln -s ../test lnk_test
그러면 아래처러 만들어지고 링크가 바라보고 있는 대상도 확인할 수 있습니다.
($HOME/airflow/config 폴더 아래에서 링크를 구성한 모습입니다)
airflow는 config 디렉토리 기본적으로 PYTHONPATH로 인식하므로
$HOME/airflow/test 디렉토리에 예를 들어 abc.py 를 작성하시고 def sample_print() 함수를 정의했다면
airflow DAG에서는 아래처럼 접근이 가능합니다.
from lnk_test.abc import sample_print
이렇게 하기도 좀 번거롭다 하시면 docker 이미지를 만들 때 아래처럼 명시적으로 PYTHONPATH를 추가해서 이미지를 생성하시고,
FROM apache/airflow:2.8.1
USER root
...
ENV PYTHONPATH "${PYTHONPATH}:/opt/airflow/test" <-- 추가
docker-compose.yaml 에서 volumes 항목에서는 $HOME/airflow/test 디렉토리만 연결시켜주심 됩니다.
3) 이 방법은 권고하지 않는 방법이라고 airflow 문서에 명확히 나와 있습니다.
https://airflow.apache.org/docs/docker-stack/entrypoint.html
한마디로 airflow를 매번 올릴 때마다 설치되어야 하고 보안 취약점도 있으니 쓰지 말라는 것입니다.
가장 좋은 것은 도커 이미지를 생성할 때 라이브러리를 포함하여 생성하도록 관리하는 것입니다.
어떻게 하는지도 airflow 문서에 나와있습니다.
도커 이미지 빌드할 때 requirements.txt 파일을 이용해 라이브러리 및 버전 관리를 하고 이 파일을 기반으로 라이브러리 설치하도록 하는 것입니다.
requirements.txt 파일을 얻는 방법은 airflow 공식 가이드 중 pypi로 설치하기 메뉴에 들어가보시면
https://airflow.apache.org/docs/apache-airflow/stable/installation/installing-from-pypi.html
--constraint http://raw.github~~~ 되어 있는 부분을 복사해서 브라우저창에 붙여넣기 해보시면
특정 파이썬 버전 & airflow 버전에 대한 모든 airflow 관련 라이브러리 버전정보가 나와있습니다.
참고하셔서 이 내용을 requirements.txt 파일로 만들어놓고, 도커 이이지 build 하시면 됩니다.
참고로 pip install apache-airflow-xxxx 명령으로 버전 정보없이 airflow 관련 라이브러리를 설치하시면 최신 버전으로 설치하게 됩니다. 그러다보면 의존성 에러같은게 많이 발생하게되요.
그래서 꼭 requirements.txt 파일로 버전 정보까지 같이 관리하셔야 합니다.
답변이 좀 길어졌네요.
강의 잘 들어주셔서 감사합니다. ^^
새해복 많이 받으세요