flink源码系列:RPC通信

Flink源码阅读(四)JobManager和TaskManager的rpc 引言 我们知道,jobmanager和taskmanager在集群模式下,是部署在不同机器上面的,那么现在就有一个问题,jobmanager和taskmanager是如何相互调用的。 分析 切入点 1 考虑以taskExecutor方法的submitTask方法为入口,查看调用关系 图中并没有提供明显的线索,看RpcTaskManagerGateway所处的包,猜测其位于JobManager,然后... 阅读详情


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实现
1HadoopNIO
2SparkSpark1(Akka),Spark2(Netty)
3FlinkAkka+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)
                .build();
    }

    /**
     * 处理具体消息
     * @param message
     */
    private void handleMessage(final PekkoData message) {
        /** 获取发送者,发送者对应的就是actorRef */
        ActorRef sender = getSender();
        ActorRef self = getSelf();
        /** 打印 */
        System.out.println("PekkoRpcReceiverActor类收到:" +sender + ":发送者=>" + message.getInfo());
        /** 回复消息 向发送者sender 回复word 的消息 回复者是当前actorRef*/
        /** 4、Actor 可以改变他自身的状态,可以接收消息,也可以发送消息,还可以生成新的 Actor  */
        sender.tell(new PekkoData("word"),self);

    }
}
3.3.2.3.PekkoRpcSenderActor 类

1.PekkoRpcSenderActor 发送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 PekkoRpcSenderActor extends AbstractActor {
    /**
     * 实现接收消息
     * @return
     */
    @Override
    public Receive createReceive() {
        return ReceiveBuilder.create()
                /**接收到PekkoData消息交给handleMessage处理
                 * flink PekkoRpcActor 155行也是这样处理的
                 */
                .match(PekkoData.class, this::handleMessage)
                .build();
    }


    private void handleMessage(final PekkoData message) {
        /** 获取发送者,发送者对应的就是actorRef */
        ActorRef sender = getSender();
        /** 打印 */
        System.out.println("PekkoRpcSenderActor类收到:" +sender + ":发送者=>" + message.getInfo());

    }
}
3.3.2.4. Demo 类

1.创建ActorSystem,名字为flink
2.获取PekkoRpcReceiverActor的ActorRef这样就可以进行发送消息了、接收消息了
3.获取PekkoRpcSenderActor的ActorRef这样就可以进行发送消息了、接收消息了
4.通过PekkoRpcSenderActor的actorRef 向PekkoRpcReceiverActor发送消息
5.PekkoRpcReceiverActor类中的createReceive接收到消息后会匹配类型转入handleMessage
6.打印信息,然后通过自身actorRef 向PekkoRpcSenderActor回复消息
7.PekkoRpcSenderActor的createReceive方法接收到后转入handleMessage
8.打印回复信息。
9结束程序。

package com.source.pekko;

import org.apache.pekko.actor.ActorRef;
import org.apache.pekko.actor.ActorSystem;
import org.apache.pekko.actor.Props;

public class Demo {
    public static void main(String[] args) {
        /**创建actorSystem*/
        ActorSystem actorSystem = ActorSystem.create("flink");
        /**构建PekkoRpcActor的ActorRef*/
        ActorRef pekkoRpcRef = actorSystem.actorOf(Props.create(PekkoRpcReceiverActor.class), "PekkoRpcReceiverActor");
        /**构建PekkoRpcSenderActor的ActorRef*/
        ActorRef pekkoRpcSenderRef = actorSystem.actorOf(Props.create(PekkoRpcSenderActor.class), "PekkoRpcSenderActor");
        /** pekkoRpcSenderActor作为发送者 向PekkoRpcActor发送 hello*/
        pekkoRpcRef.tell(new PekkoData("hello"),pekkoRpcSenderRef);
    }
}

运行结果
[图片]

3.4.Flink RPC通信

3.4.1Flink RPC整体架构

Flink RPC框架设计相对比较复杂,底层基于Pekko构建的通信系统,Java 动态代理构建RpcGateway接口的代理类
Flink RPC UML图
[图片]

