IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> flink内存模型 -> 正文阅读

[大数据]flink内存模型

flink内存需求

在这里插入图片描述
flink将子任务分布在不同的taskmanager上并行执行,每一个taskmanager中启动一个jvm进程,flink应用本质就是jvm进程,所以必然需要jvm内存的一些固定开销,例如:jvm元空间:存放类的元数据;jvm执行开销:线程的栈,IO以及编译缓存等,另外flink框架本身以及task执行用户代码时也要占用一定的内存,当数据需要进行写入磁盘或者网络传输的时候还需要一块网络缓冲区内存,最后就是flink特别的需要一块托管内存,这部分内存用于缓存中间结果。

flink内存模型

在这里插入图片描述

可以看到,flink的内存模型中:

  • flink框架使用了堆上内存和堆外内存,不计入slot资源
  • taks执行的内存也使用了堆上和堆外内存
  • 网路缓冲内存是多个slot共享的,不隔离

一.flink框架内存

  1. 用途?flink框架本身占用的内存
  2. 内存大小?通常情况下,不建议对框架堆内存和框架堆外内存进行调整,这部分的默认值是框架测试时不调度任务空跑通过测量得到的一个数据。

二.task内存

  1. 用途?userCode和libraies
  2. 内存大小?当使用HeapStateBackend时尤其需要使用Task Heap堆上内存。
  3. 各slot之间时严格隔离的。

三.网络缓冲内存

  1. 用途?网络传输
  2. 内存大小?网络缓冲内存大小由作业拓扑决定
  3. 内存大小的影响?若内存不足会导致运行失败。
  4. 各slot之间不隔离。

四.托管内存

  1. 用途?托管内存有专门的用途,例如批处理的sort/join算子用来存储中间结果,或者流处理使用的是RocksDBStateBackend时就会使用这部分托管内存,如果作业中不涉及到这些功能,建议把托管内存设为0,避免浪费。
  2. 内存大小的影响?大或小都能跑,不会运行失败,顶多就是小了会导致性能低。
  3. 各slot之间时严格隔离的。

五. JVM元空间

  1. 用途?存放JVM加载的类的元数据
  2. 内存大小的影响?加载的类越多,需要的空间越大,当作业需要加载大量第三方库,建议调大Metaspace。若不足会出现metaspaceOOM。

六. JVM开销

  1. 用途?线程栈,编译缓存
  2. 大小?这部分内存的上限不受JVM限制,可作为预留空间。

内存相关参数:
-XmX = 框架堆上内存+task堆上内存,达到上限时触发GC,GC后空间仍然不足则触发OOM异常并退出。OutOfMemoryError:Java heap space.

-XX: MaxDirectMemorySize = 框架堆外内存(部分)+task堆外内存(部分)+网络缓冲内存,达到上限时触发GC,GC后空间仍不足则触发OOM异常并退出。OutOfMemoryError:Direct buffer memory.

-XX: MaxMetaspaceSize = JVM元空间内存,达到上限时触发GC,GC后空间仍不足则触发OOM异常并退出。OutOfMemoryError: Metaspace

而剩下的nativeMemory = 框架堆外内存(部分)+task堆外内存(部分)+ managedMemory + JVM Overhead ,这部分内存的上限是不受JVM严格控制的,特别是managedMemory,它的用量上限是flink控制的。

为什么已经在堆外了还是要触发GC后才释放,因为不论是DirectMemory还是Metaspace,它们在堆内都有一个相应buffer对象与其对应,只有堆内这个对应的对象释放后,堆外的才会相应的释放,所以实际上内存释放还是依赖这个GC的。

jvm中java对象模型缺陷

1.有效数据密度低
java对象由三部分构成,对齐填充仅起到占位符的作用
在这里插入图片描述

2.垃圾回收机制
海量数据导致空间不足,可能出现秒级甚至分钟级的Full GC,不仅影响效率,其引起的中断可能导致心跳超时被踢出集群

3.OOM问题
当执行Full GC后空间仍然不足,则抛出OOM导致JVM崩溃,影响分布式框架的健壮性和性能

4.缓存未命中问题
CPU将经常访问的数据及其下一步可能访问的附近的数据搬运到缓存中,以便下次访问,但由于java对象在堆中不连续,所以搬运的附近数据往往不是下一步计算需要的,这就是缓存未命中,导致执行效率降低。
在这里插入图片描述

flink自主管理内存来解决jvm的几个问题

flink内存管理的两个突出特点:

  1. 在flink中,使用固定长度的内存块(默认32KB)来管理java对象,即memorySegment,它是flink中内存分配的最小单元。一个java对象序列化为二进制数据流后可能占用1个或多个memorySegment。
  2. memorySegment也可以存在堆外内存

基于上面的优化,可以改善在大数据环境下jvm内存模型的缺陷:

  1. 针对有效数据密度低的问题:
    因为只存储实际数据的二进制内容,避免了对齐填充等占位符,节省了内存空间。

  2. 针对Full GC的问题:
    一方面数据以二进制的形式存在memorySegment中一直呆在老年代不会被GC回收,而其他的数据对象基本上是由用户代码生成的短生命周期对象,这部分对象可以被Minor GC快速回收,发生Full GC的概率极低;另一方面memorySegment也可以存在堆外内存,不会引发Full GC。

  3. 针对OOM的问题:
    所有的运行时数据结构和算法只能通过内存池申请内存,保证了其使用的内存大小是固定的,不会因为运行时数据结构和算法而发生OOM。而且由于分配的内存段的数量是固定的,因此监控剩余的内存资源是非常简单的,在内存吃紧的情况下,算法(sort/join等)会高效地将一大批内存块写到磁盘,之后再读回来,防止OOM。

  4. 针对缓存未命中的问题:
    二进制数据以定义好的格式存储,可以高效地比较与操作。另外,该二进制形式可以把相关的值,以及hash值,键值和指针等相邻地放进内存中,使得数据结构可以高速缓存更友好,可以从L1/L2/L3缓存获得性能的提升。

但引入堆外内存也有一些缺点:

  1. 分配生命周期短的对象,比起堆内内存,在堆外内存上分配开销更高。
  2. 堆外内存出错时排错更为复杂。
  3. 在flink的测试中,部分操作在堆外内存上会比堆上内存更慢。
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:28:20  更:2022-04-01 23:29:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:35:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码