티스토리 뷰

반응형

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)

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함