如上图 Flink RPC UML图
1.RpcGateway接口Flink RPC底层通信用到的动态代理,动态代理中使用的目标类实现的接口最终都是RpcGateway(也就是说动态代理创建的接口最上层都是RpcGateway)
2.RpcEndpoint消息通信组件,底层都有的通信实体都要继承RpcEndpoint
3.FenceRpcEndpoint类是内部会有一个fenceToken发送消息的时候两个 token一样的时候才能发成功,FencePekkoInvocationHandler、FenceRpcGateway也一样
4.RpcEndpoint 内部使用到了RpcService、RpcService
5.RpcService就是用来服务Flink RPC通信的服务类,内部会创建RpcEndpoint的自身代理,获取远程代理。RpcService实现类是PekkoRpcService
6.RpcService 在具体通信类构建对象的时候super父类构造器也就是RpcEndpoint类的时候会初始化RpcServer代表自身代理。
7.PekkoInvocationHandler、FencePekkoInvocationHandler实现了java InvocationHandler接口,也就是说他们里面肯定有实现的invoke方法
8.Dispatcher及其子类、ResourceManager及其子类、JobMaster最终都继承了RpcEndpoint,也就是说他们都具备了通信的特质

3.4.2.RpcGateway

Rpc网关,用于远程调用的代理接接口,RPC通信的接口都继承RpcGateway,java动态代理类最终创建。
Proxy类:这个类提供了创建动态代理类和实例的静态方法。

public static Object newProxyInstance(ClassLoader loader,                                       Class<?>[] interfaces,                                       InvocationHandler h)  
interfaces=>实现了RpcGateWay的接口
如:ResourceManagerGateway、JobMasterGateway、TaskExecutorGateway

3.4.3.RpcEndpoint

1)RpcEndpoint抽象类中定义了RPC组件的基本实现,所有需要实现RPC服务的组件都会继承RpcEndpoint,
RpcEndpoint内部包含了endpointId 用来标识当前RPC节点的唯一标识,RpcEndpoint借助RpcService启动RpcServer。
2)FencedRpcEndpoint继承RpcEndpoint,内部增加了fencingToken字段,实现了FencedRpcEndpoint的节点都会有一个fencingToken,当远程RPC调用时,会比较访问者和被访问者的fencingToken是否一致,一致了才会进行后续操作。
3)FencedRpcEndpoint实现类有ResourceManager、JobMaster、TaskExecutor,RpcEndpoint的实现类有TaskExecutor

3.4.4.RpcService

创建时间ClusterEntrypoint 开始启动集群初始化的时候

private RpcService commonRpcService;
ClusterEntrypoint .runCluster ->
initializeServices ->
 commonRpcService =
                    RpcUtils.createRemoteRpcService(
                            rpcSystem,
                            configuration,
                            configuration.get(JobManagerOptions.ADDRESS),
                            getRPCPortRange(configuration),
                            configuration.get(JobManagerOptions.BIND_HOST),
                            configuration.getOptional(JobManagerOptions.RPC_BIND_PORT));

内部提供了RpcServer的创建和启动方法,启动RpcServer(startServer)过程中,通过RpcEndpoint地址创建Akka actor实例,并基于Actor实例构建RpcServer接口的动态代理类
connect方法:连接到所提供地址下的远程rpc服务器。返回一个rpc网关(代理对象),该网关可以用于与rpc服务器通信

3.3.5.RpcServer

创建时间RpcEndpoint 构建的时候创建
RpcServer接口通过PekkoInvocationHandler动态代理类实现,所有远程获本地的执行请求,最终都会转换到PekkoInvocationHandler代理类中执行,也就是InvocationHandler的invoke方法
public ResourceManagersuper() ->
protected FencedRpcEndpoint super() ->
RpcEndpoint -> this.rpcServer = rpcService.startServer(this);
核心点:所有RpcEndpoint启动的时候调用start()方法,最终都会流转到RpcEndpoint的onStart()方法
原因如下:

ClusterEntrypoint.dispatcherResourceManagerComponentFactory.create() ->
DefaultDispatcherResourceManagerComponentFactory.create ->
resourceManagerService.start() ->
ResourceManagerServiceImpl.start() ->
StandaloneLeaderElection.startLeaderElection->
ResourceManagerServiceImpl.grantLeadership->
startNewLeaderResourceManager()->
startResourceManagerIfIsLeader->resourceManager.start();
RpcEndpoint.start ->
    public void start() {
        rpcEndpoint.tell(ControlMessages.START, ActorRef.noSender());
    }
   ===========================================
