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

flink中的内存划分

在设置完taskManager内存之后相当于向yarn申请这么大内存的container,然后flink内部的内存大部分是由flink框架管理,在启动c

在设置完taskManager内存之后相当于向yarn申请这么大内存的container,然后flink内部的内存大部分是由flink框架管理,在启动container之前就会 预先计算各个内存块的大小。

内存块划分


// 默认值0.25f
final float memoryCutoffRatio = config.getFloat(ResourceManagerOptions.CONTAINERIZED_HEAP_CUTOFF_RATIO);// 最少预留大小默认600MB
final int minCutoff = config.getInteger(ResourceManagerOptions.CONTAINERIZED_HEAP_CUTOFF_MIN);// 先减去一块内存预留给jvm
long cutoff = (long) (containerMemoryMB * memoryCutoffRatio);
if (cutoff }final long javaMemorySizeMB = containerMemoryMB - cutoff;// (2) split the remaining Java memory between heap and off-heap
final long heapSizeMB = TaskManagerServices.calculateHeapSizeMB(javaMemorySizeMB, config);
// use the cut-off memory for off-heap (that was its intention)
// 计算得到堆外内存后,总内存减去得到堆内的大小
final long offHeapSize = javaMemorySizeMB == heapSizeMB ? -1L : containerMemoryMB - heapSizeMB;// (3) obtain the additional environment variables from the configuration
final HashMap envVars &#61; new HashMap<>();
final String prefix &#61; ResourceManagerOptions.CONTAINERIZED_TASK_MANAGER_ENV_PREFIX;for (String key : config.keySet()) {if (key.startsWith(prefix) && key.length() > prefix.length()) {// remove prefixString envVarKey &#61; key.substring(prefix.length());envVars.put(envVarKey, config.getString(key, null));}
}

计算堆内内存大小TaskManagerServices.calculateHeapSizeMB


// 默认线上是开启堆外内存的&#xff0c;为了数据交换的过程只使用堆外内存&#xff0c;gc友好
if (useOffHeap) {// subtract the Java memory used for network buffersfinal long networkBufMB &#61; calculateNetworkBufferMemory(totalJavaMemorySize, config) >> 20; // bytes to megabytesfinal long remainingJavaMemorySizeMB &#61; totalJavaMemorySizeMB - networkBufMB;long offHeapSize &#61; config.getLong(TaskManagerOptions.MANAGED_MEMORY_SIZE);if (offHeapSize <&#61; 0) {// calculate off-heap section via fraction// 将划去networkBuffer大小*一个堆外的系数&#xff08;默认是0.7&#xff09;得到其他的堆外内存double fraction &#61; config.getFloat(TaskManagerOptions.MANAGED_MEMORY_FRACTION);offHeapSize &#61; (long) (fraction * remainingJavaMemorySizeMB);}TaskManagerServicesConfiguration.checkConfigParameter(offHeapSize } else {heapSizeMB &#61; totalJavaMemorySizeMB;
}

计算堆外内存大小calculateNetworkBufferMemory

Preconditions.checkArgument(totalJavaMemorySize > 0);int segmentSize &#61; config.getInteger(TaskManagerOptions.MEMORY_SEGMENT_SIZE);final long networkBufBytes;
// 涉及新老两个版本的参数&#xff0c;以前版本是直接设置networkbuffer的个数&#xff0c;但是比较难估计&#xff0c;新的版本是直接设置内存块大小
if (TaskManagerServicesConfiguration.hasNewNetworkBufConf(config)) {// new configuration based on fractions of available memory with selectable min and maxfloat networkBufFraction &#61; config.getFloat(TaskManagerOptions.NETWORK_BUFFERS_MEMORY_FRACTION);long networkBufMin &#61; config.getLong(TaskManagerOptions.NETWORK_BUFFERS_MEMORY_MIN);long networkBufMax &#61; config.getLong(TaskManagerOptions.NETWORK_BUFFERS_MEMORY_MAX);TaskManagerServicesConfiguration.checkNetworkBufferConfig(segmentSize, networkBufFraction, networkBufMin, networkBufMax);// 通过networkFraction计算network的内存大小&#xff0c;这个fraction默认值是0.1&#xff0c;同时最小设置默认是64MnetworkBufBytes &#61; Math.min(networkBufMax, Math.max(networkBufMin,(long) (networkBufFraction * totalJavaMemorySize)));TaskManagerServicesConfiguration.checkConfigParameter(networkBufBytes &#61; " &#43;totalJavaMemorySize &#43; " (total JVM memory size)");
} else {// use old (deprecated) network buffers parameterint numNetworkBuffers &#61; config.getInteger(TaskManagerOptions.NETWORK_NUM_BUFFERS);networkBufBytes &#61; (long) numNetworkBuffers * (long) segmentSize;TaskManagerServicesConfiguration.checkNetworkConfigOld(numNetworkBuffers);TaskManagerServicesConfiguration.checkConfigParameter(networkBufBytes &#61; " &#43;totalJavaMemorySize &#43; " (total JVM memory size)");
}return networkBufBytes;

