使用Flink Rpc模拟TaskManager向JobManager注册

开篇

我们这次文章主要和大家分享一下,如何使用Flink 原生的RPC 也就是经过Flink封装Akka之后的RPC程序来进行完成一个需求。

需求概述

image-20220313142903804

1、两个进程JobManager、TaskManager

2、当TaskManager启动的时候,向JobManager发送注册信息,报告本地的内存、CPU

3、当JobManager收到注册消息的时候,返回给TaskManager注册成功的消息

4、TaskManager每间隔三秒向JobManager发送心跳消息

5、JobManager每间隔3秒扫描一下,有哪些TaskManager下线

我们先来实现注册的需求。

我们需要一个接口来实现注册:

image-20220319174601993

我们可以看到我们编写的接口继承了RpcGateway,因为在Flink中所有的RPC功能都需要继承这个基类,也就是老祖宗。

那么既然接口有了,我们就实现一个Endpoint,因为在Flink RPC中 Endpoint是对RPC框架中提供具体服务的实体的抽象,只要提供RPC接口服务的话,也就是可以让远程调用你的方法,那么就必须要实现这个类。

image-20220319173707138

既然我们的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:

image-20220319174401885

TaskManager

image-20220319174438749

此时我们可以看到我们的注册功能正常运行,那么还剩下一个心跳功能,我相信很简单,我这里就不实现了,有兴趣的大佬们,可以进行一下code 。

这些知识都是我学习来的一些东西,我也是一个菜鸡,只是想把自己学到的东西记录一下,生成自己的一些知识做一些记录以后找的时候方便,现在免费分享给大家,谢谢大家的观看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值