PekkoRpcActor.createReceive() ->
handleControlMessage() ->
StoppedState.start() ->
RpcEndpoint.internalCallOnStart()->
onStart()

3.3.6.PekkoRpcActor

继承了AbstractActor,实现了createReceive(),也就是说Flink RPC 所有通信都会被createReceive
之后根据消息类型流转到对应的handleMessage(),消息类型有RemoteHandshakeMessage握手消息、ControlMessages 控制类消息比如start,其他消息(RpcInvocation)
暂时无法在飞书文档外展示此内容

3.3.7.场景引导方式查看源码

假设设计一个TaskExecutor进程 向ResourceManager进程注册,如何设?
1.TaskExecutor、ResourceManager要是可以进行通信的(RpcEndpoint)
1.TaskManager要能获取到ResourceManager的代理对象(TaskExecutorGateway、ResourceManagerGateway)
2.TaskManager获取到代理对象之后要知道调用ResourceManager的那个方法进行注册(ResourceManagerGateway.registerTaskExecutor)
3.要实现有能连接ResourceManager进程的通信服务(RpcService)
4.建立通信连接后要有能处理消息的公共类(PekkoRpcActor)
5.满足以上条件了,就相当于TaskManager、ResourceManager本身就是一个可以通信的进程,本地通信 自己与自己通信(RpcServer)
基于上面的设计,我们从Flink代码中可以找到对应的实现类、接口

3.5.TaskExecutor向ResourceManager注册 debug

TaskExecutor创建对象启动的时候会触发 onStart方法
Flink 内部所有的RpcEndpoint 实现(TaskExecutor,ResourceManager、JobMaster)等第一次启动都会触发onstart方法的执行,这是pekko的内部机制
1.进入到TaskExecutor的onStart方法后,调用startResourceManagerServices启动相关的服务
[图片]

startResourceManagerServices方法内部做了如下操作
2.resourceManagerLeaderRetriever监听服务中构建一个ResourceManagerLeaderListener会监听ResourceManager Leader,该类中的notifyLeaderAddress方法会在第一次启动、ResourceManager Leader的时候触发
3.启动taskSlotTable(后面章节进行分析)
4.启动jobLeaderService(后面章节进行分析)

[图片]

4.notifyLeaderAddress方法会在第一次启动、ResourceManager Leader的时候触发,直接进去方法内部
[图片]

5.获取ResourceManager地址
6.reconnectToResourceManager真正向ResouceManager注册的方法
[图片]

7.关闭历史已经连接的ResourceManager
8.启动注册超时时间
9.试图连接ResourceManager(内部会调用connectToResourceManager)
[图片]

10.方法内部调用继续下一步
[图片]

11.TaskExecutorRegistration是TaskExecutor在注册到ResourceManager时提供的信息
12.TaskExecutorToResourceManagerConnection维护TaskExecutor与ResourceManager的连接
13.start真正连接注册的方法

[图片]

14.检查状态
15.createNewRegistration()注册成功、注册失败会回调方法
16.newRegistration.startRegistration()开始注册
[图片]

17.调用RpcService.connect(内部就会用到java动态代理)
[图片]

18.调用connectInternal方法创建代理类
19.FencedPekkoInvocationHandler刚好是实现了InvocationHandler
[图片]

20.调用ask方法进行握手,保证ResourceManager能正常通信
[图片]

21.Proxy.newProxyInstance创建代理实现
[图片]

22.创建完代理类会通过异步编程调用register同时代理对象作为参数
[图片]

23.invokeRegistration真正触发调用的方法进入实现类看
[图片]

24.实现类中的invokeRegistration方法内部调用了resourceManager.registerTaskExecutor方法,此时还没有发送到ResourceManager,方法会流转到PekkoRpcActorl类中。
[图片]

25.消息会跳转到PekkoInvocationHandler类的invoke方法
26.判断本地消息还是远程消息,因为ResourceManager是远程消息,所以会调用invokeRpc
[图片]

[图片]

27.将方法参数等封装成RpcInvocation,然后调用Pekko底层的ask发送消息
28.消息会被到PekkoRpcActor类中的方法所接收
[图片]
[图片]

在这里插入图片描述

29.PekkoRpcActor类中createReceive方法接收到数据,流转到handleMessage方法中

[图片]

