当前位置: 首页 > news >正文

Flink 内部通信底层原理

        Flink 集群内部节点之间的通信是用 Akka 实现,比如 JobManager 和 TaskManager 之间的通信。而 operator 之间的数据传输是用 Netty 实现。

        RPC 框架是 Flink 任务运行的基础,Flink 整个 RPC 框架基于 Akka 实现。

一、相关概念

RPC(Remote Procedure Call)

概念

  • 定义:远程过程调用协议,允许程序像调用本地方法一样调用远程服务,隐藏底层网络通信细节。

  • 作用:在分布式系统中,实现跨节点的控制指令传递(如任务调度、状态同步等)。

  • Flink 中的应用

    • JobManager 与 TaskManager 之间的通信(任务部署、心跳检测、故障通知等)。

    • Checkpoint 协调、资源申请等分布式操作。

核心特点
  • 同步/异步调用:支持阻塞式调用或异步回调。

  • 序列化:参数和返回值需要序列化传输(如 Flink 使用 TypeSerializer)。

  • 容错:通过重试机制或超时处理保证可靠性。

Akka

概念
  • 定义:基于 Actor 模型的并发框架,提供高性能、分布式的消息驱动编程模型。

  • Actor 模型:每个 Actor 是独立执行单元,通过异步消息传递通信,天然支持分布式和容错。

  • Flink 中的应用

    • 早期版本(≤1.14):Flink 的 RPC 层基于 Akka 实现,JobManager 和 TaskManager 的通信通过 Akka Actor 完成。

    • 核心场景:任务调度、资源管理、Checkpoint 协调等控制层面的通信。

核心特点
  • 异步非阻塞:天然支持高并发和低延迟。

  • 容错机制:通过监督策略(Supervision)处理 Actor 故障。

  • 分布式扩展:Actor 可跨节点部署,形成分布式系统。

Netty

概念
  • 定义:基于 NIO 的高性能网络通信框架,专注于 TCP/UDP 数据传输。

  • 作用:提供可扩展的网络层实现,支持高吞吐量和低延迟的数据传输。

  • Flink 中的应用

    • 数据传输层:TaskManager 之间的数据交换(如 Shuffle、广播数据)。

    • 替代 Akka:从 Flink 1.15 开始,Netty 成为默认的 RPC 实现,逐步取代 Akka。

核心特点
  • 零拷贝:通过 ByteBuf 减少内存复制开销。

  • 事件驱动:基于 Channel 和 EventLoop 的高效 IO 处理。

  • 可插拔协议:支持 HTTP、WebSocket 等多种协议。

三者的关系

协作模式
  1. RPC 是通信协议

    • 定义了分布式节点间的交互方式(如方法调用、参数传递)。

    • Akka 或 Netty 是实现 RPC 的底层框架

      • 在早期版本,Flink 使用 Akka Actor 实现 RPC。

      • 新版本中,Flink 基于 Netty 实现 RPC(更轻量、无依赖)。

  2. Akka vs. Netty 的角色演变

    • Akka:早期负责控制流(任务调度、心跳)和 RPC。

    • Netty:始终负责数据流(Shuffle 数据传输);新版本接管 RPC 层。

  3. 分工与协同

    • 控制流(RPC):协调作业生命周期(如启动、停止)、资源管理。

    • 数据流(Netty):处理实际数据交换(如算子间的 Record 传输)。

架构演进
  • Flink 1.15+:为了减少对 Akka 的依赖(避免版本冲突),Flink 逐步将 RPC 层迁移到基于 Netty 的自研实现(flink-rpc 模块)。

  • 当前状态

    • 控制流:Netty-based RPC。

    • 数据流:Netty 网络栈(替代了早期的 Netty + Akka 混合模式)

二、Akka 与 Actor 模型

        Akka 是 Actor Model 的一个实现,在 Actor 模型中,所有的实体被认为是独立的 actors。actor 和其他 actor 通过发送异步消息通信。每个 actor 有一个邮箱(mailbox),它收到的消息存储在里面。每个 actor 维护自身单独的状态。

        下面是一个 Actors 网络:

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

相关文章:

  • CREATE TABLE ... AS SELECT
  • 如何有效防止服务器被攻击
  • 【MySQL】索引运算与NULL值问题详解:索引字段应尽量 NOT NULL ,NULL值不能参与部分索引运算
  • 【ESP32|音频】一文读懂WAV音频文件格式【详解】
  • HTTP 2.0 协议特性详解
  • Nginx Http配置整理
  • MQTT客户端核心架构解析:clients.h源码深度解读
  • 关于Java集合中对象字段的不同排序实现方式
  • 是德科技E5080B网络分析仪深度评测:5G/车载雷达测试实战指南
  • 小程序录音授权逻辑
  • 立创·泰山派RK3566开发板调试MIPI LCD
  • 自已实现一个远程打印方案 解决小程序或APP在外面控制本地电脑打印实现
  • 停止回答 docker启动redis
  • 青少年编程与数学 02-016 Python数据结构与算法 26课题、生物信息学算法
  • XC6SLX100T-2FGG484I 赛灵思 XilinxFPGA Spartan-6
  • 抽样信号——Sa函数sinc函数
  • java聊天室案例改进(建立与数据库的连接)
  • Chrome漏洞可窃取数据并获得未经授权的访问权限
  • rac环境下,增加一个控制文件controlfile
  • 从技术本质到未来演进:全方位解读Web的过去、现在与未来
  • 手机表面细菌菌落总数可能比马桶高10倍,医生详解如何洗手
  • 马上评|中学生被操场地面烫伤,谁的“大课间”?
  • 因港而兴,“长江黄金水道”上的宜宾故事
  • 美将解除对叙利亚制裁,外交部:中方一贯反对非法单边制裁
  • 长三角首次,在铁三赛事中感受竞技与生态的共鸣
  • 美国务卿鲁比奥将前往土耳其参加俄乌会谈