开篇
我们这次文章主要和大家分享一下,如何使用Flink 原生的RPC 也就是经过Flink封装Akka之后的RPC程序来进行完成一个需求。
需求概述
1、两个进程JobManager、TaskManager
2、当TaskManager启动的时候,向JobManager发送注册信息,报告本地的内存、CPU
3、当JobManager收到注册消息的时候,返回给TaskManager注册成功的消息
4、TaskManager每间隔三秒向JobManager发送心跳消息
5、JobManager每间隔3秒扫描一下,有哪些TaskManager下线
我们先来实现注册的需求。
我们需要一个接口来实现注册:
我们可以看到我们编写的接口继承了RpcGateway,因为在Flink中所有的RPC功能都需要继承这个基类,也就是老祖宗。
那么既然接口有了,我们就实现一个Endpoint,因为在Flink RPC中 Endpoint是对RPC框架中提供具体服务的实体的抽象,只要提供RPC接口服务的话,也就是可以让远程调用你的方法,那么就必须要实现这个类。
既然我们的Endpoint也有了,我们就可以启动JobManager了
public class JobManager {
private static final ConcurrentSkipListSet<String> taskManagerIds = new ConcurrentSkipListSet<>();
public static void main(String[] args) throws Exception {
/**
* 1. 创建AkkaSystem相当于团队,先创建团队
*/
ActorSystem jobManagerDefaultSystem = AkkaUtils.createDefaultActorSystem();
/**
* 2. RpcService是RpcEndpoint(Actor)的运行时环境。通过RpcService可以获取RpcEndpoint
*/
AkkaRpcService taskManagerRpcService =
new AkkaRpcService(jobManagerDefaultSystem, AkkaRpcServiceConfiguration.defaultConfiguration());
/**
* 定义一个注册接口,可以让TaskManager进行访问
*/
RegisterRpcEndpoint jobManagerRegisterRpcEndpoint = new RegisterRpcEndpoint(taskManagerRpcService);
jobManagerRegisterRpcEndpoint.start();
/**
* 因为是Demo,并且flink源码我们还没有看不知道taskmanager怎么拿到的jobmanager的地址
* 可能有这几种情况:
* 1、jobmanager启动taskmanager的时候在启动中传入的
* 2、taskmanager找yarn要的。
* 3、其他的方式。
* 我们呢就简单的来,当jobmanager启动起来的时候,就写入到一个文件中。
*/
String registerRpcEndpointAddress = jobManagerRegisterRpcEndpoint.getAddress();
writeAddress(registerRpcEndpointAddress);
/**
* 此时JobManager启动起来了,这个时候我们就等待其他组件调用我们的方法就好了
*/
}
private static void writeAddress(String address) throws Exception {
File file = new File("./jobmanager-info.txt");
BufferedWriter writer = new BufferedWriter(new FileWriter(file, false));
writer.write(address);
writer.close();
}
}
既然JobManager已经起来了,我们就看下TaskManager应该怎么做。
public class TaskManager {
public static void main(String[] args) throws Exception{
/**
* 1. 创建AkkaSystem相当于团队,先创建团队
*/
ActorSystem taskManagerDefaultSystem = AkkaUtils.createDefaultActorSystem();
/**
* 2. RpcService是RpcEndpoint(Actor)的运行时环境。通过RpcService可以获取RpcEndpoint
*/
AkkaRpcService taskManagerRpcService =
new AkkaRpcService(taskManagerDefaultSystem, AkkaRpcServiceConfiguration.defaultConfiguration());
/**
* 通过 taskManagerRpcService 链接 Jobmanager发送 注册消息。
*/
String jobMangerAddress = getJobMangerAddress();
JobManager.RegisterGateWay registerGateWay = taskManagerRpcService.connect(jobMangerAddress, JobManager.RegisterGateWay.class).get();
/**
* 调用服务端的方法,进行注册
*/
boolean registerReturn = registerGateWay.register(UUID.randomUUID().toString());
if (registerReturn){
System.out.println("注册成功!!!");
}
}
private static String getJobMangerAddress() throws Exception{
while(true){
File file = new File("./jobmanager-info.txt");
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
String s = bufferedReader.readLine();
if (s != null){
return s;
}
}
}
}
我们分别启动JobManager和TaskManager,我们看一下效果
JobManager:
TaskManager
此时我们可以看到我们的注册功能正常运行,那么还剩下一个心跳功能,我相信很简单,我这里就不实现了,有兴趣的大佬们,可以进行一下code 。
这些知识都是我学习来的一些东西,我也是一个菜鸡,只是想把自己学到的东西记录一下,生成自己的一些知识做一些记录以后找的时候方便,现在免费分享给大家,谢谢大家的观看。