30.handleMessage方法中会解析出来RpcInvocation获取到方法、参数、参数类型
31.通过java反射机制调用method.invoke 传入参数最终向目标类发送消息
[图片]

32.最后进入到ResourceManager.registerTaskExecutor方法

[图片]

如愿以偿进入最终我们预想的方法。

Flink源码解析:大数据环境下的RPC调用 通过深入理解Flink中RPC调用的实现,我们可以更好地理解Flink的内部工作原理,并为分布式数据处理提供更高效的解决方案。在Flink的内部实现中,RPC(远程过程调用)是一种重要的通信机制,用于在不同的组件之间进行交互和调用。发送RPC响应:在RPC服务器端,处理完RPC调用后,需要将执行结果封装成RPC响应消息,并发送给RPC客户端。方法发起RPC调用请求。注册RPC服务:在RPC服务器端,需要先注册RPC调用的处理逻辑。处理RPC调用:在RPC服务器端,当接收到RPC调用请求后, 阅读详情

相关推荐

【Flink】Flink 源码之RPC调用

1.概述 转载:Flink 源码之RPC调用 2.简介 本篇为大家分析Flink底层RPC调用的执行过程和原理。Flink RPC使用了Akka Actor框架。建议阅读前需要Akka Actor的基础知识。 Flink为了简化Actor的使用,对Actor做了一系列封装。定义了如下几个重要的接口或类: RpcService:定义了RPC服务端(调用和被调用端)的一系列行为,远程调用需要指定地址和端口号。包含服务的启停,和连接其他远程的RpcService。 AkkaRpcService:RpcS.

九师兄 1239

Flink RPC初探

RPC( Remote Procedure Call ) 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。总而言之:RPC是为了解决分布式系统中,各个服务中的调用问题,在进行远程调用时,也像本地调用一样方便,让调用者感知不到远程调用的逻辑。技术组件RPC实现HDFSNettyHBase。

weixin_44852067的博客 1981

Flink通信组件RPC在大数据处理中的应用

RPC作为一种分布式计算的通信模式,为Flink中的任务调度和协调提供了重要的支持。通过RPC,Flink可以实现任务之间的通信和协作,确保大规模数据的高效处理和结果的准确性。本文将介绍RPC的概念、在Flink中的应用以及提供相应的源代码示例。通过RPC的方式,Flink中的任务可以实现跨节点的通信和协调,使得分布式任务能够高效地处理大规模数据集,并保证任务的正确性和一致性。以上就是关于Flink通信组件RPC在大数据处理中的应用的详细介绍,同时也提供了相应的源代码示例。二、RPC在Flink中的应用。

pytorchCode的博客 180

【Flink集群RPC通讯机制(二)】创建AkkaRpcService、启动RPC服务、实现相互通信

【Flink集群RPC通讯机制(二)】创建AkkaRpcService、启动RPC服务、实现相互通信

hiliang521的博客 1659

【FLink】Flink 源码阅读笔记(4)- RPC

文章目录1.概述2.例子3.主要抽象4.基于 Akka 的 RPC 实现4.1 启动 RpcEndpoint4.2 获取 RpcEndpoint 的代理对象4.3 Rpc 调用4.4 AkkaRpcActor小结 1.概述 转载:Flink 源码阅读笔记(4)- RPC 相关文章: 【Flink】Flink 源码之RPC调用 Flink】FLink 通讯组件 RPC 作为一个分布式系统,Flink 内部不同组件之间通信依赖于 RPC 机制。这篇文章将对 Flink 的 RPC 框架加以分析。 2.例子 先

九师兄 531

Flink源码解析:大数据中的RPC调用

本文对Flink源码中的RPC调用进行了详细解析。RPC调用是大数据领域中分布式系统通信的核心技术之一,而Flink作为一款强大的流式数据处理框架,其RPC调用功能为我们提供了便捷和高效的分布式计算能力。Apache Flink作为一种流式数据处理框架,通过其强大的RPC(远程过程调用)功能,实现了不同节点之间的通信和任务协调。以上就是关于Flink源码中RPC调用的内容解析,希望对你理解Flink的RPC机制有所帮助。包下的相关类是Flink对Netty的封装和定制化实现,用于实现高性能的网络通信。

BugCrusher的博客 180

Flink 源码系列 - 前言

