【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内存
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值