FlinkRpc核心理解
其实在其他的大数据组件重也有类似于Actor类似的概念:
- HDFS:Proxy
- Akka:ActorRef
- Flink:XXXGateway 例如JobManager、TaskManager
- Akka的Actor 对应的是Flink的RpcEndpoint
- Akka的ActorRef对应的是Flink的XXXGateway
在我们阅读Flink的源码的过程中,经常会见到类似的代码,其他他就是在发送RPC的请求。
resourceManagerGateway.requestSlot()
在HDFS当中就相当于获取RPCServer的代理,来进行RPC调用
其实这么来看的话,Flink中的RpcEndpoint在作用上,等同于Akka中的Actor
在Flink中RPC的实现主要在flink-runtime的模块重的rpc包重,涉及到最重要的API主要是以下四个:
接口 | 含义 |
---|---|
RpcGateway | 用于远程调用的代理接口,RpcGateway接口提供了获取他的代理RpcEndpoint的地址的方法。在实现一个提供RPC调用的组件时,通常需要先定一个接口,该接口继承RpcGateway并约定好提供的远程调用的方法,也就相当于Akka的ActorRef对象 |
RpcServer | 相当于RpcEndpoint自身的代理对象,例如Akka中的self,在RpcService启动RpcEndpoint的时候返回的就是RpcServer,可以通过调用getSelfGateway方法就可以获取自身的代理,然后调用该Endpoint提供的服务。 |
RpcEndpoint | 对RPC框架中提供具体服务的实体的抽象,所有提供远程调用的类都需要继承这个抽象类,也就是说,在flink中只要提供Rpc接口,肯定需要实现继承RpcEndpoint |
RpcService | 是RpcEndpoint的运行时环境,RpcService提供了启动RpcEndpoint和连接到RpcEndpoint提供者并且返回RpcEndpoint的代理对象,供使用者获取RpcEndpoint来远程调用Rpc。 |
简单总结一下:
- RpcGateway 相当于RPC的老祖宗,所有的RPC组件都是他的孩子
- RpcServer RpcService(ActorSystem)和RpcEndpoint(Actor之间的黏合层)
- RpcEndpoint 业务逻辑的载体,对应的是Actor的封装
- RpcService 对应ActorSystem的封装
RpcEndpoint下面有四个重要的子类:
- TaskExecutor 这个就可以理解为TaskManager。
- Dispatcher 主要负责调度
- JobMastrt 应用程序中的主控程序,类似于Spark中的Driver。
- ResourceManager 集群中的主节点 JobManager中的负责资源管理的角色和TaskExecutor一起构成资源管理的主从架构
当我们在任意地方发现要创建这四个组件的对象的时候,创建成功了就会调用start方法,就类似于Actor启动成功就会调用preStart生命周期方法。然后就会去启动RpcEndpoint,然后就会执行他内部的onStart方法,其实在这里面有很多需要注意的地方,因为大部分重要的东西都在onStart里面初始化。
既然我们知道类图了,那么我们是否可以实现这个需求呢?
需求:
1、两个进程JobManager、TaskManager
2、当TaskManager启动的时候,向JobManager发送注册信息,报告本地的内存、CPU
3、当JobManager收到注册消息的时候,返回给TaskManager注册成功的消息
4、TaskManager每间隔三秒向JobManager发送心跳消息
5、JobManager每间隔3秒扫描一下,有哪些TaskManager下线
因为篇幅有限(比较晚了,想睡觉了),明天我们继续使用Flink的原生RPC接口实现这个需求。
为什么要这么着重的要看RPC这一块呢,因为在分布式系统中,如果不看懂这一块,熟悉这一块,看源码只会一会这里,一会哪里 都不知道在哪里了。
这些知识都是我学习来的一些东西,我也是一个菜鸡,只是想把自己学到的东西记录一下,生成自己的一些知识做一些记录以后找的时候方便,现在免费分享给大家,谢谢大家的观看。