本文介绍了Flink源码学习系列的前言,规划。

qq_43552242的博客 2112

SAP License:SAP会计凭证抬头的字段状态控制

FI模块的同事一般都知道在FI中有个字段状态变式,可以控制在凭证输入时哪些字段是必输、哪些可选哪些隐藏,但这只对凭证行项目中有效,你是否想过对于凭证抬头的字段是哪控制呢? 在中国,会计附件上都要带一个附件张数字段,但SAP的默认配置中没有这一字段,并非SAP没有设置此字段,而是我们没有配置这一字段。如果需要在凭证输入时放出分支号(BRNCH)、附件页数(NUMPG)等字段,在个人参数文件中加入参数CSF,参数值AR,即可。如下图: 实际上,这是对凭证国家的一个设置,在SAP中,配置了AR这个国家..

SAP权限管控|SAP用户权限管理|SAP权限合规检查|SAP全日志管理 2226

【Flink】网络通信剖析-RPC通信源码

RPC,即远程过程调用(Remote Procedure Call),是一种通过网络从远程计算机程序上请求服务的技术,而无需了解底层网络技术的协议。在RPC中,客户机和服务器位于不同的机器上,客户端通过网络调用在服务器端运行的过程,并将结果发送回客户机。这种技术允许程序像调用本地过程一样调用远程过程,使得跨平台、跨机器的服务调用成为可能。

smallbag66666的博客 586

FPGA数字下变频实战:用Vivado DDS IP核实现IQ采样与频率校正(附MATLAB仿真对比)

本文提供了一份基于Vivado DDS IP核实现FPGA数字下变频(DDC)的完整工程指南。详细阐述了IQ采样的原理、DDC链路构建、DDS频率校正的工程实现,并重点介绍了如何利用MATLAB搭建黄金参考模型进行全链路仿真与对比验证,分享了关键的调试技巧与性能优化建议。

t1u2v的博客 811

Zotero+Obsidian+Bookxnote联动让文献阅读丝滑般体验

摘录文字或图片到Obsidian

weixin_43694742的博客 1万+

Flink源码之RPC

因此实现一个具体的Component只要同时继承RpcGateway和RpcEndPoint就能实现将RpcGateway的业务接口暴露出去提供远程服务,在JobManager/TaskManger启动过程中,都是先创建一个RpcService实例,然后new出各个业务组件实例,这样各个组件完成初始化后就能各司其职,协调配合完成具体业务功能。组件间通信基于Actor, 负责RPC通信功能则被抽象成一个RPCEndPoint。这些接口的具体实现就是组件提供的核心功能。

jinjiating的专栏 884

在WinXP操作系统上安装Tornado2.2详细教程

使用VxWorks的人都想在自己的电脑中装VxWorks的编译器Tornado,然而Win10操作系统对于Tornado并不友好,根本装不成功。而对于Win7操作系统,之前在实验室一台Win7上装Tornado成功过,并且一直在上面进行vx开发,但是过一段时间在其他Win7上装Tornado时又不能成功,由此说明Tornado对于Win7操作系统对Tornado的兼容也不是很好,所以想要长久使用T...

weixin_43822311的博客 4482

flink网络通信剖析(组件rpc通信)并基于akka实现rpc框架

背景 最近阅读了flink 1.10版本网络通信部分的相关源码,网络部分主要有两块: 组件之间的rpc调用(akka) taskManager之间的数据传输(netty实现) 本文主要解析flink底层是如何使用akka封装的rpc,并模仿flink的设计方式,基于akka实现一个简单的rpc通信框架。 组件RPC通信架构 flink底层的rpc调用主要分为RpcEndPoint、RpcService、RpcServer、GateWay三个模块。 RpcEndPoint:每个组件的基本实现,主要包含

weixin_45626756的博客 1794

nnU-Net v2实战:从零开始配置环境与训练自定义医学影像数据集

本文详细介绍了nnU-Net v2在医学影像分割中的实战应用,从环境配置到自定义数据集训练的全流程。重点讲解了Python 3.9+环境搭建、PyTorch安装技巧、医学影像数据预处理规范,以及五折交叉验证训练方法,帮助开发者快速掌握这一先进的医学影像分析工具。

weixin_28718487的博客 352

基于Simulink的防空导弹六自由度弹道建模与仿真实战

