大数据技术栈中的技术组件非常丰富,大致总结一下各大常见组件的 RPC 实现技术:
技术组件 | RPC 实现 |
Hadoop | NIO + Protobuf |
HBase | HBase-2.x 以前:NIO + ProtoBuf HBase-2.x 以后:Netty |
ZooKeeper | BIO + NIO + Netty |
Spark | Spark-1.x 基于 Akka Spark-2.x 基于 Netty |
Flink | Akka + Netty |
Flink 的 RPC 实现:基于 Scala 的网络编程库: Akka
Akka 的特点总结:
1、它是对并发模型进行了更高的抽象;
2、它是异步、非阻塞、高性能的事件驱动编程模型;
3、它是轻量级事件处理(1GB 内存可容纳百万级别个 Actor);
几个储备知识:关于对 Akka 的 ActorSystem 和 Actor 的理解:
1、ActorSystem 是管理 Actor 生命周期的组件,Actor 是负责进行通信的组件
2、每个 Actor 都有一个 MailBox,别的 Actor 发送给它的消息都首先储存在 MailBox 中,通过这种 方式可以实现异步通信。
3、每个 Actor 是单线程的处理方式,不断的从 MailBox 拉取消息执行处理,所以对于 Actor 的消息处 理,不适合调用会阻塞的处理方法。
4、Actor 可以改变他自身的状态,可以接收消息,也可以发送消息,还可以生成新的 Actor
5、每一个ActorSystem 和 Actor都在启动的时候会给定一个 name,如果要从ActorSystem中,获取一 个 Actor,则通过以下的方式来进行 Actor的获取: akka.tcp://actorsystem_name@bigdata02:9527/user/actor_name 来进行定位
6、如果一个 Actor 要和另外一个 Actor进行通信,则必须先获取对方 Actor 的 ActorRef 对象,然 后通过该对象发送消息即可。
7、通过 tell 发送异步消息,不接收响应,通过 ask 发送异步消息,得到 Future 返回,通过异步回到返回处理结果。
关于 Actor 类似的概念:
1、HDFS : proxy
2、Akka : ActorRef
3、Flink : XXXGateWay
在阅读 Flink 源码过程中,如果有这种类型的代码,其实就是在发送 RPC 请求
// resourceManagerGateway 就可以理解成: 当前节点中,对于 ResourceManager 代理对象的封装
resourceManagerGateway.requestSlot();
// 代码跳转到:resourceManager.requestSlot();
Spark 中的 RpcEndpoint ,在作用上,等同于 Akka 中的 Actor
Spark 的 RPC 实现虽然是为了替换 Akka 而诞生的,但是它实际上可以看成一个简化版的 Akka,仍然遵循许多 Actor Model 的抽象。例如:
RpcEndpoint 对应 Actor
RpcEndpointRef 对应 ActorRef
RpcEnv 对应 ActorSystem
Flink 中的 RPC 实现主要在 flink-runtime 模块下的 org.apache.flink.runtime.rpc 包中,涉及到的最重要的 API 主要是以下这四个:
组件 | 意义 |
RpcGateway | 用于远程调用的代理接口。 RpcGateway 提供了获取其所代理的 RpcEndpoint的地址的方法。在实现一个提供 RPC 调用的组件时,通常需要先定一个接口,该接口继承 RpcGateway 并约定好提供的远程调用的方法。 |
RpcServer | 相当于 RpcEndpoint 自身的的代理对象(self gateway)。RpcServer 是RpcService 在启动了 RpcEndpoint 之后返回的对象,每一个 RpcEndpoint 对象内部都有一个 RpcServer 的成员变量,通过 getSelfGateway 方法就可以获得自身的代理,然后调用该 Endpoint 提供的服务。 |
RpcEndpoint | 对 RPC 框架中提供具体服务的实体的抽象,所有提供远程调用方法的组件都需要继承该抽象类。另外,对于同一个 RpcEndpoint 的所有 RPC 调用都会在同一个线程(RpcEndpoint 的“主线程”)中执行,因此无需担心并发执行的线程安全问题。 |
RpcService | RpcService是 RpcEndpoint 的运行时环境,RpcService 提供了启动 RpcEndpoint , 连接到远端 RpcEndpoint 并返回远端 RpcEndpoint 的代理对象等方法。此外,RpcService 还提供了某些异步任务或者周期性调度任务的方法。 |
简单总结:
1、RpcGateway 路由,RPC的老祖宗,各种其他RPC组件,都是 RpcGateWay 的子类
2、RpcServer RpcService(ActorSystem)和 RpcEndpoint(Actor)之间的粘合层
3、RpcEndpoint 业务逻辑载体,对应的 Actor 的封装
4、RpcService 对应 ActorSystem 的封装
RPC类图结构
RpcEndpoint 下面有四个比较重要的子类:
1、TaskExecutor 集群中从节点中最重要的角色,负责资源管理
2、Dispatcher 主节点中的一个工作角色,负责 job 调度执行
3、JobMaster 应用程序中的主控程序,类似于 Spark 中的 Driver 的作用,或者 MapReduce 中的 ApplicationMaster
4、ResourceManager 集群中的主节点 JobManager 中的负责资源管理的角色,和TaskExecutor 一 起构成资源管理的主从架构
当在任意地方发现要创建这四个组件的任何一个组件的实例对象的时候,创建成功了之后,都会要去执行他的 onStart() ,因为他们都是 RpcEndpoint 的子类,在集群启动的源码分析中,其实这些组件的很多的工作流程,都被放在 onStart() 里面。