【内存管理】flink内存管理(一):内存管理概述:flink主动管理内存原理、flink内存模型

文章目录

  • 一.flink为什么自己管理内存
    • 1. 处理大数据时JVM内存管理的问题
    • 2. flink主动管理内存逻辑
      • 2.1. Flink内存管理方面
      • 2.2. 序列化、反序列化说明
    • 3. Flink主动管理内存的好处
  • 二. Flink内存模型
    • 1. 堆内存
    • 2. 非堆内存
      • 2.1. 托管内存
      • 2.2.直接内存
      • 2.3. JVM特定内存

本节从整体使用的角度了解Flink如何实现对内存的积极管理,然后对比基于JVM带来的内存管理问题,介绍Flink如何抽象出合理内存模型,解决大规模场景下的内存使用问题。

一.flink为什么自己管理内存

1. 处理大数据时JVM内存管理的问题

在JVM上运行的系统,需要将数据存储到JVM堆内存中进行处理和运算,借助JVM提供的GC能力能够实现内存的自动管理,但对于大数据处理场景而言,需要处理非常庞大的数据,此时JVM内存管理的问题会比较突出,主要体现在以下几点。

  1. Java对象存储密度相对较低:对于常用的数据类型,例如Boolean类型数据占16字节内存空间,其中对象头占字节,Boolean属性仅占1字节,其余7字节做对齐填充。而实际上仅1字节就能够代表Boolean值,这种情况造成了比较严重的内存空间浪费。
  2. Full GC极大影响系统性能:使用JVM的垃圾回收机制对内存进行回收,在大数据量的情况下GC的性能会比较差,尤其对于大数据处理,有些数据对象处理完希望立即释放内存空间,但如果借助JVM GC自动回收,通常情况下会有秒级甚至分钟级别的延迟,这对系统的性能造成了非常大的影响。
  3. OutOfMemoryError问题频发,严重影响系统稳定性:系统出现对象大小分配超过JVM内存限制时,就会触发OutOfMemoryError,导致JVM宕机,影响整个数据处理进程。

 

2. flink主动管理内存逻辑

积极地内存管理,强调的是主动对内存资源进行管理。

2.1. Flink内存管理方面

对Flink内存管理来讲,主要是

  1. 将本来直接存储在堆内存上的数据对象,通过数据序列化处理,存储在预先分配的内存块上,该内存块也叫作MemorySegment,代表了固定长度的内存范围,默认大小为32KB,同时MemorySegment也是Flink的最小内存分配单元
  2. MemorySegment将JVM堆内存和堆外内存进行**集中管理,形成统一的内存访问视图。**MemorySegment提供了非常高效的内存读写方法,例如getChar()、putChar()等。
  3. 如果MemorySegment底层使用的是JVM堆内存,数据通常会被存储至普通的字节数据(byte[])中,如果MemorySegment底层使用的是堆外内存,则会借助ByteBuffer数据结构存储数据元素。
  4. 基于MemorySegment内存块可以帮助Flink将数据处理对象尽可能连续地存储到内存中,且所有的数据对象都会序列化成二进制的数据格式,对一些**DBMS风格(关系型数据库)**的排序和连接算法来讲,这样能够将数据序列化和反序列化开销降到最低。

2.2. 序列化、反序列化说明

如图,对于用户编写的自定义数据对象,例如Person(String name, int age),会通过高效的序列化工具将数据序列化成二进制数据格式,然后将二进制数据直接写入事先申请的内存块(MemorySegment)中,当再次需要获取数据的时候,通过反序列化工具将二进制数据格式转换成自定义对象。

整个过程涉及的序列化和反序列化工具都已经在Flink内部实现,当然,Flink也可以使用其他的序列化工具,例如KryoSerializer等。

 
OOM情况的处理
我们也可以看到,在MemorySegment中如果因为内存空间不足,无法申请到更多的内存区域来存储对象时,Flink会将MemorySegment中的数据溢写到本地文件系统(SSD/Hdd)中。当再次需要操作数据时,会直接从磁盘中读取数据,保证系统不会因为内存不足而导致OOM(Out Of Memory,超出内存空间),影响整个系统的稳定运行。

在这里插入图片描述

 

