티스토리 뷰
반응형
airflow 를 기동할때 편의를 자주쓰는 유틸리티나 스크립트를 PATH 환경변수에 정의하고 데몬을 기동하여 사용하는 경우가 있다.
예를 들어, /home/user/foo/script 라는 경로에 내가 편의를 위해 만든 쉘스크립트를 넣고, PATH 환경변수에 지정해서 잘 쓰고 있었는데, BashOperator 에서 env 옵션을 사용하면 이상하게 해당 스크립트를 찾지 못하는 문제가 발생했다.
# export PATH=$PATH:/home/user/foo/script 가 시스템환경변수에는 존재함
## 이 녀석은 잘 실행되는데
BashOperator(
task_id='t1',
bash_command='myscript.sh',
)
## 이 녀석에서는 myscript.sh 를 찾지 못한다
BashOperator(
task_id='t2',
bash_command='myscript.sh',
env={'SERVICE_NAME':'myhome'}
)
원인
BashOperator 코드를 살펴보면, 사용자가 정의한 env 에 정의된 값이 있으면 기본적으로는 사용자가 정의한 env 만 로딩하는 구조로 되어있다. 쉽게 생각하면 사용자가 env 값을 지정하면 딴 시스템환경변수는 생략된다는 말이다. 표로 정리하면 아래와 같다.
append_env 의 디폴트값은 false 이므로, env 인자를 넣게되면 system_env 값은 사라지게된다.
구분 | append_env (true) | append_env (false) |
env (값 있음) | system_env + env | env |
env (값 없음, NONE) | system_env | system_env |
https://github.com/apache/airflow/blob/main/airflow/operators/bash.py#L183-L185
해결방법
결과적으로는 시스템환경변수(system_env) 위에, 사용자 환경변수 (env) 를 추가하는걸 원하기 때문에, append_env 옵션에 True 를 추가해주면 된다. (디폴트값은 false 임)
BashOperator(
task_id='t1',
bash_command='myscript.sh',
env={'SERVICE_NAME':'myhome'},
append_env = True
)
처음에 이거 몰라서 왜 실행안된느것이지 헤맸는데 헤메지 말자
반응형
'데이터처리 > Airflow' 카테고리의 다른 글
[오류] Airflow 에서 logical_date 가 잘못 생성되는 문제 - catchup 문제 (0) | 2023.12.14 |
---|---|
[오류] DAG 의 filepath 값이 잘못 로딩되는 현상 원인과 해결방법 (0) | 2023.12.13 |
[AIRFLOW] logical_date 의 개념 이해하기- execution_date 의 대체 (1) | 2023.12.05 |
[AIRFLOW] ExternalTaskSensor 에서 스케쥴 단위가 다를때 의존성 거는법 (예: 10분->1시간) (0) | 2023.11.13 |
[오류] Airflow 설치 오류 해결 방법 : SQLite C library too old (< 3.15.0) (0) | 2023.11.08 |
댓글