【Flink经济】Flink 内存管理

面临的问题

        目前, 大数据计算引擎主要用 Java 或是基于 JVM 的编程语言实现的,例如 Apache Hadoop、 Apache Spark、 Apache Drill、 Apache Flink 等。 Java 语言的好处在于程序员不需要太关注底层内存资源的管理,但同样会面临一个问题, 就是如何在内存中存储大量的数据(包括缓存和高效处理)。 Flink 使用自主的内存管理,来避免这个问题。


JVM 内存管理的不足


1) Java 对象存储密度低。

Java 的对象在内存中存储包含 3 个主要部分:对象头、实例数据、对齐填充部分。例如, 一个只包含 boolean 属性的对象占 16byte:对象头占 8byte,
boolean 属性占 1byte, 为了对齐达到 8 的倍数额外占 7byte。而实际上只需要一个 bit(1/8
字节)就够了。


2) Full GC 会极大地影响性能。

尤其是为了处理更大数据而开了很大内存空间的 JVM来说, GC 会达到秒级甚至分钟级。


3) OOM 问题影响稳定性。

OutOfMemoryError 是分布式计算框架经常会遇到的问题,当JVM中所有对象大小超过分配给JVM的内存大小时,就会发生OutOfMemoryError错误,导致 JVM 崩溃,分布式框架的健壮性和性能都会受到影响。


4)缓存未命中问题。

CPU 进行计算的时候,是从 CPU 缓存中获取数据。 现代体系的 CPU 会有多级缓存,而加载的时候是以 Cache Line 为单位加载。如果能够将对象连续存储,这样就会大大降低 Cache Miss。使得 CPU 集中处理业务,而不是空转。(Java 对象在堆上存储的时候并不是连续的,所以从内存中读取 Java 对象时,缓存的邻近的内存区域的数据往往不是 CPU 下一步计算所需要的,这就是缓存未命中。 此时 CPU 需要空转等待从内存中重新读取数据。)Flink 并不是将大量对象存在堆内存上,而是将对象都序列化到一个预分配的内存块上,这个内存块叫做 MemorySegment,它代表了一段固定长度的内存(默认大小为 32KB),也是 Flink 中最小的内存分配单元,并且提供了非常高效的读写方法,很多运算可以直接操作二进制数据,不需要反序列化即可执行。每条记录都会以序列化的形式存储在一个或多个MemorySegment 中。 如果需要处理的数据多于可以保存在内存中的数据, Flink 的运算符会将部分数据溢出到磁盘。

JobManager内存模型

TaskManager内存模型

内存结构

内存段

可以看出这种序列化方式存储密度是相当紧凑的。其中 int 占 4 字节, double 占 8 字
节, POJO 多个一个字节的 header, PojoSerializer 只负责将 header 序列化进去,并委托每个
字段对应的 serializer 对字段进行序列化。

内存页


内存页是 MemorySegment 之上的数据访问视图, 数据读取抽象为 DataInputView,
数据写入抽象为 DataOutputView。使用时就无需关心 MemorySegment 的细节,会自
动处理跨 MemorySegment 的读取和写入。

Buffer

Task 算子之间在网络层面上传输数据, 使用的是 Buffer, 申请和释放由 Flink
自行管理, 实现类为 NetworkBuffer。 1 个 NetworkBuffer 包装了 1 个
MemorySegment。 同时继承了 AbstractReferenceCountedByteBuf, 是 Netty 中的抽
象类。 

网络缓存

对照物理执行计划

IG:input gate

RS:结果分区

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动态规划--线性DP最长上升子序列及其二分优化

1、B站视频链接&#xff1a;E03 线性DP 最长上升子序列_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; int n9; int a[101]{0,5,7,1,9,4,6,2,8,3}; int f[101]; //f[i]表示以a[i]为结尾的 //最长上升子序列的长度 int main(){int i,j,ans1;for(int i1…

Spring学习笔记(五)--Spring的AOP模块

一、AOP的底层原理 AOP的底层原理是动态代理&#xff0c;动态代理有两种方式&#xff1a;JDK动态代理和CGLib动态代理&#xff0c;在有接口的实现类时我们通常用JDK的动态代理方式&#xff08;默认情况&#xff09;为类创建代理对象&#xff0c;JDK的动态代理方式可以实现无入…

智慧建工的魔法:数据可视化的引领之光

在智慧建工的时代&#xff0c;数据可视化成为推动建筑行业进步的强大引擎&#xff0c;其作用不可忽视。通过将复杂的建筑数据以直观、清晰的图形展示出来&#xff0c;数据可视化为建筑工程提供了前所未有的便利和创新。 首先&#xff0c;数据可视化在建筑规划和设计阶段发挥关键…

浏览器---浏览器/http相关面试题

1.localStorage和sessionStorage 共同点&#xff1a;二者都是以key-value的键值对方式存储在浏览器端&#xff0c;大小大概在5M。 区别&#xff1a; &#xff08;1&#xff09;数据有效期不同&#xff1a;sessionStorage仅在当前浏览器窗口关闭之前有效&#xff1b;localStorag…

基于springboot+vue的B2B平台的医疗病历交互系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

上海亚商投顾:北向资金净买入超130亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 指数昨日低开高走&#xff0c;三大股指午后均涨超2%&#xff0c;沪指一度逼近3000点关口&#xff0c;尾盘涨幅…