3. Flink主动管理内存的好处

  1. 内存剩余监控简单:因为分配的内存段数量是固定的,所以监控剩余的内存资源非常简单。在内存不足的情况下,处理操作符可以有效地将更大批的内存段写入磁盘,然后再将它们读回内存。这样就可以有效防止OOM问题。
  2. 减低垃圾收集压力:在Flink中,所有长生命周期的数据都是以二进制形式管理内存的,所有创建的数据对象都是短暂且可变的,并且支持重用。短生命周期的对象可以更有效地进行垃圾收集,这大大降低了垃圾收集的压力。为了降低垃圾收集的压力,Flink社区实现了将数据对象分配到堆外内存,使得JVM堆变得更小,垃圾收集消耗的时间更短。
  3. 数据对象以二进制的形式存储,可以节省大量存储Java对象需要的存储开销。
  4. 更高效的缓存访问模式:通过二进制形式存储数据对象,框架可以有效地比较和操作二进制数据。(ing)此外,用二进制表示数据可以将相关值、哈希码、键和指针等信息存储在相邻的内存中。(ing)这使得数据结构通常具有更高效的缓存访问模式。

 

二. Flink内存模型

1. 堆内存

在Flink中将JVM堆内存分为Framework堆内存和Task堆内存两种类型,其中

  1. Framework堆内存主要用于Flink框架本身需要的内存空间,
  2. Task堆内存则用于Flink算子及用户代码的执行,两者主要的区别在于是否将内存计入Slot计算资源中
  3. Framework堆内存和Task堆内存之间没有做明确的隔离,在后续版本中会做进一步优化。

2. 非堆内存

对于非堆内存,则主要包含了托管内存、直接内存以及JVM特定内存三部分。

在这里插入图片描述

2.1. 托管内存

托管内存是由Flink负责分配和管理的本地(堆外)内存,

在流处理作业中用于RocksDBStateBackend状态存储后端
在批处理作业中用于排序、哈希表及缓存中间结果

 

2.2.直接内存

直接内存分为Framework非堆内存、Task非堆内存和Network三个部分,

  1. 其中Framework非堆内存和Task非堆内存主要根据堆外内存是否计入Slot资源进行区分,堆外内存没有对Framework和Task之间进行隔离。
  2. Network内存存储空间主要用于基于Netty进行网络数据交换时,以NetworkBuffer的形式进行数据传输的本地缓冲。

 

2.3. JVM特定内存

JVM特定内存不在Flink总内存范围之内,包括JVM元空间和JVM Overhead,其中JVM元空间存储了JVM加载类的元数据,加载的类越多,需要的内存空间越大,JVM Overhead则主要用于其他JVM开销,例如代码缓存、线程栈等。

 

 

对于Flink来讲,将内存划分成不同的区域,实现了更加精准地内存控制,并且可以通过MemorySegment内存块的形式申请和管理内存,我们继续了解MemorySegment内存块的设计与实现。

 

参考:《Flink设计与实现:核心原理与源码解析》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx重写功能location与rewrite

1. location 从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。 rewrite 对访问的…

书生·浦语大模型实战营-学习笔记4

XTuner 大模型单卡低成本微调实战 Finetune简介 常见的两种微调策略:增量预训练、指令跟随 指令跟随微调 数据是一问一答的形式 对话模板构建 每个开源模型使用的对话模板都不相同 指令微调原理: 由于只有答案部分是我们期望模型来进行回答的内容…

蓝桥杯-最少刷题数

📑前言 本文主要是【算法】——最少刷题数的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句&#x…

一文搞清楚Java中的包、类、接口

写在开头 包、类、接口、方法、变量、参数、代码块,这些都是构成Java程序的核心部分,即便最简单的一段代码里都至少要包含里面的三四个内容,这两天花点时间梳理了一下,理解又深刻了几分。 Java中的包 Java 定义了一种名字空间&…

接口测试 02 -- JMeter入门到实战

前言 JM eter毕竟是做压测的工具,自动化这块还是有缺陷。 如果公司做一些简单的接口自动化,可以考虑使用JMeter快速完成,如果想做完善的接口自动化体系,建议还是基于Python来做。 为什么学习接口测试要先从JMeter开始?…

卡尔曼滤波增益推导

该文章主要是记录温习卡尔曼滤波算法理论时的一些理解,重点讲解卡尔曼增益的推导过程。其中忽略了部分基础知识和详细的推导过程,阅读该文章需要本身已具备卡尔曼滤波基础。文章内容摘取自网络博客的部分内容,因为原文章的逻辑不是很通顺&…

