akka和netty在flink和spark中的使用

四、akka 是为了通信,不适合大数据量的传输,像hadoop flink hbase 这些后面都用netty 来做节点间数据的传输

RPC是什么

网络通信需要遵守相同的通信协议,RPC即远程过程调用协议,一种通过网络从远程计算机上请求服务而不需要了解底层网络传输技术的协议。

特点:

  1. 调用远程就像调用本地一样。   (其实就是屏蔽了细节)
  2. 网络协议和网络IO模型对RPC调用者透明
  3. 网络传输的信息格式对RPC调用者透明

akka和netty是什么?有什么区别

Akka:基于Actor的RPC通信系统;基于协程,性能好;基于scala的偏函数,易用性高。但它只是RPC通信,无法适用大的package/stream的数据传输,这也是Spark引入Netty来代替Akka的原因。

Netty:基于java NIO,相比更加基础一点,可以为不同的应用层通信协议(RPC,FTP,HTTP等)提供支持。

Akka

Akka最重要的是它的Actor模型。

Actor模型

在使用Java进行并发编程时需要特别的关注锁和内存原子性等一系列线程问题,而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用Actors模型进行并发编程可以很好地避免这些问题,Actor由状态(state)、行为(Behavior)和邮箱(mailBox)三部分组成。

  • 状态(state):Actor中的状态指的是Actor对象的变量信息,状态由Actor自己管理,避免了并发环境下的锁和内存原子性等问题
  • 行为(Behavior):行为指定的是Actor中计算逻辑,通过Actor接收到消息来改变Actor的状态

Akka 行为是描述actor如何响应消息的不可变对象。它定义了actor在收到特定消息时应执行的操作。比如说一个计数器Actorr,它维护着一个整数计数,当接收到特定消息1时,他会做加法;当接收到特定消息2时,他会做减法;

  • 邮箱(mailBox):邮箱是Actor和Actor之间的通信桥梁,邮箱内部通过FIFO消息队列来存储发送方Actor消息,接受方Actor从邮箱队列中获取消息。

Actor的基础是消息通信,使用Actor的优势:

(1)事件模型驱动–Actor之间的通信是异步的,即使Actor在发送消息后也无需阻塞或者等待就能够处理其他事情;

(2)强隔离性–Actor中的方法不能由外部直接调用,所有的一切都通过消息传递进行的,从而避免了Actor之间的数据共享,想要观察到另一个Actor的状态变化只能通过消息传递进行询问;

(3)位置透明–无论Actor地址是在本地还是在远程机上对于代码来说都是一样的;

(4)轻量性–Actor是非常轻量的计算单机,单个Actor仅占400多字节,只需少量内存就能达到高并发。

在Actor模型中,所有的实体被认为是独立的Actor。Actor和其他Actor通过发送异步消息通信。Actor模型的强大来自异步。也可以使用同步模式执行同步操作,但不建议使用同步消息,因为它们限制了系统的伸缩性。每个Actor有一个邮箱(Mailbox),用于存储所收到的消息。另外,每一个Actor维护自身单独的状态。一个Actor网络如图所示。

每个Actor是一个单一的线程,它不断地从其邮箱中拉取消息,并且连续不断地处理。对于已经处理过的消息的结果,Actor可以改变它自身的内部状态,或者发送一个新消息,或者孵化一个新的Actor。

Akka的通信

Akka有两种核心的异步通信方式:tell和ask。

1.tell方式

当使用tell方式时,表示仅仅使用异步方式给某个Actor发送消息,无须等待Actor的响应结果,并且也不会阻塞后续代码的运行,如:其中,第一个参数为消息,它可以是任何可序列化的数据或对象,第二个参数表示发送者,一般是另外一个Actor的引用,ActorRef.noSender()表示无发送者(实际上是一个叫作deadLetters的Actor)。

tell属于发了就完,什么都不管的类型。

2.ask方式

当需要从Actor获取响应结果时,可使用ask方法,ask方法会将返回结果包装在scala.concurrent.Future中,然后通过异步回调获取返回结果,调用方逻辑如代码所示。

ask发送完,还要在一定时间等待被发送方返回结果,如果指定超时时间(上面代码中的timeout字段)无返回结果,则抛出异常。(异步)

接收方必须通过getSender().tell(reply, getSelf()) 发送回应来为返回的 Future 填充数据。

ask 操作包括创建一个内部临时actor来处理回应,必须为这个内部actor指定一个超时期限,过了超时期限内部actor将被销毁以防止内存泄露。

netty

netty是基于java nio的

Java NIO (非阻塞 I/O) 是一种 I/O 模型,它允许应用程序在不阻塞线程的情况下与 I/O 设备(例如网络套接字)进行交互。N是non-blocking的意思。

NIO是注意几个关键词:Java NIO: Channels and Buffers(通道和缓冲区)、Non-blocking IO(非阻塞IO)、Selectors(选择器)。

具体可以参考:

【Flink】第三十篇:Netty 之 Java NIO-腾讯云开发者社区-腾讯云

netty是什么

Netty是一个NIO客户端-服务器框架。Netty支持快速、简单地开发网络应用程序,如协议服务器和客户机,大大简化了网络编程,如TCP和UDP套接字服务器。Netty经过精心设计,并积累了许多协议(如ftp、smtp、http)的实施经验,以及各种二进制基于文本的遗留协议。因此,Netty成功找到了一种方法,可以在不妥协的情况下实现轻松的开发、性能、稳定性和灵活性。

Netty是典型的Reactor模型结构,Reactor模型就是将消息放到一个队列中,通过异步线程池对其进行消费。

netty的基本工作流程

