티스토리 뷰
반응형
DAG 를 만들었는데, 로직이 로딩되지 않았고, 로그를 뒤져보니 아래와 같은 오류가 발생했다. 오류가 나는 현상을 역추적해보니 dag 를 구성한 python 로직에 한글주석이 존재할 경우 아래와 같은 오류가 발생함을 발견했다.
UnicodeEncodeError: 'charmap' codec can't encode characters in position 217-220: character maps to <undefined>
[2023-02-01 18:23:52,445] {logging_mixin.py:115} INFO - [2023-02-01 18:23:52,445] {dag.py:2439} INFO - Creating ORM DAG for my_test_dag
[2023-02-01 18:23:52,459] {logging_mixin.py:115} INFO - [2023-02-01 18:23:52,459] {dag.py:2968} INFO - Setting next_dagrun for my_test_dag to 2023-02-01T09:22:00+00:00, run_after=2023-02-01T09:23:00+00:00
[2023-02-01 18:23:52,475] {processor.py:164} ERROR - Got an exception! Propagating...
Traceback (most recent call last):
File "/home/airflow/py3/lib/python3.9/site-packages/airflow/dag_processing/processor.py", line 155, in _run_file_processor
result: Tuple[int, int] = dag_file_processor.process_file(
File "/home/airflow/py3/lib/python3.9/site-packages/airflow/utils/session.py", line 71, in wrapper
return func(*args, session=session, **kwargs)
File "/home/airflow/py3/lib/python3.9/site-packages/airflow/dag_processing/processor.py", line 660, in process_file
dagbag.sync_to_db()
...생략...
File "/home/airflow/py3/lib/python3.9/site-packages/MySQLdb/cursors.py", line 199, in execute
args = tuple(map(db.literal, args))
File "/home/airflow/py3/lib/python3.9/site-packages/MySQLdb/connections.py", line 275, in literal
s = self.string_literal(o.encode(self.encoding))
File "/usr/local/lib/python3.9/encodings/cp1252.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 217-220: character maps to <undefined>
해결방법
결론부터 말하면, mysql 에 utf8 캐릭터셋을 이용해서 연결정보를 구성했는데, 관련이력을 저장하지 못해서 나타나는 문제였다.
airflow.cfg 에서 sql_alchemy_conn 설정값 맨뒤에 ?charset=utf8 을 추가후 재기동하면 정상 동작함을 확인했다.
...
[database]
sql_engine_encoding = utf-8
# before : 문제되던 설정
# sql_alchemy_conn = mysql://{db_name}:{db_pwd}@{호스트}:{포트}/airflow
# after : 해결된 설정
sql_alchemy_conn = mysql://{db_name}:{db_pwd}@{호스트}:{포트}/airflow?charset=utf8
...
사실 이 문제는 java 에서 jdbc 환경에서도 자주 겪던 현상이라, 파라미터값 문제일거라고 예상했었는데, java 에서는 mysql jdbc url 을 해결할때 characterEncoding 라는 파라미터였기 때문에, 실패하고 이 문제는 아닐꺼라고 생각하고 엉뚱한곳을 더 찾았던게 더 시간이 걸렸던거 같다. (python 에서는 ?charset=utf8 , java 에서는 ?useUnicode=true&characterEncoding=utf8)
반응형
'데이터처리 > Airflow' 카테고리의 다른 글
[airflow.cfg] sql_alchemy_conn 의 escape 처리하기 - @ 가 있는 암호문제 (1) | 2023.04.14 |
---|---|
[Airflow] mac 에서 airflow 빌드시 오류 : './airflow/www/compile_assets.sh' returned non-zero exit status 127 (0) | 2023.04.05 |
[Airflow] execution_date 값 포맷변경과 타임존 문제 해결하기 (2) | 2023.02.23 |
[Airflow] 웹서버의 LOG 에 찍힌 날짜가 다르게 나오는 문제 해결하기 - timezone 계산 버그 (0) | 2023.02.22 |
[Airflow] docker run 명령어를 DockerOperator 로 구성해보기 (예시) (0) | 2023.02.21 |
댓글