: 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.
: Airflow는 여러 컴포넌트 간 의존성이 존재한다. 특히 작업이 실행되는 환경은 Worker이다. 그런데 Scheduler에서 설치 후 테스트만을 진행하였기에 이 부분을 놓치게 되었다.
worker와 scheduler 이외에도 webserver에서도 에러가 발생할 가능성이 있어 pip 설치를 일괄로 하는 방법을 수행하였다.
docker-compose.yaml의 _PIP_ADDITIONAL_REQUIREMENTS
를 통해 시작 시에 설치할 pip requirements를 다룰 수 있다.
environment:
...
_PIP_ADDITIONAL_REQUIREMENTS: ${_PIP_ADDITIONAL_REQUIREMENTS:- pymysql yfinance}
: 처음 Airflow 설치 후 실행 시 scheduler에 permission denied 에러가 발생하며 Container가 정상적으로 올라가지 않는 문제가 발생하였다.
: 다행히 나와 같은 문제가 발생한 사람들이 많았고 GITHUB 게시글의 답변을 참고하여 해결하였다.
docker-compose.yaml이 있는 폴더에서 다음 순서로 폴더와 환경변수를 설정하면된다.
mkdir -p ./dags ./logs ./plugins
echo -e "AIRFLOW_UID=$(id -u)\nAIRFLOW_GID=0" > .env
깃헙 게시글 : https://github.com/apache/airflow/discussions/16801
‘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을 이용해 airflow를 사용중에 dag를 수정할 일이 생겼다. VSCODE를 이용해서 수정을 하였으나, 권한이 없다는 문구와 함께 저장이 불가능하였다.
sudo chown -R <계정명> <작업폴더>
안녕하세요~ 데브코스 데이터 엔지니어링 3기 수강생입니다.
올려주신 글 도움 되었습니다. 감사합니다!