2.4 MetricQueryServiceGateway
从上一步,可以知道调用了MetricQueryServiceGateway
的queryMetrics
接口,具体的实现MetricQueryService
类的queryMetrics
方法,代码如下:
@Override public CompletableFuture<MetricDumpSerialization.MetricSerializationResult> queryMetrics( Time timeout) { return callAsync( () -> enforceSizeLimit(serializer.serialize(counters, gauges, histograms, meters)), timeout); }
再看看callAsync
方法:
可以得知,本质就是使用了rpcServer
去远程调用了接口获取指标了(具体调用了哪里呢?)。
我们看看RpcEndpoint
这个类。
2.5 RpcEndpoint
我们看看RpcEndpoint
这个类的方法结构:
从这些方法名,我们可以知道,它类似于一个HTTP
服务器,从而我们也可以知道,原来Flink
的Web
页面访问的服务器就是这个了。在看看其构造方法:
看看里面是怎么开启服务的:
可以知道,是调用了AkkaRpcService
的startServer
方法去开启了服务。
好了,这里暂时该停止了,因为偏离了本文的中心,我们需要知道的是这些指标具体从哪里来的?那该如何进行下一步呢?
我们再回到2.4
里面的MetricQueryService
类,看看这个类是如何构造的?(这里前后连贯性很强)。
2.6 MetricQueryService
可以看到MetricQueryService
这个类里面有一个createMetricQueryService
方法,这个方法指的就是创建指标查询服务:
看看在哪里调用了这个方法:
可以在指标服务注册中心(MetricRegistryImpl
)里面的startQueryService
方法调用了,再看看哪里调用了startQueryService
这个方法:
可以看到有3个地方开启了这个指标的服务,分别是:
- ClusterEntrypoint:
Flink
集群入口点的基类 - MiniCluster:
MiniCluster
在本地执行Flink
任务 - TaskManagerRunner:在
yarn
或standalone
模式下,这个类是任务管理器的可执行入口点。它构建相关组件(网络、I/O
管理器、内存管理器、RPC
服务、HA
服务)并启动。
为了方便理解,这里解读本地执行Flink
任务的模式就好了,即继续研读MiniCluster
。
2.7 MiniCluster
在MiniCluster
的start()
方法,可以看到了调用了startQueryService
方法
继续看看里面的metricQueryServiceRpcService
入参,可以知道,metricQueryServiceRpcService
(指标查询服务)是从配置里初始化来的。
继续看看configuration
配置:
可以得知,配置是从miniClusterConfiguration
里获取的,继续深入:
发现,配置是从构造函数里获取的,继续看看哪里调用了MiniCluster
这个类的构造函数方法:
调用这个方法的类有很多,根据命名,可以得知较为合理的是LocalExecutor
这个类。
2.8 LocalExecutor
我对LocalExecutor的理解:一个用于执行本地Pipelines
(例如:多条FlinkSQL
)的执行器。
看看哪里调用了MiniCluster
的构造方法:
继续看看哪里调用了create
方法,可以得知在LocalExecutorFactory
里的getExecutor方法调用了:
Ctrl+T
,可以看到在ExecutionEnviroment
和StreamExecutionEnviroment
里调用了:
哦豁,这不是我们日常做Flink
开发常用的两个类了么。随便打开StreamExecutionEnviroment
这个类看看。
2.8 StreamExecutionEnviroment
可以看到,在里面的executeAsync
方法代用了:
到这里,我们知道了配置是从用户初始化StreamExecutionEnviroment
传入的。
03 小结
具体指标的参数从哪里获取,我们有了一个很好的分析思路了,我们可以自己编写一个Flink的程序,使用的是StreamExecutionEnviroment
,然后断点本文的源码,就知道来龙去脉了。
本文由于篇幅原因,在下一篇博客继续讲解。