无论是服务器还是客户端都会关联一个channel(socket),channel上会绑定一个pipeline,pipeline绑定若干个handler,用来专门用来处理和业务有关的东西,handler有DownHandler和UpHandler两种,DownHandler用来处理发包,UpHandler用来处理收包,大致过程如下图所示。

flink中akka通信流程

actor是一个包含状态和行为的容器。

Akka在Flink中用于三个分布式技术组件之间的通信,他们是JobClient,JobManager,TaskManager。Akka在Flink中主要的作用是用来充当一个coordinator的角色。

它们之间的一些通信流程如下图所示:

上图中三个使用Akka通信的分布式组件都具有自己的actor系统。

Flink 中的 Akka 通信遵循以下机制:

  1. **Actor 创建:**每个 Flink 组件(例如 JobManager、TaskManager)都创建自己的 ActorSystem。然后,它们创建 Actor 来处理特定任务。
  2. **消息发送:**Actor 使用 tell 方法向其他 Actor 发送消息。
  3. **消息处理:**接收 Actor 使用 receive 方法处理收到的消息。
  4. **消息路由:**Akka 使用路由器将消息路由到正确的 Actor。Flink 使用各种路由策略,例如随机路由、轮询路由和广播路由。
  5. **异常处理:**Akka 提供异常处理机制,以便在出现错误时通知 Actor。

flink中netty通信流程

详细流程可以参考:

Flink源码分析——Task数据交互之Netty通信 - 知乎

总结下基本流程就是:

**1、**flink数据的通信采用的netty框架,分为客户端和服务端,每个taskmanager即是客户端也是服务端,客户端用于向上游任务请求数据,服务端用于接收下游客户端请求,将数据发送给下游任务,数据处理的逻辑都是在ChannelHandler中完成

**2、**在初始化TaskManager的时候,就会初始化NettyServer和NettyClient

3、消费端任务线程从InputGate中获取数据,而InputGate会调用requestPartitions()来向上游节点发起数据请求(按分区来获取数据),InputGate中有很多RemoteInputChannel,每个RemoteInputChannel会创建partitionRequestClient,通过partitionRequestClient向服务端发请求

4、创建完partitionRequestClient之后,就会发起数据请求,首先创建一个请求实例PartitionRequest,包含了请求的是哪个ResultSubPartition,和当前的RemoteInputChannel初始Credit**。Credit是信任消费凭证,简单来说就是消费者有多个credit,生产端就能给消费端发送多少个数据buffer(反压机制)**

5、生产者(服务端)接收到客户端的PartitionRequest之后,会给这个请求创建一个reader,即CreditBasedSequenceNumberingViewReader,这个reader随后会创建一个ResultSubpartitionView,reader就是通过这个ResultSubpartitionView来从对应的ResultSubpartition里读取数据。生产者的每个ResultSubPartition都会对应一个下游任务的请求(每个RemoteInputChannel消费一个ResultSubPartition),同时都会有一个reader。

**6、ResultSubpartitionView创建之后会立刻触发数据发送,触发PartitionRequestQueue.writeAndFlushNextMessageIfPossible()方法,简单来说数据的处理逻辑就是reader从ResultSubPartition中读取一个buffer,同时信任值credit减1;如果ResultSubPartition中还有可用的数据会继续入队被轮询读数据,**如果reader中的credit信任值等于0了,也不能再消费了;最后会将buffer进行封装发送给消费者,同时还封装了ResultSubPartition中的积压量信息

7、消费者同样调用CreditBasedPartitionRequestClientHandler.channelRead()来处理接收到的数据,先拿到这个消息的所属的InputChannel,然后从InputChannel中获取一个buffer。将接收到的消息数据拷贝到buffer中,再将buffer添加到RemoteInputChannel的buffer数据列表中,同时将自己入队到InputGate中,以便可以让自己继续被InputGate所轮询消费。

8、消费端RemoteInputChannel判断生产端的数据积压量,决定要向LocalBufferPool申请多少个空闲buffer,同时新申请的buffer数要反馈给生产者,增加生产者的credit值,以便生产者可以继续往消费者发送数据。当RemoteInputChannel有新的空闲buffer加入的时候,都会增加credit值,反馈给生产者。最终调用CreditBasedPartitionRequestClientHandler.writeAndFlushNextMessageIfPossible()发送AddCredit消息给生产者,也即Netty的服务端

9、生产者(服务端)再接收到credit信任值后,会给对应的reader增加credit值,意味着可以继续往消费者发送credit个数量的buffer了。

10、在此之后,生产者、消费者之间将循环进行这个数据交互过程,生产者将数据发送给消费者,消费者反馈credit给生产者(消费者有多个credit,生产端就能给消费端发送多少个数据buffer–反压机制),使得数据可以进行持续的生产、消费

spark中netty通信流程

一些概念

RpcEnv

RpcEnv 管理各个 RpcEndpoint 并将发送自 RpcEndpointRef 或远程节点的消息分发给对应的 RpcEndpoint。

RpcEndpoint

RPCEndpoint是一个通信实体,定义了如何处理消息(即,使用哪个函数来处理指定消息),在通过 name 向Dispatcher完成注册后,RpcEndpoint 就一直存放在 RpcEnv 中。Endpoint和EndpointRef以键值对的形式放在ConcurrentHashMap中。RpcEndpoint 的生命周期按顺序是 onStart,receive 及 onStop,receive 可以被同时调用,如果希望 receive 是线程安全的,可以使用 ThreadSafeRpcEndpoint。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
img

12824516063)]
[外链图片转存中…(img-wfuPOYi9-1712824516063)]
[外链图片转存中…(img-RmqEfw8f-1712824516063)]
[外链图片转存中…(img-Z2ZVG6vd-1712824516064)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-xCz7vsZm-1712824516064)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值