zoukankan      html  css  js  c++  java
  • Flink 源码(二十五):Flink 内存管理(一)内存模型与内存数据结构

    0 简介

      目前,大数据计算引擎主要用 Java 或是基于 JVM 的编程语言实现的,例如 ApacheHadoop、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 中。

    1 内存模型

    1.1 JobManager 内存模型

    JobManagerFlinkMemory.java
      在 1.10 中,Flink 统一了 TM 端的内存管理和配置,相应的在 1.11 中,Flink 进一步对 JM 端的内存配置进行了修改,使它的选项和配置方式与 TM 端的配置方式保持一致。

    1.2 TaskManager 内存模型

      Flink 1.10 对 TaskManager 的内存模型和 Flink 应用程序的配置选项进行了重大更改,让用户能够更加严格地控制其内存开销。
    TaskExecutorFlinkMemory.java
    ⚫ JVM Heap:JVM 堆上内存
    1、Framework Heap Memory:Flink 框架本身使用的内存,即 TaskManager 本身所占用的堆上内存,不计入 Slot 的资源中。配置参数:taskmanager.memory.framework.heap.size=128MB,默认 128MB
    2、Task Heap Memory:Task 执行用户代码时所使用的堆上内存。配置参数:taskmanager.memory.task.heap.size
    ⚫ Off-Heap Mempry:JVM 堆外内存
    1、DirectMemory:JVM 直接内存
      1)Framework Off-Heap Memory:Flink框架本身所使用的内存,即TaskManager本身所占用的对外内存,不计入 Slot 资源。
        配置参数:taskmanager.memory.framework.off-heap.size=128MB,默认 128MB
      2)Task Off-Heap Memory:Task 执行用户代码所使用的对外内存。
        配置参数:taskmanager.memory.task.off-heap.size=0,默认 0
      3)Network Memory:网络数据交换所使用的堆外内存大小,如网络数据交换
        缓冲区
          配置参数:
            taskmanager.memory.network.fraction: 0.1
            taskmanager.memory.network.min: 64mb
            taskmanager.memory.network.max: 1gb
    2、Managed Memory:Flink 管理的堆外内存,用于排序、哈希表、缓存中间结果及RocksDB State Backend 的本地内存。
      配置参数:
        taskmanager.memory.managed.fraction=0.4
        taskmanager.memory.managed.size
    ⚫ JVM specific memory:JVM 本身使用的内存
    1、JVM metaspace:JVM 元空间
    2、JVM over-head 执行开销:JVM 执行时自身所需要的内容,包括线程堆栈、IO、
      编译缓存等所使用的内存。
        配置参数:
          taskmanager.memory.jvm-overhead.min=192mb
          taskmanager.memory.jvm-overhead.max=1gb
          taskmanager.memory.jvm-overhead.fraction=0.1
    ⚫ 总体内存
    1、总进程内存:Flink Java 应用程序(包括用户代码)和 JVM 运行整个进程所消耗的总内存。
        总进程内存 = Flink 使用内存 + JVM 元空间 + JVM 执行开销
        配置项:taskmanager.memory.process.size: 1728m
    2、Flink 总内存:仅 Flink Java 应用程序消耗的内存,包括用户代码,但不包括 JVM为其运行而分配的内存
        Flink 使用内存:框架堆内外 + task 堆内外 + network + manage
        配置项:taskmanager.memory.flink.size: 1280m
    说明:配置项详细信息查看如下链接
    https://ci.apache.org/projects/flink/flink-docs-release-1.12/deployment/config.html#memory-configuration
    1.3 内存分配
    1、JobManager 内存分配
      YarnClusterDescriptor.java
    JobManagerProcessUtils.java

     

    ProcessMemoryUtils.java

     

     

    JobManagerFlinkMemoryUtils.java

     

    2、TaskManager 内存分配
    ActiveResourceManager.java
    TaskExecutorProcessUtils.java

     

     
     
     
     
  • 相关阅读:
    HDU 4348 To the moon(可持久化线段树)
    HDU 5875 Function 大连网络赛 线段树
    HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)
    HDU 5876 大连网络赛 Sparse Graph
    HDU 5701 中位数计数 百度之星初赛
    CodeForces 708B Recover the String
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    ASP.NET生成验证码
    ASP.NET生成验证码
    ASP.NET生成验证码
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14527139.html
Copyright © 2011-2022 走看看