暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Flink源码天坑:电力行业数据湖项目Flink同步数据到Paimon作业正常WebUI指标一直loading问题定位总结

大数据从业者 2025-07-30
394

背景

电力行业客户反馈Flink1.20版本同步数据到Paimon数据湖场景,新上线业务Flink作业运行正常,但是WebUI页面Records Received/Sent、Bytes Received/Sent指标一直显示loading,效果如图所示:

本文从接口调用流程入手,通过梳理相关Flink源码,本地复现验证,最终解决该问题,源码有点坑。文章发布于微信公众号:大数据从业者,其它均为转载,原创不易,欢迎您点赞关注推荐转发,谢谢!

问题分析

刚开始以为是WebUI rest接口超时或者其他异常,F12查看接口发现没错误,不过接口返回为空。查看Flink JobManager日志也没WARN或ERROR记录。于是,决定从接口入手,探究下相关源码,rest接口如图所示:

完整rest接口与参数如下:

    /jobs/<jobID>/vertices/<verticID>/subtasks/metrics?get=backPressuredTimeMsPerSecond,busyTimeMsPerSecond,numRecordsInPerSecond

    源码中搜索接口路径/subtasks/metrics,可以看到后端对应于Flink runtime模块中的AggregatedSubtaskMetricsHeaders,如图所示:

    该Header对应的Handler是AggregatingSubtasksMetricsHandler,依次继承自Flink Runtime模块中的AbstractAggregatingMetricsHandler、AbstractRestHandler,AbstractHandler、LeaderRetrievalHandler,继续继承自Netty中的Handler类(不再列举),如图所示:

    毫无疑问,WebUI中其他rest接口都有对应的Handler,从源码看它们都继承自AbstractRestHandler,粗略统计大致有70个左右,如图所示:

    言归正传,回到一直loading的接口请求接收处理的方法是AbstractAggregatingMetricsHandler类handleRequest方法,如图所示:

    该方法中通过MetricFetcher类的update方法、fetchMetrics方法从JobManager和TaskManager拉取指标数据。在fetchMetrics方法中看到关键信息,通过CompletableFuture异步拉取指标数据时候,如果失败,不做任何处理,只是打印debug级别日志,如图所示:

    那么,一直loading是不是因为拉取指标失败造成的呢?现场协调一个作业重启打开DEBUG级别日志发现异常日志:

      DEBUG org.apache.flink.runtime.rest.handler.legacy.metrics.MetricFetcherImpl [] - Failed to fetch the TaskManager's metrics.
      java.util.concurrent.CompletionException: java.util.concurrent.ExecutionExceptionBoxed Error
      Caused by: java.util.concurrent.ExecutionExceptionBoxed Error
      Caused by: java.lang.NoSuchMethodError: org.apache.commons.math3.stat.descriptive.rank.Percentile.withNaNStrategy(Lorg/apache/commons/math3/stat/ranking/NaNStrategy;)Lorg/apache/commons/math3/stat/descriptive/rank/Percentile;

      既然有异常,只打印DEBUG日志,笔者感觉着实很坑!这个跟之前发文遇到的kafka offset定时提交失败不再重试却只打印debug日志一样的坑!!

      解决措施

      根据日志java.lang.NoSuchMethodError提示,梳理Flink源码发现内部使用commons-math3-3.6.1.jar,且该jar打包进flink-dist-1.20.0.jar。而客户业务作业依赖Jar引入了一个commons-math3-3.3.jar。

      解决方法:如果必要依赖,需要统一commons-math3版本与Flink内部版本保持一致!如果非必要依赖,通过exclusions剔除即可!

      复现验证

      实验室环境在已经flink的节点lib/目录,人为放置commons-math3-3.3.jar。运行简单的流式wrodcount,查看JobManager日志,问题成功复现:

        flink run -t yarn-per-job ../examples/streaming/SocketWindowWordCount.jar --port 4444

        结语

        本文从接口调用流程入手,通过梳理相关Flink源码,本地复现验证,最终解决该问题。文章发布于微信公众号:大数据从业者,其它均为转载,原创不易,欢迎您点赞关注推荐转发,谢谢!

        文章转载自大数据从业者,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论