这里写目录标题
https://qwr78tzaus4.feishu.cn/drive/folder/Geumf5oe7lKrnTdAZLzcQn9Bnqc
https://qwr78tzaus4.feishu.cn/docx/K1fsdEbrgo6C0lxYktkc7FOEnQb
https://www.bilibili.com/video/BV16z421m741/?p=2&vd_source=4fd37f941817afccac1a77e31fec6be7
1. 本节课目的
核心点
1.精通Flink RPC框架整体设计
2.彻底理解Flink RPC底层是如何通信的
用到的知识点
1.ResourceManager:主要负责Flink集群中的计算资源,其中计算资源主要来自TaskManager注册。
2.TaskManager(TaskExecutor):TaskManager负责向整个集群提供Slot计算资源。TaskManager会调用registerTaskExecutor()方法向ResourceManager注册
2.开始本节内容
2.1.RPC概念
RPC,即远程过程调用(Remote Procedure Call),是一种通过网络从远程计算机程序上请求服务的技术,而无需了解底层网络技术的协议。在RPC中,客户机和服务器位于不同的机器上,客户端通过网络调用在服务器端运行的过程,并将结果发送回客户机。这种技术允许程序像调用本地过程一样调用远程过程,使得跨平台、跨机器的服务调用成为可能。
1.两个进程间的相互调用
2.集群中不同节点服务的通信
3.2.大数据组件常见的RPC实现技术
序号 | 生态圈技术 | RPC实现 |
---|---|---|
1 | Hadoop | NIO |
2 | Spark | Spark1(Akka),Spark2(Netty) |
3 | Flink | Akka+Netty(Pekko+Netty) |
3.3.Pekko(Akka)
3.3.1. Akka、Pekko基本概念
Flink1.18版本内部RPC通信封装用的是Apache Pekko。Apache Pekko是Akka 2.6.x的一个分支。为什么会改因为Akka将来Apache许可证更改为Business Source License (BSL) v1.1,该协议不是开源的。
Akka、Pekko 用于构建高并发、分布式、可容错、事件驱动的开发库。
1、提供基于异步非阻塞、高性能的事件驱动编程模型
2、轻量级的事件处理(每GB堆内存几百万Actor)
3、使用Akka可以在单机上构建高并发程序,也可以在网络中构建分布式程序。
注意:Akka是基于Actor模型的并发框架,每个Actor的实例在运行时只占用非常少的资源,大约只有300字节。这意味着在1G的内存中可以容纳接近300万个Actor,这使得Akka在处理大量并发请求时能够保持高效的内存使用。
1、ActorSystem 是管理 Actor 生命周期的组件,Actor 是负责进行通信的组件
2、每个 Actor 都有一个 MailBox,别的 Actor 发送给它的消息都首先储存在 MailBox 中,通过这种方式可以实现异步通信。
3、每个 Actor 是单线程的处理方式,不断的从 MailBox 拉取消息执行处理,所以对于 Actor 的消息处理,不适合调用会阻塞的处理方法。
4、Actor 可以改变他自身的状态,可以接收消息,也可以发送消息,还可以生成新的 Actor
5、每一个 ActorSystem 和 Actor都在启动的时候会给定一个 name,如果要从 ActorSystem 中,获取一个 Actor,则通过以下的方式来进行 Actor 的
获取:pekko.tcp://flink@localhost:6123/user/rpc/resourcemanager_* 来进行定位
6、如果一个 Actor 要和另外一个 Actor 进行通信,则必须先获取对方 Actor 的 ActorRef 对象,然后通过该对象发送消息即可。
7、通过 tell 发送异步消息,不接收响应,通过 ask 发送异步消息,得到 Future 返回,通过异步回到返回处理结果。
8.如果构建actor进行通信,Pekko版本中必须继承AbstractActor 实现createReceive()方法
3.3.2.Pekko Demo事例
3.3.2.1.PekkoData 类
1.定义了通信的类型信息也就是PekkoData
2.内部声明一个 字符串类型的info
package com.source.pekko;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PekkoData {
private String info;
}
3.3.2.2.PekkoRpcReceiverActor类
1.PekkoRpcReceiverActor接收Actor类继承了AbstractActor
2.也就是说该类可以进行接收发送消息
3.接收消息会进入到createReceive
4.根据消息类型匹配进入到handleMessage
5.获取发送者、自身的ActorRef
6.打印信息并向发送者回复消息
package com.source.pekko;
import org.apache.pekko.actor.AbstractActor;
import org.apache.pekko.actor.ActorRef;
import org.apache.pekko.japi.pf.ReceiveBuilder;
/**
* 继承AbstractActor定义自己的actor
* Actor可以发送和接收消息
*/
public class PekkoRpcReceiverActor extends AbstractActor {
/**
* 实现接收消息
* @return
*/
@Override
public Receive createReceive() {
return ReceiveBuilder.create()
/**接收到PekkoData消息交给handleMessage处理
* flink PekkoRpcActor 155行也是这样处理的
*/
.match(PekkoData.class, this::handleMessage)