D3380——应用于无线收发机的宽带 IF IC, 最大 IF 频带为 15MHz. 包含 IF 限 幅放大器、RSSI 和检测器。

D3380是一块具有较大15MHz的高带宽中放集成电路。电路内部集成了一块中放限幅放大器&#xff0c;接收信号强度指示器&#xff0c;检测器。电路主要应用于无绳电话&#xff0c;收音机&#xff0c;遥控器&#xff0c;无线数据传输器等通讯类器件。电路具有低工作电流特性能适应于…

Linux篇:开发工具yum/vim/gcc/g++/Makefile/gdb

一. yum&#xff1a;软件包管理器 什么是软件包&#xff1f; 在Linux 下安装软件 , 一个通常的办法是下载到程序的源代码 , 并进行编译 , 得到可执行程序 . 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好 , 做成软件包 (可以理解成windows 上的安装程序) 放在…

【MySQL】学习连接查询和案例演示

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-KOxr1rwR9cQTlydJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

HotSpot虚拟机对象探秘

对象的创建 1.1 对象创建的6种方式 使用new关键字、Class的newInstance()方法、Constructor类的newInstance()方法、clone()方法、反序列化、第三方库Objenesis。 每种创建对象方式的实际操作如下。 使用new关键字—调用无参或有参构造器创建。使用Class的newInstance()方法…

软件实际应用实例分享,门诊电子处方模板制作教程,中西医诊所病历开单系统教程

软件实际应用实例分享&#xff0c;门诊电子处方模板制作教程&#xff0c;中西医诊所病历开单系统教程 一、前言 以下软件教程以 佳易王诊所电子处方软件V17.3为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、在开电子处方的时候&#xff0c…

Python3零基础教程之Python解释器与开发环境搭建

大家好&#xff0c;我是千与编程&#xff0c;硕士毕业于北京大学&#xff0c;曾先后就职于字节跳动&#xff0c;京东等互联网大厂&#xff0c;目前在编程导航知识星球担任星球嘉宾&#xff0c;著有《AI算法毕设智囊袋》&#xff0c;《保姆级带你通关秋招教程》两大专栏。 今天开…

【鸿蒙系统学习笔记】网络请求

一、介绍 资料来自官网&#xff1a;文档中心 网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1a;通过HTTP发起一个数据请求。WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接。Socket连接&#xff1a;通过Socket进行数据传输。 日常…

基于Skywalking开发分布式监控(三)

回顾上期的问题&#xff0c;当我们搭建完成Skywalking的搭建&#xff0c;顺利完成应用监控之后&#xff0c;就会面临一类问题&#xff0c;怎么利用获取的监控数据&#xff0c;包括三方面&#xff1a; 1 应用的Trace和SW收集Service/Endpoint不一定完全一致&#xff0c;可能定位…

【快速上手QT】05-绘画Paint

我们写一个QT程序&#xff0c;说实话&#xff0c;很难昧着良心说这个QT界面很好看&#xff08;技术高超的小伙伴请忽略我这句话&#xff09;。但是我们可以使用绘画事件来弥补一下“相貌丑陋”的这个缺点。 paintEvent 我们可以对主界面进行绘图&#xff0c;从而达到美化界面…

js设计模式:计算属性模式

作用: 将对象中的某些值与其他值进行关联,根据其他值来计算该值的结果 vue中的计算属性就是很经典的例子 示例: let nowDate 2023const wjtInfo {brithDate:1995,get age(){return nowDate-this.brithDate}}console.log(wjtInfo.age,wjt年龄)nowDate 1console.log(wjtInf…

【UI自动化】使用poco框架进行元素唯一定位

直接选择&#xff1a; 1.poco(text买入).click() 2.poco("android.widget.ImageView").click()相对选择、空间选择&#xff1a; 3.poco(text/name).parent().child()[0].click()正则表达式&#xff1a; 4.listpoco(textMatches".*ETF")今天主要想记录下…

操作系统导论-课后作业-ch19

1. 本书在第6章中有过介绍&#xff0c;gettimeofday函数最多精确到us&#xff0c;并且大致精确&#xff08;并不完全精确&#xff09;&#xff0c;需要多迭代几次减少误差&#xff0c;循环次数太多也会导致结束时间小于开始时间&#xff08;即回滚&#xff09;的现象&#xff…

Kaggle实践之《Home Credit Default Risk》的逐步优化

记录下每一次的改进及其score。 1、只用训练集的特征简单处理 特征只用训练集的特征&#xff0c;把string型的特征全部进行one-hot转化&#xff0c;然后随机1:4分成测试集训练集&#xff0c;模型也调参直接出结果。 最终的score是训练集80.13%、验证集76.33%、线上74.28%。 …

Java 注解机制解密并发编程的时间之谜:揭开Happens-Before的神秘面纱

优质博文&#xff1a;IT-BLOG-CN 一、简介 为什么需要happens-before原则&#xff1a; 主要是因为Java内存模型 &#xff0c; 为了提高CPU效率&#xff0c;通过工作内存Cache代替了主内存。修改这个临界资源会更新work memory但并不一定立刻刷到主存中。通常JMM会将编写的代码…