当前位置:首页 > 内存 > 正文

flink内存优化

  • 内存
  • 2024-08-14 00:55:46
  • 171

一、FlinkonYarn提交任务由于内存不足产生的异常调试1、我们首先考虑为什么会出现这两个异常,重点关注第一个异常。
虽然这里的图表没有描绘容器,但理解这种关系很重要。如果你还不明白,请看下图。
看一下。在中不难看出,在内存规格中,TaskManager指定了4094m,总共32个slot。不难算出,1个slot占用128m的资源。因此,这些资源是足够的。您想要执行什么任务?
您需要自己衡量这一点,所以我后来指定了:
目前运行时没有出现此类异常。
但是,您可能希望将并行度指定为1。是否有可能因为单槽内存太小而无法启动而直接报emoryError异常?很明显指定机器的内存太少了。当程序在测试过程中没有任务问题时,通常会发生这种异常,但一旦进入实际生产,通常会发生这种异常。此类内存问题频繁发生是因为生产环境中的数据量一般远大于测试环境中的数据量。


二、Flink内存管理

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是什么

很多朋友想知道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。当工作执行完成后,结果将返回给客户。