栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

【Flink】反压原理和 内存管理

【Flink】反压原理和 内存管理

Spark Executor能跑多少个Task,由Core个数决定 反压原理

反压是指任务(Task)之间的现象;Task是线程,运行Task的是TaskManager进程,每个TaskManager中可以跑的Task数量是不确定的,1个Slot中可以跑1-n个Task;

Flink网络传输下的内存管理:

1.根据配置,Flink会在NetWorkBufferPool中生成一定数量(default 2048)个内存块MemorySegment,内存块的数量代表网络传输中所有可用的内存。NetWorkEnvironement和NetWorkBufferPool是Task之间共享的,并且每一个TaskManager只会实例化一个。
2.Task线程启动的时候,会向NetworkEnvironment注册,NetworkEnvironment会为Task的InputGate和ResultPartition分别创建一个LocalBufferPool(缓冲池)并设置可申请的MemorySegment数量。IG对应的缓冲池的初始内存块数量和InputChannel数量一致,RP对应的缓冲池出事的内存块数量和RP中ResultSubpartition数量一致。不过,每当创建或者销毁缓冲池的时候,NetworkBufferPool会计算剩余空闲的内存块数量,并平均分配给已经创建的缓冲池。注意,这个过程只是指定了缓冲池所能使用的内存块数量,并没有真正分配内存块,只有真正需要的时候才进行分配。为什么动态地为缓冲池扩容? 因为内存越多,意味着系统可以更轻松的应对瞬时压力,不会频繁的进入反压状态,所以要利用部分空闲的内存块
3. Task线程执行过程中,当Netty接收端收到数据的时候,为了将Netty中的数据拷贝到Task中,InputChannel(RemoteInputChannel)会向其对应的缓冲池申请内存块。如果缓冲池中也没有空用的内存块并且已经申请的数量没有到池子上限,则会向NetWorkBufferPool申请内存块并交给IG缓冲池。如果缓冲池已经申请的数量已经达到上限,或者说NetWorkBufferPool也没有可用内存块的时候,Task的nettyChannel会停止读取数据,上游发送端会立即响应停止发送,拓扑结构进入反压状态。当Task线程写数据到ResultPartition的时候,也会向缓冲池请求内存块,如果没有可用内存块,会阻塞在请求内存块的地方,达到暂停写入的目的。
4. 当一个内存块被消费完后(输入端指的是内存块中的字节被反序列化成对象,在输出端指内存块中的字节写入到netty Channel),会调用Buffer.recycle()方法,将内存块还给LocalBufferPool。如果LocalBuuferPool中当前申请的数量超过了池子容量(动态容量,新注册的Task导致池子容量变小),则LocalBufferPool会将该内存块回收给NetWorkBufferPool。如果没超过池子容量,会继续留在池子中,减少反复申请的开销。

TM之间的反压:

内存管理

flink内存管理

Java提供了Unsafe接口可以操作JVM内存

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/762228.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号