Airflow 에러 해결 모음

Pori·2023년 12월 18일
1

UpdateSymbol DAG log error

문제

: DAG 수행 에러발생과 함께 log가 정상적으로 쌓이지 않는 문제가 발생하였다. 에러 코드는 다음과 같다.

*** Log file does not exist: /opt/airflow/logs/dag_id=UpdateSymbol_v2/run_id=manual__2023-12-15T17:09:17.872482+00:00/task_id=get_historical_prices/attempt=1.log
*** Fetching from: http://:8793/log/dag_id=UpdateSymbol_v2/run_id=manual__2023-12-15T17:09:17.872482+00:00/task_id=get_historical_prices/attempt=1.log
*** Failed to fetch log file from worker. Request URL is missing an 'http://' or 'https://' protocol.

시도

  • logs 폴더의 권한을 변경 : 다른 DAG들은 정상적으로 적재되어 문제의 원인이 아니였다.
  • Executor 변경 : LocalExecutor로 변경해보았으나, 추가적인 에러가 발생하여 CeleryExecutor를 사용하였다.
  • Scheduler에서 pymysql, yfinance 설치 : 스케쥴러에만 설치를 시도했으나 해결하지 못하였다.

해결

: Airflow는 여러 컴포넌트 간 의존성이 존재한다. 특히 작업이 실행되는 환경은 Worker이다. 그런데 Scheduler에서 설치 후 테스트만을 진행하였기에 이 부분을 놓치게 되었다.

worker와 scheduler 이외에도 webserver에서도 에러가 발생할 가능성이 있어 pip 설치를 일괄로 하는 방법을 수행하였다.

docker-compose.yaml의 _PIP_ADDITIONAL_REQUIREMENTS를 통해 시작 시에 설치할 pip requirements를 다룰 수 있다.

environment:
	...
	_PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:- pymysql yfinance}

Permission denied: '/opt/airflow/logs/scheduler'

문제

: 처음 Airflow 설치 후 실행 시 scheduler에 permission denied 에러가 발생하며 Container가 정상적으로 올라가지 않는 문제가 발생하였다.

해결

: 다행히 나와 같은 문제가 발생한 사람들이 많았고 GITHUB 게시글의 답변을 참고하여 해결하였다.

docker-compose.yaml이 있는 폴더에서 다음 순서로 폴더와 환경변수를 설정하면된다.

  1. mkdir -p ./dags ./logs ./plugins
  2. echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env

깃헙 게시글 : https://github.com/apache/airflow/discussions/16801


Country Name 실습 중 ‘s 로 인한 문제 발생

문제

: Country_name DAG 실습 중 발생한 문제이다. MySQL에 ‘s 가 들어간 구문을 테이블에 적재해야하는 과정이다. 정상적으로 적재되지 않고 ‘ 를 기준으로 분리되어 들어가는 에러가 발생하였다.

해결

: SQL Injection처럼 발생하게 되는데 ‘를 문자열 값으로 인식한다고 한다. 따라서 다음과 같은 구문이 있으면 "example'; DROP TABLE schema.table; --" 이것을 아래와 같이 나누어 SQL문을 생성한다고 한다.

INSERT INTO schema.table VALUES ('example'; 
DROP TABLE schema.table; --', 42, 'another_example');

따라서 구문을 직접 넣는것이아니라 매개변수의 형태로 넣는 방식을 사용하여 해결 하였다.

-- 해결 코드
sql = f"INSERT INTO {schema}.{table} VALUES (%s, %s::bigint, %s);"
            print(sql, (r[0], r[1], r[2]))
            cur.execute(sql, (r[0], r[1], r[2]))

WSL안의 파일 변경 시 Permission denied

문제

: WSL을 이용해 airflow를 사용중에 dag를 수정할 일이 생겼다. VSCODE를 이용해서 수정을 하였으나, 권한이 없다는 문구와 함께 저장이 불가능하였다.

해결

  1. root 계정으로 접근
  2. sudo nano/vim 과 같은 다른 에디터를 sudo와 함께 사용하여 수정
  3. 폴더,파일의 권한 변경 : sudo chown -R <계정명> <작업폴더>

2개의 댓글

안녕하세요~ 데브코스 데이터 엔지니어링 3기 수강생입니다.
올려주신 글 도움 되었습니다. 감사합니다!

1개의 답글