디버깅
디버깅 (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를 디버깅할 수 있어요.
-
PyCharm에서 Python Remote Debug를 생성해요
run -> Python Remote Debug -> + -> 포트를 선택해요 (예: 6789)
-
pydevd-pycharm도구를 설치해요$ pip install pydevd-pycharm -
Python UDF에 다음 명령을 추가해요
import pydevd_pycharm pydevd_pycharm.settrace('localhost', port=6789, stdoutToServer=True, stderrToServer=True) -
이전에 생성한 Python Remote Debug 서버를 시작해요
-
Python 코드를 실행해요
Python UDF 프로파일링하기 (Profiling Python UDFs)
성능 병목을 분석하기 위해 프로파일을 활성화할 수 있어요.
t_env.get_config().set("python.profile.enabled", "true")
그런 다음 로그에서 프로파일 결과를 볼 수 있어요 (로그 접근하기 참고).