当前位置: 首页 > news >正文

PyFlink Debugging从“看不到日志”到“精准定位 UDF 性能瓶颈”

1. 日志体系:Client Side vs Server Side(别搞错位置)

1.1 Client Side Logging(提交端日志)

适用:UDF 之外的代码,比如建表、拼 SQL、打印 schema、构建 pipeline 的过程。

frompyflink.tableimportEnvironmentSettings,TableEnvironmentimportlogging env_settings=EnvironmentSettings.in_streaming_mode()table_env=TableEnvironment.create(env_settings)table=table_env.from_elements([(1,'Hi'),(2,'Hello')])logging.warning(table.get_schema())print(table.get_schema())

关键点:

  • Client 侧默认日志级别是WARNING
  • 所以logging.info(...)通常你看不到,想看就用warning/error或调整 logging 配置

1.2 Server Side Logging(TaskManager 日志)

适用:Python UDF 内部,也就是你怀疑逻辑不对、数据不对、性能不对的时候。

frompyflink.tableimportDataTypesfrompyflink.table.udfimportudfimportlogging@udf(result_type=DataTypes.BIGINT())defadd(i,j):logging.info("debug info in TM log")print("debug print in TM log")returni+j

关键点:

  • Server 侧默认日志级别是INFO
  • 你的 UDF 里的logging.info默认是能看到的(在 TaskManager 日志里)

2. 日志落盘位置:你到底去哪找

2.1 如果设置了 FLINK_HOME

日志一般在:

  • $FLINK_HOME/log/

2.2 如果没设置 FLINK_HOME(本地/IDE 经常这样)

日志会写到pyflink 模块目录下的 log 目录。官方给了一个一行命令直接定位:

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

你可以把它作为博客里的“找日志最快方法”。

3. 调试 Python UDF:本地调试 vs 远程断点

3.1 Local Debug(本地 IDE 调试)

适合:你跑的是本地 mini cluster / 或者你只是想先把 Python 函数本身逻辑跑通。
做法:直接在 PyCharm/IDEA 的 Python 环境里对函数断点、单步即可。

建议小技巧:

  • 把 UDF 的核心逻辑提成普通 python 函数(纯函数),本地先测
  • 再包一层 udf/udtf/udaf 上到 Flink

3.2 Remote Debug(远程断点调试 UDF)

适合:UDF 真正在 TaskManager 上跑,你想“断点进去看运行时数据”。

步骤(你贴的内容我给你补成可跑的顺序):

  1. PyCharm 创建远程调试监听
  • Run -> Python Remote Debug ->+-> 选端口,比如6789
  1. 安装 pydevd-pycharm
pipinstallpydevd-pycharm
  1. 在 UDF 里插入 settrace
importpydevd_pycharm pydevd_pycharm.settrace('localhost',port=6789,stdoutToServer=True,stderrToServer=True)
  1. 启动 PyCharm 的 Debug Server
  2. 提交/运行 Flink 作业
    断点命中后你就能看变量、堆栈、逐行执行。

实战注意点(经验坑位):

  • localhost只有在“Python worker 能访问到你 PyCharm 所在机器”时才成立

    • 如果 Python worker 在远程机器/容器里,通常要改成你的开发机 IP,且确保端口可达
  • 分布式并行度 > 1 时,可能多个 subtask 同时尝试连 debug server

    • 初次建议把 parallelism 调成 1,先把链路跑通

4. Profiling:定位“慢到底慢在哪个函数”

官方给的是一个开关:

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

开启后,profiling 结果会周期性输出到 TaskManager 日志里。

实战建议:

  • Profiling 输出周期和你前面那套配置有关:python.fn-execution.bundle.sizepython.fn-execution.bundle.time会影响“多久吐一次 profile”
  • 如果你 bundle 非常大,profile 可能很久才出一份;排障时可以先把 bundle 调小,让 profile 更快出现

5. 一套“排障顺序”你可以直接写进博客

  1. 先确认日志位置:用那条 python 命令定位 log 目录
  2. 先打 Client 侧日志:确认 schema、DDL、SQL 拼接、配置是否生效
  3. 再打 UDF 侧日志:在 TaskManager 日志里看数据是否符合预期
  4. 逻辑不对:上 Remote Debug 断点看真实输入输出
  5. 性能不对:开python.profile.enabled=true看热点函数,再回头调 bundle/arrow/chaining/execution-mode
http://www.jsqmd.com/news/230893/

相关文章:

  • 情感计算在AI Agent中的应用:增强LLM的EQ
  • 03-01:MQ常见问题梳理
  • 移动设备传感器通信协议全解析
  • PyFlink 两件事说清楚就够了
  • Python包管理器 uv是否替代conda?
  • 【车辆路径规划】基于matlab人工势场法APF与快速探索随机树算法RRT全向车辆路径规划【含Matlab源码 14913期】
  • 2026必备!8个AI论文工具,继续教育学生轻松搞定论文格式规范!
  • Pandas比MySQL快?
  • VisionPro二开之相机类设计2
  • 2025年普通人怎么转向大模型?实战+落地+不空谈指南,非常详细收藏我这一篇就够了
  • DeepSeek-V4春节发布:AI编程能力新突破,超越GPT系列,技术人必看!收藏学习!
  • Python中同步异步编程原来是这样!附代码案例
  • 大模型技术入门:程序员如何抓住AI风口,抢占职场先机_35岁程序员抓住风口,转行AI大模型
  • Orange,可以拖拉拽的Python数据挖掘软件,强烈推荐~
  • 通信原理篇---双极性不归零码的功率谱密度
  • Anthropic大模型智能体评估全攻略:理论+实践,助你成为AI专家
  • 通信原理篇---单极性不归零码功率谱密度
  • HCIP代码小练-2
  • HCIP代码小练-1
  • 【Java集合】深入浅出 Java HashMap:从链表到红黑树的“进化”之路
  • 虚拟机假死?SSH 能连却卡 Logo 界面
  • 踩坑三个月,我用 Blazor 重构了一个 AI UI 协议,这些教训值得你看看
  • Java Web的学习路径
  • 通信原理篇---单极性归零码与双极性归零码
  • 【无人机路径规划】基于快速随机扩展树算法RRT避开长方体、圆柱体、球体三类障碍物,生成从起点到终点的无碰撞路径附matlab代码
  • C++ IDE
  • 浩思动力混动系统赋能吉利雷达金刚PHEV高性能皮卡上市
  • 《Numba AOT编译核心技术:斩断JIT启动延迟的实操手册》
  • 图像形态学+边缘检测及CNN关联
  • 连锁饮品店安全用电白皮书:能源设备智能管控与预警