小结

  1. JVM预留内存&#xff0c;总内存的20%&#xff0c;最小预留&#xff0c;600M
  2. 剩下的内存的10%作为networkBuffer的内存&#xff0c;最小64M
  3. 剩下内存30%设为堆内内存&#xff0c;总内存减去堆内内存设为directMemory&#xff0c;用于netty和rocksDB和networkBuffer以及JVM自身内存

举例

一个启动时设置TaskManager内存大小为1024MB

  1. 1024MB - (1024 * 0.2 <600MB) -> 600MB &#61; 424MB (cutoff)
  2. 424MB - (424MB * 0.1 <64MB) -> 64MB &#61; 360MB (networkbuffer)
  3. 360MB * (1 - 0.7) &#61; 108MB -> &#xff08;onHeap&#xff09;
  4. 1024MB - 108MB &#61; 916MB &#xff08;maxDirectMemory&#xff09;

最终启动命令&#xff1a;

yarn 46218 46212 1 Jan08 ? 00:17:50
/home/yarn/java-current/bin/java
-Xms109m -Xmx109m -XX:MaxDirectMemorySize&#61;915m -verbose:gc -XX:&#43;PrintGCDetails -XX:&#43;PrintGCDateStamps
-XX:&#43;UseGCLogFileRotation -XX:NumberOfGCLogFiles&#61;2 -XX:GCLogFileSize&#61;512M
-Xloggc:/data1/hadoopdata/nodemanager/logdir/application_1545981373722_0172/container_e194_1545981373722_0172_01_000005/taskmanager_gc.log
-XX:&#43;UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction&#61;75
-XX:&#43;UseCMSInitiatingOccupancyOnly
-XX:&#43;AlwaysPreTouch -server
-XX:&#43;HeapDumpOnOutOfMemoryError
-Dlog.file&#61;/data1/hadoopdata/nodemanager/logdir/application_1545981373722_0172/container_e194_1545981373722_0172_01_000005/taskmanager.log
-Dlogback.configurationFile&#61;file:./logback.xml
-Dlog4j.configuration&#61;file:./log4j.properties org.apache.flink.yarn.YarnTaskManager
--configDir .

转:https://juejin.im/post/5c36f8216fb9a049f15466a7



推荐阅读
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 在Java基础中,私有静态内部类是一种常见的设计模式,主要用于防止外部类的直接调用或实例化。这种内部类仅服务于其所属的外部类,确保了代码的封装性和安全性。通过分析JDK源码,我们可以发现许多常用类中都包含了私有静态内部类,这些内部类虽然功能强大,但其复杂性往往让人感到困惑。本文将深入探讨私有静态内部类的作用、实现方式及其在实际开发中的应用,帮助读者更好地理解和使用这一重要的编程技巧。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 在Java项目中,当两个文件进行互相调用时出现了函数错误。具体问题出现在 `MainFrame.java` 文件中,该文件位于 `cn.javass.bookmgr` 包下,并且导入了 `java.awt.BorderLayout` 和 `java.awt.Event` 等相关类。为了确保项目的正常运行,请求提供专业的解决方案,以解决函数调用中的错误。建议从类路径、依赖关系和方法签名等方面入手,进行全面排查和调试。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 类加载机制是Java虚拟机运行时的重要组成部分。本文深入解析了类加载过程的第二阶段,详细阐述了从类被加载到虚拟机内存开始,直至其从内存中卸载的整个生命周期。这一过程中,类经历了加载(Loading)、验证(Verification)等多个关键步骤。通过具体的实例和代码示例,本文探讨了每个阶段的具体操作和潜在问题,帮助读者全面理解类加载机制的内部运作。 ... [详细]
  • 如何使用 `org.eclipse.rdf4j.query.impl.MapBindingSet.getValue()` 方法及其代码示例详解 ... [详细]
  • 在 Android 开发中,`android:exported` 属性用于控制组件(如 Activity、Service、BroadcastReceiver 和 ContentProvider)是否可以被其他应用组件访问或与其交互。若将此属性设为 `true`,则允许外部应用调用或与之交互;反之,若设为 `false`,则仅限于同一应用内的组件进行访问。这一属性对于确保应用的安全性和隐私保护至关重要。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
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社区 版权所有