NLP论文阅读记录 - 2021 | WOS 基于多头自注意力机制和指针网络的文本摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.问题定义和解决问题的假设问题定义解决问题的假设 三.本文方法3.1 总结为两阶段学习3.1.1 基础系统 3.2 重构文本摘要 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-帖子详情页实现

锋哥原创的SpringbootLayui python222网站实战: python222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火…

解决一个mysql的更新属性长度问题

需求背景: 线上有一个 platform属性,原有长度为 varchar(10),但是突然需要填入一个11位长度的值;而偏偏这个属性在线上100张表中有50张都存在,并且名字各式各样,庆幸都包含 platform;例如 platf…

非科班转码的秋招复盘:地理信息科学GIS专业到后端研发、软件开发

本文介绍地理信息科学(GIS)专业的2024届应届生,在研三上学期期间,寻找后端研发、软件开发等IT方向工作的非科班转码秋招情况。 首先,这篇文章一开始写于2023年年底,当时为了参加一个征文活动,所…

Python爬虫的9个具体应用场景案例分析与具体应用。

文章目录 前言一、新闻采集二、数据挖掘三、网站监测四、舆情分析五、爬虫定制化开发六、数据采集与处理七、网络安全八、网络营销九、自动化测试关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①P…

嵌入式学习-网络编程-Day6

嵌入式学习-网络编程-Day6 一、思维导图 二、作业 1.基于UDP的网络聊天室(2024.1.21号前上交) 项目需求: 1.如果有用户登录,其他用户可以收到这个人的登录信息 2.如果有人发送信息,其他用户可以收到这个人的群聊信…

LabVIEW振动数据采集与分析系统

在这个项目中, LabVIEW软件配合精确的硬件组件,以实现高效的振动数据采集和复杂信号分析。硬件方面,系统采用了PCB振动加速度传感器的高灵敏度传感器,以及NI9234型号的数据采集卡,确保了数据采集的高精度和可靠性。软件…

Leetcode刷题-(6~10)-Java+Python+JavaScript

算法题是程序员的基本功,也是各个大厂必考察的重点,让我们一起坚持写算法题吧 遇事不决,可问春风,春风不语,即是本心。 我们在我们能力范围内,做好我们该做的事,然后相信一切都事最好的安排就…

JAVAEE出街 网络编程(一)

网络编程 一. 网络编程二. 客户端与服务器2.1 一问一答2.2 一问多答2.3 多问一答2.4 多问多答 三. TCP与UDP的特点 一. 网络编程 网络编程本质上就是学习传输层给应用层提供的API,把数据交给传输层,通过一层层的封装将数据通过网卡传输出去。 二. 客户端…

html5实现好看的年会邀请函源码模板

文章目录 1.设计来源1.1 邀请函主界面1.2 诚挚邀请界面1.3 关于我们界面1.4 董事长致词界面1.5 公司合作方界面1.6 活动流程界面1.7 加盟支持界面1.8 加盟流程界面1.9 加盟申请界面1.10 活动信息界面 2.效果和源码2.1 动态效果2.2 源码目录结构 源码下载 作者:xcLei…

使用 FFmpeg 轻松调整视频的大小/缩放/更改分辨率

在此 FFmpeg 教程中,我们学习使用 FFmpeg 的命令行工具更改视频的分辨率(或调整视频的大小/缩放)。 更改视频的分辨率(也称为调整大小或缩放)是视频编辑、处理和压缩中非常常见的操作。对于 ABR 视频流尤其如此&#…

HCIP BGP选路实验

拓扑图&IP划分如下: 第一步,配置IP&环回地址 以R1为例,R2~R8同理 interface GigabitEthernet 0/0/0 ip address 12.0.0.1 24 interface LoopBack 0 ip address 10.0.0.1 24 第二步:对AS200网段配置OSPF协议 以R2为例&a…

[C#]C# winform部署yolov8目标检测的openvino模型

【官方框架地址】 https://github.com/ultralytics/ultralytics 【openvino介绍】 OpenVINO(Open Visual Inference & Neural Network Optimization)是由Intel推出的,用于加速深度学习模型推理的工具套件。它旨在提高计算机视觉和深度学…

【使用 UCF101 数据集】C3D 模型准备与模型训练

一、前言 本文章将对 C3D 模型进行解析,对里面的模型结构进行详解,最后使用UCF101 数据集对该模型进行实战,在进行推理时能够正确识别出未知视频中里面正确的类别。 二、目录 三、相关内容 四、详细介绍 【使用 UCF101 数据集】C3D 模型准…