美文网首页大数据开发工具文
大数据开发:Flink内存模型与参数讲解

大数据开发:Flink内存模型与参数讲解

作者: 成都加米谷大数据 | 来源:发表于2021-08-03 17:31 被阅读0次

    对Flink的内部运行机制的理解,是整个框架的学习当中,是非常关键的一部分,其中Flink基于内存的数据存储和管理,也是非常重要的知识点。今天的大数据开发学习分享,我们来讲讲Flink内存模型与参数。

    Flink社区在FLIP-49提出了新版统一的TaskManager内存模型及配置,这也是Flink 1.10版本最主要的改进与优化点之一。

    由于内存模型发生了变化,所以Flink 1.10作业的内存配置参数也与1.9版本之前有比较大的区别,本文就来具体看一看,防止生产环境中踩坑。

    新版内存模型与参数概览

    官方给出的图示如下——

    下面看图说话,分区域介绍之。

    Flink总内存(Total Flink Memory)

    含义

    TaskManager进程占用的所有与Flink相关的内存(不包括JVM元空间和其他额外开销)。具体包含4大块:Flink框架内存(堆内、堆外)、托管内存(仅堆外)、网络缓存(仅堆外)、任务内存(堆内、堆外)。

    参数

    taskmanager.memory.flink.size:无默认值,需要用户指定。

    Flink框架(Framework)内存

    含义

    Flink Runtime底层占用的内存,一般来讲相对固定,不需要更改。极特殊情况下才需要调大一些,比如非常高的算子并行度,或者与外部系统(如Hadoop)有密集交互等等。

    参数

    taskmanager.memory.framework.heap.size:堆内部分(Framework Heap),默认值128MB;

    taskmanager.memory.framework.off-heap.size:堆外部分(Framework Off-Heap),以直接内存形式分配,默认值128MB。

    托管(Managed)内存

    含义

    纯堆外内存,由MemoryManager管理,用于中间结果缓存、排序、哈希表等,以及RocksDB状态后端。可见,RocksDB消耗的内存可以由用户显式控制了,不再像旧版本一样难以预测和调节。

    参数

    taskmanager.memory.managed.fraction:托管内存占Flink总内存taskmanager.memory.flink.size的比例,默认值0.4;

    taskmanager.memory.managed.size:托管内存的大小,无默认值,一般也不指定,而是依照上述比例来推定,更加灵活。

    网络(Network)缓存

    含义

    纯堆外内存,用于TaskManager之间(shuffle、广播等)及与外部组件的数据传输,以直接内存形式分配。

    参数

    taskmanager.memory.network.min:网络缓存的最小值,默认64MB;

    taskmanager.memory.network.max:网络缓存的最大值,默认1GB;

    taskmanager.memory.network.fraction:网络缓存占Flink总内存taskmanager.memory.flink.size的比例,默认值0.1。若根据此比例算出的内存量比最小值小或比最大值大,就会限制到最小值或者最大值。

    任务(Task)内存

    含义

    顾名思义,是算子逻辑和用户代码、自定义数据结构真正占用的内存。

    参数

    taskmanager.memory.task.heap.size:堆内部分(Task Heap),无默认值,一般不建议设置,会自动用Flink总内存减去框架、托管、网络三部分的内存推算得出。

    taskmanager.memory.task.off-heap.size:堆外部分(Task Off-Heap),以直接内存形式分配,默认值为0,即不使用。

    TaskManager进程总内存(Total Process Memory)

    含义

    在容器化部署(on YARN/K8s/Mesos)环境下使用,是Flink总内存、JVM元空间与JVM额外内存开销的和,也就是容器本身的内存大小。

    参数

    taskmanager.memory.process.size:无默认值,需要用户指定。

    JVM元空间(Metaspace)

    含义

    不用多费口舌了吧。

    参数

    taskmanager.memory.jvm-metaspace.size:默认值256MB。

    JVM额外开销(Overhead)

    含义

    为JVM预留的其他本地内存,用于线程栈、代码缓存等,作用有些类似于之前版本中为容器预留的截断(cutoff)内存。当然在1.10版本中,原先的containerized.heap-cutoff-ratio与containerized.heap-cutoff-min参数对TM就不再生效了。

    参数

    taskmanager.memory.jvm-overhead.min:JVM额外开销的最小值,默认192MB;

    taskmanager.memory.jvm-overhead.max:JVM额外开销的最大值,默认1GB;

    taskmanager.memory.jvm-overhead.fraction:JVM额外开销占TM进程总内存taskmanager.memory.process.size(注意不是Flink总内存)的比例,默认值0.1。若根据此比例算出的内存量比最小值小或比最大值大,就会限制到最小值或者最大值。

    Flink内存参数与JVM参数的关系

    上述内存参数会直接影响启动TaskManager时使用的JVM参数,使用相关工具可以观察到。

    -Xmx/-Xms:对应堆内框架内存与任务内存之和;

    -XX:MaxDirectMemorySize:对应三块直接内存,即堆外框架内存、任务内存与网络缓存之和;

    -XX:MaxMetaspaceSize:对应JVM元空间设置。

    到底该如何配置?

    一大堆参数看得人眼花缭乱,但实际用起来并不需要管那么多。简而言之:

    如果是Standalone部署,就指定Flink总内存taskmanager.memory.flink.size;

    如果是容器化部署,就指定TM进程总内存taskmanager.memory.process.size。

    其他部分内存的分配大可交给Flink本身去决定。如果需要依照业务特点做微调的话,建议首先修改网络缓存占比taskmanager.memory.network.fraction(根据网络流量大小)与托管内存占比taskmanager.memory.managed.fraction(根据RocksDB状态大小等),进而能够间接影响任务内存的配额。手动指定较多的参数——特别是固定内存量的参数——容易使内存配额出现冲突,导致部署失败,要小心。

    关于大数据开发,Flink内存模型与参数,以上就为大家做了大致的讲解了。Flink的内存模型与参数的配置,是入门阶段必须要掌握的,这部分多去熟悉,才能更快掌握。

    相关文章

      网友评论

        本文标题:大数据开发:Flink内存模型与参数讲解

        本文链接:https://www.haomeiwen.com/subject/xipevltx.html