本文详细介绍了基于Simulink的防空导弹六自由度弹道建模与仿真方法。通过分析导弹动力学原理、Simulink环境配置、气动力建模、推进与控制系统设计等关键环节,提供了一套完整的实战指南。文章特别强调了六自由度模型在防空导弹仿真中的重要性,并分享了常见问题排查与优化建议,为相关领域工程师提供实用参考。

apple5的专栏 868

深度了解flink rpc机制(四) 组件启动流程源码分析

目前已发布了3篇关于Flink RPC相关的文章,分别从底层通信系统akka/Pekko,RPC实现方式动态代理以及Flink RPC相关的组件做了介绍深度了解flink rpc机制(一)-Akka/Pekko_flink pekko akka-优快云博客深度了解flink rpc机制(二)-动态代理-优快云博客深度了解flink rpc机制(三)-组件以及交互-优快云博客这篇文章通过分析源码,对以上知识进行验证并串联加深印象,更深入的了解Flink RPC的实现原理。

qq_40689430的博客 1789

华为OD机试双机位C卷-用户入网定期复评(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【用户入网定期复评】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【用户入网定期复评】。

qq_45776114的博客 841

Flink RPC 详解

参考spark rpc 总览 总结: ActorSystem 和 Actor/ActorRef 的概念,工作方式,通信方式等,注意异步和 mailbox 这两个概念 1、ActorSystem 是管理 Actor生命周期的组件, Actor是负责进行通信的组 2、每个 Actor 都有一个 MailBox,别的 Actor 发送给它的消息都首先储存在 MailBox 中,通过这种 方式可以实现异步通信。 3、每个 Actor 是单线程的处理方式,不断的从 MailBox 拉取消息执行处理,所以对于 Act

m0_46449152的博客 977

索尼IMX316 标定_ToF模块相机校准

很多东西一开始给出去的并不是最优的方案,而是在客户端支持中,以及在持续不断的芯片验证中,发现还可以这么做,还能够再提升Sensor的性能,所以说这是一个持续的过程。曾经听说过一个故事,在某厂里ST产品一直作为第一供应商多年,然后近段时间即将被新兴公司的ToF产品所打败,性能报告已经出来,但是ST并没有更新产品,而是在原有产品更新了固件以及标定流程,此时产品的性能又是超越其他供应商的产品。相机矩阵不考虑镜头失真,因为理想的针孔相机没有镜头。为了准确地代表一个真实的相机,相机模型包括径向和切向的镜头畸变。

dream it possible 1155

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Flink源码剖析

执行环境 ExecutionEnvironment数据抽象 DataSet DataStream逻辑操作 Source Transformation Sink1. 获取执行环境2. 通过执行环境对象,注册数据源Source,得到数据抽象3. 调用数据抽象的各种Transformation执行逻辑计算4. 将各自Transformation执行完毕之后得到的计算结果数据抽象注册Sink5. 提交Job执行。

weixin_37172178的博客 2609

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Flink RPC源码流程

Flink RPC源码流程

qq_52142181的博客 2158

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[flink-002] flink的rpc机制

1.rpc接口 flink的rpc机制基于akka,源码位于flink项目路径flink-runtime/src/main/java/org/apache/flink/runtime/rpc。 关于akka,可以参考本博客的https://blog.youkuaiyun.com/lizhe_dashuju/article/details/98040346。 akka的通信机制本质相当简单,以本地通信为例...

大数据和机器学习研究 1185

Flink - 源码阅读笔记(RPC 详解)

大数据技术栈中的技术组件非常丰富,大致总结一下各大常见组件的 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

qq_34735235的博客 1234

【Flink集群RPC通讯机制(三)】AkkaRpcActor设计与实现:接收RPC消息以及处理逻辑

【Flink集群RPC通讯机制(三)】AkkaRpcActor设计与实现:接收RPC消息以及处理逻辑

hiliang521的博客 1367

flink如何基于Pekko实现RPC调用

通过阅读flink源码,了解flink是如何基于Pekko实现远程RPC调用的

wy53111的博客 1330
上一篇: flinksql 回撤流中主键发生变更的影响(group by中的值发生改变)
下一篇: flinksql BUG : flink hologres-cdc source FINISHED
Direction_Wind
博客等级 码龄8年 6438粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Direction_Wind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值