Java中所有数据类型对应的字节大小
Java对象的组成:对象头、实例数据、对齐部分
jvm序列化的缺点
上图展示了TaskManager的内存模型。左边是细分的内存模型,右边是整体的内存模型。图片取自Flink官网
堆内存是jvm启动时申请的一块未改变的内存区域。内存实际上是Flink和任务共享的区域。在Flink层面,通过控制来区分框架使用和任务内存。堆内存相对容易管理。事实上,非堆内存很难管理。如果管理不当,或者使用不当可能会导致内存泄漏或者内存无限增长等问题
内存参数配置
在flink中,内存被抽象为MemorySegment。默认情况下,一个MemorySegment对应着一个32KB的内存块,这个内存块可以是堆内内存(字节数组),也可以是堆外内存(nio的ByteBufferr)。
同时,MemorySegment也提供对二进制数据的支持。操作方法,以及读取字节数组序列化和序列化字节数组的方法等。
下面是类继承图。该类有两个MemorySegment实现类,一个使用堆,一个混合。有堆和非堆,内存访问也有子类的具体实现
MemorySemgent是flink内存分配的最小单位。对于数据存储,上层用户使用MemorySemgent。,所有细节都需要考虑。因为太麻烦,所以在MemorySemgent上又抽象了一层内存。Memory也是MemorySemgent数据访问的一个视图。数据输入和输出分抽象为DataInputView/DataOutputView。有了这一层,上层用户不需要关心跨MemorySemgent的细节,内存也自动处理跨MemorySemgent的内存操作
DataInputView
DataInputView继承DataInput,而DataInputView是MemorySemgent读取的抽象。View提供了一系列的方法来读取不同类型的二进制数据。AbstractPageInputView是DataInputView的抽象实现类,基本上所有的InputView都实现了这个类,即所有实现这个类的InputView都支持Page
InputView持有多个MemorySemgents的引用(可以基于数组、列表、双端队列等)。这些MemorySemgents被视为一个内存页,可以根据不同的实现类,按顺序、随机等方式读取数据。不同实现类读取不同方法
方法图
DataOutputView
对应DataInputView,继承Output,有aPage函数的抽象类(AbstractPagedOutputView),它的大部分outputView实现都继承自这个抽象类,并为一组MemorySemgent提供基于页面的写入功能
方法图
类继承图
用于网络io数据的包装,每个缓冲区保存一个MemorySegment的引用,resultPartition写入数据时,会向LocalBufferPool申请Buffer并返回BufferBuilder。通过BufferBuilder,将数据写入Buffer
BufferBuilder处于上游Task中,负责写入Buffer。数据,BufferConsumer位于下游,对应BufferBuilder,用于消费Buffer数据。每个bufferBuilder对应一个bufferConsumer
常用参数介绍
Buffer申请
Buffer回收
当Buffer用完后,需要回收。例如netty的clientHandler收到响应后会处理buffer。缓冲区回收后,该内存段不会被释放,而是返回到池中。,成为可用内存,重复使用
Flink托管内存,托管内存使用堆外内存,用于批量缓存排序等,并提供rocksDB内存
NetworkBufferPool是固定的sizeMemorySegment实例在网络堆栈中使用。NettyBufferPool将为每个ResultPartition创建自己的LocalBufferPool。NettyBufferPool将作为全局池来提供内存。LocalBufferPool会通过限制来控制自己的内存申请,防止过度申请
LocalBufferPool继承关系,实现了bufferRecycler的接口,用于回收其持有的buffer
接收数据时会将数据封装到NettyBuffer中,发送数据时会通过BufferBilder将数据写入MemorySegment,然后通过BufferConsumer读取MemorySegment数据
BufferManager主要是用于为RemoteInputChannel提供缓冲区。BufferManager将为全局bufferPool请求提供自己唯一的缓冲区。当bufferManager的缓冲区不够时,它会向localBufferPool请求缓冲区。此时请求的缓冲区是浮动缓冲区
实际提供的缓冲区是
很多朋友想知道javaflink是什么?一起来了解一下吧~
1什么是Flink
JavaApacheFlink是一个分布式、高性能、高精度的流处理框架。支持实时流处理和批处理。
特性
(1)支持批处理和数据流程序处理
(2)优雅流畅支持java和scalaapi
(3)两者都支持-高吞吐量和低延迟两种
(4)支持通过SataStreamAPI进行事件处理和乱序处理,基于DataFlow数据流模型
(5)支持灵活的窗口(时间、技术、会话、自定义触发器)在不同时间语义(时间时间、处理时间)下
(6)仅处理一次的容错保证
(7)自动回退压力机制
(8)图处理(批量)机器学习(批量)复杂事件处理(流)
(9))内置对迭代程序(BSP)的支持dataSet(batch)API
(10)高效的自定义内存管理,以及强大的核内、核外内存转换能力
(11)兼容mapreduce和stormhadoop
(12)集成YARN、HDFS、Hbase等hadoop生态系统组件
Flink分布式程序包含两个主要进程:JobManager和TaskManager程序运行时,会有不同的进程参与其中,包括Jobmanager、TaskManager和JobClient
Flink程序传递给JobClient,JobClient再传递给负责资源协调和作业执行的JobManager。一旦资源分配完成,任务就会分配给不同的TaskManager,TaskManager会根据程序的执行状态(开始、运行、完成、取消、失败)发起一个序列来执行任务,并反馈给JobManager。,ETC。当工作执行完成后,结果将返回给客户。
上一篇:电脑c盘满了怎么清理内存
下一篇:flink内存管理