热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

flink内存模型详解与案例

任务提交时的一些yarn设置(通用客户端模式)指定并行度            -p5\ 指定yar

任务提交时的一些yarn设置(通用客户端模式)

指定并行度                        -p 5 \ 

指定yarn队列                     -Dyarn.application.queue=xxx \

指定JM总进程的大小        -Djobmanager.memory.process.size=1024mb \

指定每个TM的总进程大小,一般是 2-8g,yarn默认最大给8g    -Dtaskmanager.memory.process.size=1024mb \   

指定每个TM的slot数         -Dtaskmanager.numberOfTaskSlots=2 \

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

flink 内存模型如下图:

 

 1.flink框架内存使用了堆上内存和堆外内存,不计入slot资源

2、task执行的内存使用了堆上内存和堆外内存

3、网络缓冲内存:网络数据交换所使用的堆外内存大小,如网络数据交换缓冲区

4、框架堆外内存、task堆外内存、网络缓冲内存,都在堆外的直接内存里。

5、管理内存:flink管理的堆外内存。用于管理排序、哈希表、缓存中间结果及RocksDB State Backend 的本地内存

6、jvm特有内存:jvm本身占用的内存,包括元空间和执行开销

7、flink使用内存=框架堆内和堆外内+Task堆内和堆外内存+网络缓冲内存+管理内存

8、进程内存=Flink内存+jvm特有内存

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

内存模型详解:

jvm特定内存:jvm本身使用的内存,包含jvm的metaspace和over-head

①JVM metaspace:jvm元空间

taskmanager.memory.jvm-metaspace.size 默认256mb

②JVM over-head执行开销:JVM执行时自身所需要的内容,包括线程堆栈、IO、编译缓存等所使用的内存。

taskmanager.memory.jvm-overhead.fraction, 默认0.1

taskmanager.memory.jvm-overhead.min,      默认192mb

taskmanager.memory.jvm-overhead.max,     默认1gb

总进程内存*fraction,如果小于配置的min或大于配置的max,则使用min/max

框架内存:flink框架,即TaskManager本身所占用的内存,不计入slot的资源中。

堆内:taskmanager.memory.framework.heap.size, 默认128mb

堆外:taskmanager.memory.framework.off-heap.size,默认128mb

Task内存:Task执行用户代码时所使用的内存

堆内:taskmanager.memory.task.heap.size,默认none,由flinl内存口扣除掉其他部分的内存得到、

堆外:taskmanager.memory.task.off-size,默认0,表示不使用堆外内存

网络内存:网络数据交换所使用的堆外内存大小,如网络数据交换缓冲区 

堆外:taskmanager.memory.network.fraction,默认0.1

   taskmanager.memory.network,min,默认64mb

   taskmanager.memory.network.max,默认1gb

flink内存*fraction,如果小于配置的min或大于配置的max,则使用min/max

管理内存:用于RocksDB State Backend 的本地内存和批的排序、哈希表、缓存中间结果。

堆外:taskmanager.memory.managed.fraction,默认0.4

   taskmanager.memory.managed.size,默认none

如果size没指定,则等于flink内存*fraction

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 实际案例

基于yarn模式,一般参数指定的是总进程内存,taskmanager.memory.process.size,

如果该大小为4G,每一块内存得到大小如下:

①计算flink内存

jvm元空间256m

jvm执行开销:4g*0.1=409.6,在[192.1g]之间,最终结果409.6m

flink内存=4g-256m-409.6m=3430.4m

②网络内存=3430.4*0.1=343.04,在[64m,1g]之间,最终结果343.04m

③托管内存=3430.4m*0.4=1372.16m

④框架内存,堆内和堆外都是128m

⑤Task堆内内存=3430.4m-128m-128m-343.04m-1372.16m=1459.2m    堆内内存是总内存减去所有其他的内存。在总大小不变的情况小想调大堆内内存,就把其他内存调小。

 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

提交程序,查看flink ui结果。和计算的几乎一致

 

 

 

 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 JVM参数与内存

jvm Options:

-Xmx1664299798     

-Xms1664299798     jvm堆内内存大小(最大与最小)  约1587m=Task堆内+框架堆内

 

 -XX:MaxDirectMemorySize=493921243 jvm堆外内存大小    约471m=Task堆外+框架堆外+网络内存

 

-XX:MaxMetaspaceSize=268435456   jvm元空间大小,约256m 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

调优原则,根据程序运行时每块内存的使用情况来调整。

 



推荐阅读
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 大厂首发!思源笔记docker
    JVMRedisJVM面试内存模型以及分区,需要详细到每个区放什么?GC的两种判定方法GC的三种收集方法:标记清除、标记整理、复制算法的 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • java线程池的实现原理源码分析
    这篇文章主要介绍“java线程池的实现原理源码分析”,在日常操作中,相信很多人在java线程池的实现原理源码分析问题上存在疑惑,小编查阅了各式资 ... [详细]
author-avatar
会唱歌的高跟鞋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有