背景
电力行业客户反馈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.ExecutionException: Boxed ErrorCaused by: java.util.concurrent.ExecutionException: Boxed ErrorCaused 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源码,本地复现验证,最终解决该问题。文章发布于微信公众号:大数据从业者,其它均为转载,原创不易,欢迎您点赞关注推荐转发,谢谢!





