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

news2024/11/27 20:32:46

文章目录

  • 一.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.coloradmin.cn/o/1399455.html

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

相关文章

【每日一题】2788. 按分隔符拆分字符串-2024.1.20

题目: 2788. 按分隔符拆分字符串 给你一个字符串数组 words 和一个字符 separator ,请你按 separator 拆分 words 中的每个字符串。 返回一个由拆分后的新字符串组成的字符串数组,不包括空字符串 。 注意 separator 用于决定拆分发生的位…

循序渐进学 JavaScript <一>

这周复习完了 js 基础,整理一波~ 一、认识 JavaScript 1. 1 编程语言 计算机语言:概念比较广泛,包括 html 标记语言(它并不是编程语言)编程语言特点 具有数据和数据结构指令和流程控制:switch&#xff0c…

Ubuntu安装最新版Docker和Docker-Compose

ubuntu环境搭建专栏🔗点击跳转 Ubuntu系统环境搭建(十)——Ubuntu安装最新版Docker和Docker Compose 文章目录 Ubuntu系统环境搭建(十)——Ubuntu安装最新版Docker和Docker Compose1.添加Docker库1.1 安装必要的证书并…

FastDFS 环境搭建及使用详解

文章目录 1、简介1.1 分布式文件系统1.2 FastDFS1.3 FastDFS架构 2、环境搭建2.1 FastDFS安装2.1.1 安装前准备2.1.2 安装包下载2.1.3 安装 libfastcommon2.1.4 安装 libserverframe2.1.5 安装 FastDFS 2.2 FastDFS配置2.2.1 配置tracker2.2.1.1 创建 tracker 工作目录2.2.1.2 …

关于gltf模型格式文件的学习

目录 glTF模型 小黄鸭的gltf模型 字段分析 scene nodes meshes primitives attributes indices mode material accessors bufferView byteOffset count componentType type materials textures images samplers magFilter与minFilter wrapS与wrapT 进行…

好物周刊#37:元气桌面

https://github.com/cunyu1943/JavaPark https://yuque.com/cunyu1943 村雨遥的好物周刊,记录每周看到的有价值的信息,主要针对计算机领域,每周五发布。 一、项目 1. MallChat 一个既能购物又能聊天的电商系统。以互联网企业级开发规范的…

canvas能压缩图片?

之前写过一篇使用命令行工具压缩图片的博文:使用yx-tiny命令行工具进行图片压缩,大家感兴趣可以去瞅一眼。 这篇简单说一下使用canvas压缩图片 其实思路很简单,我们选择了图片之后,会获取到对应的文件流对象,然后我们…

计算机组成原理 第一弹

ps:本文章的图片来源都是来自于湖科大教书匠高老师的视频,声明:仅供自己复习,里面加上了自己的理解 这里附上视频链接地址:1-2 计算机的发展_哔哩哔哩_bilibili ​​ 目录 🚀计算机系统 🚀计…

中小企业如何快速融资-----股权融资的四种方式(上)

’在企业融资的多种手段中,股权质押融资、股权交易增值融资、股权增资扩股融资和股权的私募融资,逐渐成为中小企业利用股权实现融资的有效方式。随着市场体系和监管制度的完善,产权市场为投融资者搭建的交易平台日益成熟,越来越多…

【linux驱动】详细剖析第一个hello word驱动程序

文章目录 驱动程序的框架驱动程序的使用示例 驱动程序的框架 Linux 驱动的基本框架主要由模块加载函数,模块卸载函数,模块许可证声明,模块参数,模块导出符号,模块作者信息等几部分组成,其中模块参数&#…

钉钉副总裁李智勇:AI超级助理,提升大模型时代生产力

微软比尔盖茨此前曾预言:“五年内,每个人都将拥有AI私人助理Agent,Agent将颠覆软件行业 。” 近日以来,在GPT store正式上线点爆情绪之后,无论国内外,Agent都是创业圈里炙手可热的新贵。一场关于Agent创业比拼大赛&am…

探索JAVA神秘运行机制:揭秘JVM内存区域

目录 1. 前文回顾 2.内存区域的划分 2.1 存放类的方法区 2.2 程序计数器 2.3 Java虚拟机栈 2.4 Java堆内存 2.5 其他内存区域 3. 核心内存区域运行流程 4. 总结 1. 前文回顾 上一篇我们一起探索了Java的整体运行流程,类加载器以及类的加载机制&#xff0…

手把手教你使用 VS Code 运行和调试 Python 程序

本文以 Ubuntu 系统为例,介绍如何在 VS Code 上配置 Python 的编程环境,并把 Python 程序运行、调试起来。由于 Python 是解释型语言,并且 VS Code 中提供了内置的调试器可用于调试 Python 代码,因此配置和操作流程比调试 C/C 代码…

【 Qt 快速上手】-①- Qt 背景介绍与发展前景

文章目录 1.1 什么是 Qt1.2 Qt 的发展史1.3 Qt 支持的平台1.4 Qt 版本1.5 Qt 的优点1.6 Qt的应用场景1.7 Qt的成功案例1.8 Qt的发展前景及就业分析行业发展方向就业方面的发展前景 1.1 什么是 Qt Qt 是一个跨平台的 C 图形用户界面应用程序框架。它为应用程序开发者提供了建立…

8 python快速上手

总结 总结1. 代码规范1.1 名称1.2 注释1.3 todo1.4 条件嵌套1.5 简单逻辑先处理1.6 循环1.7 变量和值 2.知识补充2.1 pass2.2 is 比较2.3 位运算 3.阶段总结 各位小伙伴想要博客相关资料的话关注公众号:chuanyeTry即可领取相关资料! 总结 1. 代码规范 …

线性规划案例分享

今天想写一个最优传输的简单实现,结果学歪了,学到线性规划去了,这里我发现了一个宝藏网站 虽然是讲计量经济的,但是里面提供的公式和代码我很喜欢,有时间可以好好读一下 https://python.quantecon.org/lp_intro.html …

Civil 3D安装教程,免费使用,带安装包和工具,一分钟轻松搞的安装

前言 Civil 3D是一款面向基础设施行业的建筑信息模型(BIM)解决方案。它为基础设施行业的各类技术人员提供了强大的设计、分析以及文档编制功能,广泛适用于勘察测绘、岩土工程、交通运输、水利水电、市政给排水、城市规划和总图设计等众多领域…

什么是比特币?

比特币 比特币 (英语:Bitcoin,缩写:BTC )是一种基于 去中心化,采用 点对点网络,开放源代码,以 区块链 作为底层技术的 加密货币。比特币由 中本聪(Satoshi Nakamoto&…

vscode配置web开发环境(WampServer)

这里直接去下载了集成的服务器组件wampserver,集成了php,MySQL,Apache 可能会出现安装问题,这里说只有图上这些VC包都安装了才能继续安装,进入报错里提供的链接 在页面内搜索相关信息 github上不去可以去镜像站 下载…

机器视觉技术与应用实战(平均、高斯、水平prewitt、垂直prewitt、水平Sobel、垂直Sobel、拉普拉斯算子、锐化、中值滤波)

扯一点题外话,这一个月经历了太多,接连感染了甲流、乙流,人都快烧没了,乙流最为严重,烧了一个星期的38-39度,咳嗽咳到虚脱。还是需要保护好身体,感觉身体扛不住几次连续发烧!&#x…