ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Apache Flink 内存配置升级指南:从 Flink 1.9/1.10 迁移到 1.10/1.11+ 的 TaskManager 与 JobManager 内存配置迁移

Apache Flink 内存配置升级指南:从 Flink 1.9/1.10 迁移到 1.10/1.11+ 的 TaskManager 与 JobManager 内存配置迁移 Apache Flink 内存配置升级指南从 Flink 1.9/1.10 迁移到 1.10/1.11 的 TaskManager 与 JobManager 内存配置迁移【免费下载链接】flink项目地址: https://gitcode.com/gh_mirrors/fli/flinkApache Flink 在 1.10 和 1.11 版本中分别对 TaskManager 和 JobManager 的内存配置方法做出了重大调整一批旧配置参数被移除或改变语义。本文以官方升级指南为骨架结合当前仓库源码flink-runtime、flink-core、flink-dist逐项说明旧参数的去向、新参数的语义与默认值并给出从 Flink 1.9 及以前版本的 TaskManager 配置、Flink 1.10 及以前版本的 JobManager 配置迁移到新内存模型的完整实操路径。读完本文你将能够独立完成存量 Flink 集群的内存配置升级并理解新旧内存模型的差异根源。注意请仔细阅读本篇升级指南。使用原本的和新的内存配制方法可能会使内存组成部分具有截然不同的大小。未经调整直接沿用 Flink 1.10 以前版本的 TaskManager 配置文件或 Flink 1.11 以前版本的 JobManager 配置文件可能导致应用的行为、性能发生变化甚至造成应用执行失败。升级前的必读要点在 1.10/1.11 版本之前Flink 不要求用户一定要配置 TaskManager/JobManager 内存相关的参数因为这些参数都具有默认值。新的内存配置要求用户至少指定下列配置参数或参数组合的其中之一否则 Flink 将无法启动本地运行除外TaskManagerJobManagertaskmanager.memory.flink.sizejobmanager.memory.flink.sizetaskmanager.memory.process.sizejobmanager.memory.process.sizetaskmanager.memory.task.heap.size和taskmanager.memory.managed.sizejobmanager.memory.heap.size这一硬性要求的实现逻辑位于 ProcessMemoryUtils.java它要求至少配置「细粒度内存选项、Flink 总内存、进程总内存」三组中的一组否则计算直接失败。同时不建议同时设置进程总内存和Flink 总内存这会造成内存配置冲突从而导致部署失败额外配置其他内存部分时同样需要注意冲突。Flink 自带的默认 Flink 配置文件 已指定了taskmanager.memory.process.size 1.10和jobmanager.memory.process.size 1.11以便与此前行为保持一致。升级 TaskManager 内存配置本节面向从 Flink 1.9 及以前版本升级到 1.10 及以后版本的用户。配置参数变化总览已被彻底移除的配置参数配置它们将不会产生任何效果移除的配置参数备注taskmanager.memory.fraction参考新配置参数taskmanager.memory.managed.fraction。新参数与旧参数语义不同配置值通常需要调整详见如何升级托管内存taskmanager.memory.off-heapFlink 不再支持堆上的On-Heap托管内存详见如何升级托管内存taskmanager.memory.preallocateFlink 不再支持内存预分配托管内存今后都是惰性分配的详见如何升级托管内存已被弃用的配置参数出于向后兼容性配置它们会被解读成对应的新配置参数弃用的配置参数对应的新配置参数taskmanager.heap.size独立部署模式下taskmanager.memory.flink.size容器化部署模式下taskmanager.memory.process.size。详见如何升级总内存taskmanager.memory.sizetaskmanager.memory.managed.size。详见如何升级托管内存taskmanager.network.memory.mintaskmanager.memory.network.mintaskmanager.network.memory.maxtaskmanager.memory.network.maxtaskmanager.network.memory.fractiontaskmanager.memory.network.fraction尽管网络内存的配置参数没有发生太多变化仍建议检查其配置结果网络内存的大小可能会受到其他内存部分大小变化的影响例如总内存变化时根据占比计算出的网络内存也可能发生变化。详见内存模型详解。容器切除Cut-Off内存相关的配置参数containerized.heap-cutoff-ratio和containerized.heap-cutoff-min将不再对 TaskManager 进程生效详见容器切除Cut-Off内存。总内存原堆内存在原本的内存配置方法中用于指定 Flink 总内存的配置参数是taskmanager.heap.size或taskmanager.heap.mb。尽管这两个参数以“堆Heap”命名实际上它们指定的内存既包含了 JVM 堆内存也包含了其他堆外内存部分。这两个配置参数目前已被弃用。如果配置了上述弃用的参数同时又没有配置与之对应的新配置参数它们将按如下规则对应到新的配置参数独立部署模式Standalone映射为 Flink 总内存taskmanager.memory.flink.size容器化部署模式Containerized如 YARN映射为进程总内存taskmanager.memory.process.size建议尽早使用新的配置参数取代被弃用的配置参数它们在今后的版本中可能会被彻底移除。总内存的配置方法参考如何配置总内存。JVM 堆内存此前JVM 堆空间由托管内存仅在配置为堆上时及 Flink 用到的所有其他堆内存组成这里的其他堆内存由总内存减去所有其他非堆内存得到。现在如果仅配置了 Flink 总内存或进程总内存JVM 堆空间依然是根据总内存减去所有其他非堆内存得到的。新模型下你可以更直接地控制用于任务和算子的 JVM 堆内存taskmanager.memory.task.heap.size详见任务堆内存。如果流处理作业选择使用 Heap State BackendMemoryStateBackend 或 FsStateBackend那么它同样需要使用 JVM 堆内存。Flink 现在总是会预留一部分 JVM 堆内存供框架使用taskmanager.memory.framework.heap.size。从 TaskManagerOptions.java 源码可以看到该参数默认值为128m这是 TaskExecutor 框架自身使用、不会被分配给任务槽位的堆内存详见框架内存。升级托管内存明确的大小原本用于指定明确的托管内存大小的配置参数taskmanager.memory.size已被弃用与它具有相同语义的新配置参数为taskmanager.memory.managed.size。建议使用新参数旧参数在今后版本中可能被彻底移除。从源码看新参数通过withDeprecatedKeys(taskmanager.memory.size)保留了旧键名的兼容读取TaskManagerOptions.java 中的MANAGED_MEMORY_SIZE定义。占比此前如果不指定明确大小可以将托管内存配置为占用「总内存减去网络内存和容器切除内存仅在 YARN 下」之后剩余部分的固定比例taskmanager.memory.fraction。该参数已被彻底移除。请使用新的配置参数taskmanager.memory.managed.fraction。在未通过taskmanager.memory.managed.size指定明确大小的情况下新参数指定的是托管内存在Flink 总内存中的所占比例默认值为0.4即 40%见 TaskManagerOptions.java 中MANAGED_MEMORY_FRACTION定义。这正是新旧语义差别的核心旧占比的基准是「总内存 − 网络内存 − 容器切除内存」新占比的基准是「Flink 总内存」因此相同的占比配置值通常需要重新评估。RocksDB State Backend流处理作业如果选择使用 RocksDBStateBackend它使用的本地内存现在也被归为托管内存。默认情况下RocksDB 将限制其内存用量不超过托管内存大小以避免在 YARN 上容器被杀。你也可以通过设置state.backend.rocksdb.memory.managed来关闭 RocksDB 的内存控制。这部分变化同时影响容器切除内存的处理详见容器切除Cut-Off内存。其他变化此外Flink 1.10 对托管内存还引入了下列变化托管内存现在总是在堆外。配置参数taskmanager.memory.off-heap已被彻底移除配置它不会产生任何效果。托管内存现在使用本地内存Native Memory而非直接内存Direct Memory。这意味着托管内存将不在 JVM 直接内存限制-XX:MaxDirectMemorySize的范围内。托管内存现在总是惰性分配的。配置参数taskmanager.memory.preallocate已被彻底移除配置它不会产生任何效果。升级 JobManager 内存配置本节面向从 Flink 1.10 及以前版本升级到 1.11 及以后版本的用户。在原本的内存配置方法中用于指定 JVM 堆内存的配置参数是jobmanager.heap.sizejobmanager.heap.mb尽管这两个参数以“堆Heap”命名在此之前它们实际上只有在独立部署模式下才完全对应于 JVM 堆内存。在容器化部署模式下Kubernetes 和 YARN它们指定的内存还包含了其他堆外内存部分JVM 堆空间的实际大小是参数指定的大小减去容器切除Cut-Off内存后剩余的部分。容器切除内存在 1.11 及以上版本中已被彻底移除。从 1.11 版本开始Flink 将采用与独立部署模式相同的方式设置这些参数。这两个配置参数目前已被弃用在 JobManagerOptions.java 中已被标注Deprecated。如果配置了上述弃用的参数同时又没有配置与之对应的新配置参数它们将按如下规则对应到新的配置参数独立部署模式Standalone映射为 JVM 堆内存jobmanager.memory.heap.size容器化部署模式ContainerizedKubernetes、YARN映射为进程总内存jobmanager.memory.process.size建议尽早使用新配置参数取代被弃用参数。如果仅配置了 Flink 总内存或进程总内存那么 JVM 堆内存将是总内存减去其他内存部分后剩余的部分如何配置总内存也可以通过配置jobmanager.memory.heap.size直接指定 JVM 堆内存如何配置 JVM 堆。源码中 JobManagerOptions.java 还定义了最小 JVM 堆大小为128MB的约束MIN_JVM_HEAP_SIZE。Flink JVM 进程内存限制从 1.10 版本开始Flink 通过设置相应的 JVM 参数对 TaskManager 进程使用的JVM Metaspace和JVM 直接内存进行限制从 1.11 版本开始Flink 同样对 JobManager 进程使用的JVM Metaspace进行限制。此外还可以通过设置jobmanager.memory.enable-jvm-direct-memory-limit对 JobManager 进程的 JVM 直接内存进行限制。Flink 启动时实际设置的 JVM 参数汇总如下详见JVM 参数JVM 参数TaskManager 取值JobManager 取值-Xmx和-Xms框架堆内存 任务堆内存JVM 堆内存 (*)-XX:MaxDirectMemorySizeTaskManager 始终设置JobManager 见注释框架堆外内存 任务堆外内存(**) 网络内存堆外内存 (**) (***)-XX:MaxMetaspaceSizeJVM MetaspaceJVM Metaspace(*) 请记住根据所使用的 GC 算法你可能无法使用到全部堆内存。一些 GC 算法会为它们自身分配一定量的堆内存这会导致堆的指标返回一个不同的最大值。(**) 请注意堆外内存也包括了用户代码使用的本地内存非直接内存。(***) 只有在jobmanager.memory.enable-jvm-direct-memory-limit设置为true时JobManager 才会设置 JVM 直接内存限制。该参数默认值为false见 JobManagerOptions.java 中JVM_DIRECT_MEMORY_LIMIT_ENABLED定义。Flink 通过设置上述 JVM 内存限制降低内存泄漏问题的排查难度以避免出现容器内存溢出等问题。相关异常可参考常见问题中关于 JVM Metaspace 和 JVM 直接内存OutOfMemoryError的描述。容器切除Cut-Off内存在容器化部署模式下此前你可以指定切除内存这部分内存将预留给所有未被 Flink 计算在内的内存开销其主要来源是不受 Flink 直接管理的依赖使用的内存例如 RocksDB、JVM 内部开销等。相应的配置参数containerized.heap-cutoff-ratio和containerized.heap-cutoff-min不再生效新的内存配置方法引入了新的内存组成部分来具体描述这些内存用量。TaskManager流处理作业如果使用了 RocksDBStateBackendRocksDB 使用的本地内存现在将被归为托管内存默认情况下 RocksDB 将限制其内存用量不超过托管内存大小TaskManagerOptions.java 中MANAGED_MEMORY_FRACTION默认 0.4 即为 RocksDB 等消费者可用的托管内存额度来源。其他堆外直接或本地内存开销现在可以通过下列配置参数进行设置任务堆外内存taskmanager.memory.task.off-heap.size默认0框架堆外内存taskmanager.memory.framework.off-heap.size默认128mJVM Metaspacetaskmanager.memory.jvm-metaspace.size默认256mJVM 开销taskmanager.memory.jvm-overhead.min/max/fraction默认分别为192m、1g、0.1以上默认值均可在 TaskManagerOptions.java 中确认。JobManager可以通过下列配置参数设置堆外直接或本地内存开销堆外内存jobmanager.memory.off-heap.size默认128mJVM Metaspacejobmanager.memory.jvm-metaspace.size默认256mJVM 开销jobmanager.memory.jvm-overhead.min/max/fraction默认分别为192m、1g、0.1以上默认值均可在 JobManagerOptions.java 中确认。Flink 配置文件中的默认配置Flink 自带的默认配置文件flink-dist/src/main/resources/config.yaml中内存默认配置发生了如下变化原本的 TaskManager 总内存taskmanager.heap.size被新的配置项taskmanager.memory.process.size所取代默认值从 1024MB 增加到了1728MB。原本的 JobManager 总内存jobmanager.heap.size被新的配置项jobmanager.memory.process.size所取代默认值从 1024MB 增加到了1600MB。在config.yaml中可以看到对应配置jobmanager: memory: process: size: 1600m taskmanager: memory: process: size: 1728m仓库中的集成测试 BashJavaUtilsITCase.java 同样验证了1728m与1600m这两个默认进程内存值说明该默认值是发布产物中实际生效的配置。注意使用新的默认配置文件可能会造成各内存部分的大小发生变化从而产生性能变化。总内存配置方法参考如何配置总内存。新旧内存模型的源码对照为了更透彻地理解升级的底层原理可以对照flink-runtime中的核心实现内存组成模型TaskExecutorProcessSpec.java 以类图注释的形式给出了 TaskManager 的完整内存组成框架堆内存、框架堆外内存、任务堆内存、任务堆外内存、网络内存、托管内存、JVM Metaspace、JVM 开销。其中进程总内存 Flink 总内存 JVM Metaspace JVM 开销Flink 总内存 除 Metaspace 与开销外的全部组件。这与 1.9 及以前「一个堆参数 切除内存」的模型有本质区别正是升级后内存各组件大小发生明显变化的根源。内存计算与旧参数映射TaskExecutorProcessUtils.java 通过TM_LEGACY_HEAP_OPTIONS定义了旧参数taskmanager.heap.size/taskmanager.heap.mb以及环境变量FLINK_TM_HEAP的兼容读取MemoryBackwardsCompatibilityUtils.java 实现了「若新参数未配置且旧参数已配置则将旧堆内存值映射为新的内存配置项」的逻辑。因此升级到新版本后旧的taskmanager.heap.size等参数不会报错而是被当作新参数解读——这与本文前面两张参数变化表的行为完全一致。总内存推导规则ProcessMemoryUtils.java 实现了总内存与各内存组件之间的双向推导并强制要求至少配置「细粒度选项、Flink 总内存、进程总内存」三组中的一组否则启动失败。升级实操检查清单按照本指南完成升级时建议按以下顺序操作识别部署模式确认作业运行在独立部署模式还是容器化部署模式YARN/Kubernetes这将决定旧参数映射到 Flink 总内存还是进程总内存。检查旧参数使用情况在conf/config.yaml或旧版conf/flink-conf.yaml中搜索taskmanager.heap.size、taskmanager.heap.mb、taskmanager.memory.size、taskmanager.memory.fraction、taskmanager.memory.off-heap、taskmanager.memory.preallocate、containerized.heap-cutoff-ratio、containerized.heap-cutoff-min等已移除/弃用参数。替换为新的总内存参数独立部署使用taskmanager.memory.flink.size/jobmanager.memory.heap.size容器化部署使用taskmanager.memory.process.size/jobmanager.memory.process.size。重新评估托管内存确认taskmanager.memory.managed.size是否显式配置若使用占比方式注意新参数taskmanager.memory.managed.fraction默认 0.4的基准是 Flink 总内存与旧参数语义不同。检查网络内存核对taskmanager.memory.network.min/max/fraction配置结果必要时参考网络内存调优指南。处理 RocksDB 场景使用 RocksDBStateBackend 的作业确认托管内存是否足够是否需要设置state.backend.rocksdb.memory.managed。核对默认值变化留意默认进程总内存从 1024MB 提升至 1728MBTaskManager和 1600MBJobManager可能带来的资源与性能变化。验证启动使用bin/start-cluster.sh或对应资源提供者的启动脚本验证集群正常启动必要时查看logs中内存相关告警。【免费下载链接】flink项目地址: https://gitcode.com/gh_mirrors/fli/flink创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表