디버깅

디버깅 (Debugging)

이 페이지는 PyFlink에서 디버깅하는 방법을 설명해요.

출처: 문서

본문

로깅 정보 (Logging Infos)

클라이언트 측 로깅 (Client Side Logging)

Python UDF 밖의 위치에서 PyFlink 작업(job) 내의 print 또는 표준 Python logging 모듈을 통해 컨텍스트 및 디버그 정보를 로깅할 수 있어요. 로깅 메시지는 작업 제출(submission) 중에 클라이언트의 로그 파일에 출력돼요.

from pyflink.table import EnvironmentSettings, TableEnvironment

# create a TableEnvironment
env_settings = EnvironmentSettings.in_streaming_mode()
table_env = TableEnvironment.create(env_settings)

table = table_env.from_elements([(1, 'Hi'), (2, 'Hello')])

# use logging modules
import logging
logging.warning(table.get_schema())

# use print function
print(table.get_schema())

참고: 클라이언트 측의 기본 로깅 레벨은 WARNING이므로, 로깅 레벨이 WARNING 이상인 메시지만 클라이언트의 로그 파일에 나타나요.

서버 측 로깅 (Server Side Logging)

Python UDF 내에서 print 또는 표준 Python logging 모듈을 통해 컨텍스트 및 디버그 정보를 로깅할 수 있어요. 로깅 메시지는 작업 실행 중에 TaskManager의 로그 파일에 출력돼요.

from pyflink.table import DataTypes
from pyflink.table.udf import udf

import logging

@udf(result_type=DataTypes.BIGINT())
def add(i, j):
    # use logging modules
    logging.info("debug")
    # use print function
    print('debug')
    return i + j

참고: 서버 측의 기본 로깅 레벨은 INFO이므로, 로깅 레벨이 INFO 이상인 메시지만 TaskManager의 로그 파일에 나타나요.

로그 접근하기 (Accessing Logs)

환경 변수 FLINK_HOME이 설정되어 있으면 로그는 FLINK_HOME 아래의 log 디렉터리에 작성돼요. 그렇지 않으면 로그는 PyFlink 모듈의 디렉터리에 배치돼요. 다음 명령으로 PyFlink 모듈의 로그 디렉터리를 찾을 수 있어요:

$ python -c "import pyflink;import os;print(os.path.dirname(os.path.abspath(pyflink.__file__))+'/log')"

Python UDF 디버깅하기 (Debugging Python UDFs)

로컬 디버그 (Local Debug)

PyCharm과 같은 IDE에서 직접 Python 함수를 디버깅할 수 있어요.

원격 디버그 (Remote Debug)

PyCharm의 pydevd_pycharm 도구를 사용해 Python UDF를 디버깅할 수 있어요.

  1. PyCharm에서 Python Remote Debug를 생성해요

    run -> Python Remote Debug -> + -> 포트를 선택해요 (예: 6789)

  2. pydevd-pycharm 도구를 설치해요

    $ pip install pydevd-pycharm
    
  3. Python UDF에 다음 명령을 추가해요

    import pydevd_pycharm
    pydevd_pycharm.settrace('localhost', port=6789, stdoutToServer=True, stderrToServer=True)
    
  4. 이전에 생성한 Python Remote Debug 서버를 시작해요

  5. Python 코드를 실행해요

Python UDF 프로파일링하기 (Profiling Python UDFs)

성능 병목을 분석하기 위해 프로파일을 활성화할 수 있어요.

t_env.get_config().set("python.profile.enabled", "true")

그런 다음 로그에서 프로파일 결과를 볼 수 있어요 (로그 접근하기 참고).

더 알아보기 (Learn more)