Flink运行时之基于Netty的网络通信上

本文介绍了Flink运行时TaskManager之间基于Netty的通信机制,包括NettyConnectionManager、NettyBufferPool、NettyClient和NettyServer的作用。NettyConnectionManager管理网络连接,NettyBufferPool控制内存分配,NettyClient和NettyServer分别负责客户端和服务端的通信初始化。此外,文章还探讨了Netty的高性能特性,如Linux系统的原生套接字通信支持。
摘要由CSDN通过智能技术生成

概述

本文以及接下来的几篇文章将介绍Flink运行时TaskManager间进行数据交换的核心部分——基于Netty通信框架远程请求ResultSubpartition。作为系列文章的第一篇,先列出一些需要了解的基础对象。

NettyConnectionManager

Netty连接管理器(NettyConnectionManager)是连接管理器接口(ConnectionManager)针对基于Netty的远程连接管理的实现者。它是TaskManager中负责网络通信的网络环境对象(NetworkEnvironment)的核心部件之一。

一个TaskManager中可能同时运行着很多任务实例,有时某些任务需要消费某远程任务所生产的结果分区,有时某些任务可能会生产结果分区供其他任务消费。所以对一个TaskManager来说,其职责并非单一的,它既可能充当客户端的角色也可能充当服务端角色。因此,一个NettyConnectionManager会同时管理着一个Netty客户端(NettyClient)和一个Netty服务器(NettyServer)实例。当然除此之外还有一个Netty缓冲池(NettyBufferPool)以及一个分区请求客户端工厂(PartitionRequestClientFactory,用于创建分区请求客户端PartitionRequestClient),这些对象都在NettyConnectionManager构造器中被初始化。

每个PartitionRequestClientFactory实例都依赖一个NettyClient。也就是说所有PartitionRequestClient底层都共用一个NettyClient。

Netty客户端和服务器对象的启动和停止都是由NettyConnectionManager统一控制的。NettyConnectionManager启动的时机是当TaskManager跟JobManager关联上之后调用NetworkEnvironment的associateWithTaskManagerAndJobManager方法时。而当TaskManager跟JobManager解除关联时停止。

NettyBufferPool

NettyClient和NettyServer在实例化Netty通信的核心对象时都需要配置各自的“字节缓冲分配器”用于为Netty读写数据分配内存单元。Netty自身提供了一个池化的字节缓冲分配器(PooledByteBufAllocator),但Flink又在此基础上进行了包装并提供了Netty缓冲池(NettyBufferPool)。此举的目的是严格控制所创建的分配器(Arena)的个数,转而依赖TaskManager的相关配置指定。

什么是Arena?当指定PooledByteBufAllocator来执行ByteBuf分配时,最终的内存分配工作被委托给类PoolArena。由于Netty通常用于高并发系统,所以各个线程进行内存分配时竞争不可避免,这可能会极大的影响内存分配的效率,为了缓解高并发时的线程竞争ÿ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值