Flink网络栈是Flink中的核心组件,是flink-runtime模块的一部分。它连接了所有TaskManager中独立的工作单元(subtask)。这是数据交换的核心部分,任务的吞吐量和延迟都与它息息相关,可以说Flink的网络栈决定了Flink框架本身性能的好坏。
不同于TaskManager、JobManager之间通信所使用的Akka RPC框架,Flink网络栈采用了更底层的网络API,使用的是Netty框架。
它抽象了以下三个概念的不同设置。
【资料图】
工作单元的输出类型和调度类型是紧密交织在一起的,两者的特定组合才有效。Pipelined result partition是流式的输出,流式输出需要将数据发送到一个正在工作的工作单元,因此目标任务就需要在上游结果下发之前或者在任务启动之初完成部署。批作业产出有限的结果,而流式作业产出无限的结果。
为了理解真实的数据流转,我们假想一个有4个并发的任务,部署在两个分别有2个Slot的TaskManager上。在Flink中,不同的任务可能会共享同一个Slot, 通过Slot 共享组机制,一个TaskManager可以提供多个Slot来运行一个任务的多个工作单元。
TaskManager 1 运行工作单元A.1、A.2、B.1 和 B.2, 而TaskManager 2 运行工作单元A.3、A.4、B.3和B.4。假设A和B之间的shuffle方式是keyBy(), 这样在每一个TaskManager上都有2×4个逻辑连接,有些走本地传输,有些是通过网络传输,如图1所示。
▲图1 工作单元部署
不同任务之间的每个(远程)网络连接都将在Flink网络栈中获得自己的TCP通道,如果同一个任务的不同工作单元被调度到同一个TaskManager上,那么它们将复用TCP连接用于连接远程TM(多路复用)。在我们的例子中,A.1 → B.3、A.1 → B.4 以及A.2 → B.3、A.2 → B.4将会复用一个TCP连接,如图2所示。
▲图2 数据交换
每个工作单元的输出被称作ResultPartition,每个ResultPartition又根据下游输出结果的不同分区被细分为ResultSubPartition,与下游的inputChannel一一对应。在这个阶段,Flink已经不再单独处理每条记录了,而是将一组序列化完的数据打包并复制到NetworkBuffer中,然后经由Netty传输到下游算子。
本文摘编于《Flink技术内幕:架构设计与实现原理》,经出版方授权发布。(书号:9787111696292)转载请保留文章来源。
X 关闭
X 关闭
- 1现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 2如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 3AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 4转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 5充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 6好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 7名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?
- 8亚马逊云科技成立量子网络中心致力解决量子计算领域的挑战
- 9京东绿色建材线上平台上线 新增用户70%来自下沉市场
- 10网红淘品牌“七格格”chuu在北京又开一家店 潮人新宠chuu能红多久