详解flink性能优化

1. 简介

Apache Flink是一个强大的流处理框架,其性能很大程度上取决于内存的使用效率。在大规模数据处理场景中,合理的内存配置和优化可以显著提升Flink作业的性能和稳定性。本文将深入探讨Flink内存优化的各个方面,包括状态后端选择、内存配置参数、分布式状态管理等。

2. Flink 状态管理与内存

2.1 状态后端选择

Flink提供了多种状态后端,每种都有不同的内存使用特性:

  1. HashMapStateBackend:将状态数据作为Java对象存储在JVM堆内存中

    • 优点:访问速度快(内存级别)
    • 缺点:受集群可用内存限制
    • 适用场景:对性能要求高但状态大小适中的作业
  2. EmbeddedRocksDBStateBackend:将状态存储在TaskManager本地磁盘的RocksDB数据库中

    • 优点:状态大小仅受磁盘空间限制
    • 缺点:相比HashMapStateBackend吞吐量较低
    • 适用场景:状态非常大,需要增量检查点的场景
  3. ForStStateBackend(实验性):基于ForSt项目的分布式状态管理,允许状态存储在远程文件系统上

    • 优点:状态可以存储在远程文件系统(HDFS、S3等),超越本地磁盘容量限制
    • 缺点:仍处于实验阶段,不完全生产就绪
    • 适用场景:超大规模状态,云原生设置

2.2 HashMapStateBackend 内存优化

HashMapStateBackend将所有状态保存在JVM堆内存中,因此优化主要集中在JVM内存管理上:

  • 合理设置TaskManager的堆内存大小

  • 调整JVM垃圾回收参数

  • 避免对象频繁创建和销毁

  • 考虑使用堆外内存减轻GC压力

2.3 RocksDBStateBackend 内存优化

RocksDB状态后端的内存使用更为复杂,Flink提供了多种配置选项来控制其内存使用:

内存管理模式

  • 默认情况下,RocksDB内存配置与Flink的每槽位托管内存匹配
  • 内存在写入路径(MemTable)和读取路径(索引、过滤器、缓存)之间分配

关键内存参数

  • state.backend.rocksdb.memory.write-buffer-ratio:写缓冲区占比(默认:0.5)

  • state.backend.rocksdb.memory.high-prio-pool-ratio:高优先级池占比(默认:0.1)

写入缓冲区配置

  • state.backend.rocksdb.writebuffer.size:内存中构建的数据量(默认:64MB)

  • state.backend.rocksdb.writebuffer.count:内存中构建的最大写缓冲区数量(默认:2)

批量写入优化

  • state.backend.rocksdb.write-batch-size:RocksDB批量写入的最大内存消耗(默认:2MB)

2.4 ForStStateBackend 内存优化

ForSt状态后端是Flink 2.0引入的实验性功能,用于分布式状态管理。它提供了类似RocksDB的内存配置选项,但针对分布式存储进行了优化:

内存管理模式

  • state.backend.forst.memory.managed:是否使用托管内存(默认:true)
  • state.backend.forst.memory.fixed-per-slot:每个槽位的固定内存大小(覆盖托管内存选项)
  • state.backend.forst.memory.fixed-per-tm:每个TaskManager的固定内存大小(集群级别选项)

内存分配比例

  • ate.backend.forst.memory.write-buffer-ratio:写缓冲区占比(默认:0.5)

  • state.backend.forst.memory.high-prio-pool-ratio:高优先级池占比(默认:0.1)

缓存配置

  • state.backend.forst.cache.lru.promote-limit**:LRU缓存提升限制(默认:3)

  • state.backend.forst.block.cache-size:数据块缓存大小(默认:8MB)

3. 内存配置参数详解

3.1 RocksDB 内存参数

RocksDB的内存使用主要分为以下几个部分:

  1. 写入路径内存
  • 写缓冲区(MemTable):用于临时存储写入的数据

  • 配置参数:state.backend.rocksdb.writebuffer.sizestate.backend.rocksdb.writebuffer.count

  1. 读取路径内存
  • 缓存:用于缓存数据块

  • 索引和过滤器:用于加速查询

  • 配置参数:state.backend.rocksdb.memory.high-prio-pool-ratio

  1. 其他内存参数
  • state.backend.rocksdb.thread.num**:并发后台刷新和压缩作业的最大数量(默认:2)

  • state.backend.rocksdb.files.open:DB可以使用的最大打开文件数(默认:-1,表示无限制)

3.2 ForState 内存参数

ForState状态后端的内存配置与RocksDB类似,但增加了一些针对分布式存储的特定参数:

  1. 基本内存配置
  • state.backend.forst.memory.managed:是否使用托管内存

  • state.backend.forst.memory.fixed-per-slot:每个槽位的固定内存大小

  • state.backend.forst.memory.fixed-per-tm:每个TaskManager的固定内存大小

    2 . 内存分配比例

  • state.backend.forst.memory.write-buffer-ratio:写缓冲区占比

  • state.backend.forst.memory.high-prio-pool-ratio:高优先级池占比

  1. 索引和过滤器配置
  • state.backend.forst.memory.partitioned-index-filters:是否使用分区索引/过滤器(默认:true)

  • state.backend.forst.use-bloom-filter:是否为新创建的SST文件使用布隆过滤器(默认:false)

  • state.backend.forst.bloom-filter.bits-per-key:布隆过滤器每个键使用的位数(默认:10.0)

  1. 执行器配置
  • state.backend.forst.executor.inline-coordinator:是否让任务线程作为协调线程(默认:false)
  • state.backend.forst.executor.inline-write:是否在协调线程内执行写请求(默认:true)

4. 分布式状态管理与内存优化

Flink 2.0引入的分布式状态管理(Disaggregated State Management)是一项重要的内存优化技术,特别适用于超大规模状态场景:

  1. 分布式状态管理的优势

    • 无限状态大小:状态大小仅受外部存储系统限制
    • 稳定资源使用:状态存储在外部存储中,检查点操作非常轻量级
    • 快速恢复:恢复时无需下载状态,恢复时间与状态大小无关
    • 灵活性:可以根据需求轻松选择不同的外部存储系统或I/O性能级别
    • 成本效益:外部存储通常比本地磁盘更便宜,可以独立调整计算资源和存储资源
  2. 分布式状态管理的组成部分

    • ForSt 状态后端:将状态存储在外部存储系统中,也可以利用本地磁盘进行缓存和缓冲
    • 新状态 API:引入异步状态读写的新状态API(State V2),对于克服访问分布式状态时的高网络延迟至关重要
    • SQL 支持:许多SQL算子已重写以支持分布式状态管理和异步状态访问
  3. 分布式状态管理的配置

    • 默认情况下,ForSt状态后端将状态存储在检查点目录中,这样可以实现轻量级检查点和快速恢复

    • 可以通过配置state.backend.forst.primary-dir指定不同的主存储位置

    • ForSt使用本地磁盘进行缓存和缓冲,缓存粒度为整个文件

  4. 文件缓存策略

    • 基于大小的限制:当缓存大小超过限制时,会驱逐最旧的文件
    • 基于保留空间的限制:当磁盘上的保留空间不足时,会驱逐最旧的文件
    • 相关配置:
    • state.backend.forst.cache.size-based-limit: 1GB
    • state.backend.forst.cache.reserve-size: 10GB
  5. 同步与异步状态访问

    • 默认情况下,ForSt仅在使用异步API(State V2)时才会分散状态
    • 使用同步状态API时,ForSt默认仅作为本地状态存储
    • 可以通过配置state.backend.forst.sync.enforce-local: false让同步API的操作也存储在远程

5. 内存优化最佳实践

5.1 内存分配策略

  1. 托管内存与固定内存
  • 对于RocksDB和ForSt状态后端,建议使用托管内存模式(默认开启)

  • 托管内存模式下,状态后端会自动配置自身使用任务槽的托管内存预算

  • 如果需要更精细的控制,可以使用固定内存模式:

    • state.backend.forst.memory.fixed-per-slot:每个槽位固定内存

    • state.backend.forst.memory.fixed-per-tm:每个TaskManager固定内存

  1. 内存比例分配

    • 写缓冲区与缓存内存的比例分配对性能影响很大

    • 默认配置:写缓冲区占50%,缓存内存占50%(其中高优先级池占缓存内存的10%)

    • 读密集型作业可以增加缓存内存比例

    • 写密集型作业可以增加写缓冲区比例

  2. 内存参数验证

  • 统会验证内存参数的合法性,例如写缓冲区比例和高优先级池比例之和不能超过1.0

  • 非法的内存配置会导致异常

5.2 缓存优化

块缓存配置:

  • 缓存用于存储数据块,对读取性能影响很大

    • 默认块缓存大小为8MB,可以根据需要调整
    • 配置参数:state.backend.forst.block.cache-size

    LRU 缓存策略优化

  • ForSt使用LRU(最近最少使用)策略管理缓存

    • 可以通过state.backend.forst.cache.lru.promote-limit配置热链接块的提升限制
    • 默认值为3,表示当热链接中的块被移动到冷链接的次数达到3次时,该块将被阻止提升到LRU列表的头部

    布隆过滤器优化

  • 布隆过滤器可以加速键值查找,减少不必要的磁盘访问

    • 默认情况下布隆过滤器是禁用的,可以通过state.backend.forst.use-bloom-filter启用
    • 启用后,可以通过state.backend.forst.bloom-filter.bits-per-key配置每个键使用的位数(默认10.0)

    分区索引和过滤器

  • 启用分区索引和过滤器可以减少内存使用并提高查询效率

    • 默认情况下已启用(state.backend.forst.memory.partitioned-index-filters为true)
    • 分区索引将SST文件的索引/过滤器块分割成更小的块,并在它们上添加一个顶层索引
    • 读取时,只有顶层索引被加载到内存中,按需加载所需的分区

5.3 Checkpoint 与内存优化

增量检查点

  • 增量检查点只存储自上次检查点以来的状态变化,而不是完整状态

  • 对于大状态作业,显著减少检查点完成时间

  • 配置方法:execution.checkpointing.incremental: true

  • RocksDB和ForSt状态后端都支持增量检查点

执行器线程配置

  • ForSt状态后端提供了执行器线程配置选项,可以优化内存使用和性能

  • state.backend.forst.executor.inline-coordinator:是否让任务线程作为协调线程(默认false)

  • state.backend.forst.executor.inline-write:是否在协调线程内执行写请求(默认true)

写入批处理优化

  • 批量写入可以减少I/O操作,提高写入性能

  • RocksDB配置参数:state.backend.rocksdb.write-batch-size(默认2MB)

  • ForSt配置参数:state.backend.forst.write-batch-size(默认2MB)

6. 总结

Flink内存优化是提高作业性能和稳定性的关键。通过选择合适的状态后端、调整内存配置参数、优化缓存策略等方法,可以显著提升Flink作业的性能。对于不同规模和特性的作业,应采用不同的优化策略:

  • 小规模状态:使用HashMapStateBackend,关注JVM内存优化
  • 中等规模状态:使用EmbeddedRocksDBStateBackend,优化RocksDB内存参数
  • 超大规模状态:使用ForStStateBackend,结合异步状态API和分布式存储

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96442.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VueFlow的箭头怎么调整

正好最近用到了VueFlow组件,发现箭头默认样式太小,无法体现流程展示,因此翻阅相关资料得出下列方法,有什么更好的方法,大家可以推荐推荐,谢谢。方法1:通过边(Edge)的样式…

【Python】S1 基础篇 P9 文件处理与异常处理技术

目录文件读取操作读取文件的全部内容相对路径和绝对路径逐行访问文件内容文件写入操作写入单行内容写入多行内容结构化数据的存储异常处理机制理解异常的工作原理ZeroDivisionError异常示例try-except语句块的使用else语句块的正确使用静默失败的合理应用本文将深入探讨Python中…

分布式事务实战手册:从四场业务灾难看方案选型与落地陷阱

在分布式系统的稳定性战役中,数据一致性问题如同潜伏的暗礁。某生鲜电商因分布式事务设计缺陷,在春节促销期间出现"下单成功但无库存发货"的悖论,3小时内产生2300笔无效订单,客服投诉量激增300%;某银行转账系…

Java算法题中的输入输出流

在Java算法题中,处理输入输出主要依赖系统流(System.in和System.out),常用的方法总结如下: 一、输入方法(读取系统输入) 主要通过java.util.Scanner类或BufferedReader类实现,适用于…

墨水屏程序

EPD Reader 基于ESP32-C3的电子墨水屏阅读器,支持ap 配网、sntp 时间同步、txt阅读、天气预报、显示节假日信息、农历显示、自动休眠、web配置等功能。这是在另一个项目 一个rust embassy esp32c3 的练习项目-CSDN博客的基础上修改的 。 界面比较粗糙,以…

Git 创建 SSH 密钥

1.生成 SSH 密钥 打开 Git Bash ssh-keygen -t ed25519 -C "your_email@example.com" 把 ”your_email@example.com“ 改成再 github 注册的邮箱 系统会提示您三次输入: 第一个提示:Enter file in which to save the key (/c/Users/86189/.ssh/id_ed25519): 直接…

当前 AI 的主流应用场景

当前AI技术已深度渗透至社会各领域,2025年的主流应用场景呈现出行业垂直化、交互自然化、决策自主化三大特征。以下从六大核心领域展开分析,结合最新技术突破与规模化落地案例,揭示AI如何重塑人类生产生活范式: 一、智能办公与生产力革命 AI正从工具升级为「数字同事」,…

EI会议:第六届电信、光学、计算机科学国际会议(TOCS 2025)

第六届电信、光学、计算机科学国际会议(TOCS 2025)定于11月21-23日在中国南阳举行,本届会议以“电信、光学、计算机科学”为主题,旨在为相关领域的专家和学者提供一个探讨行业热点问题,促进科技进步,增加科…

回归预测 | MATLAB基于GRU-Attention的多输入单输出回归预测

代码是一个基于 MATLAB 的深度学习时间序列预测模型,结合了 GRU(门控循环单元)和自注意力机制(Self-Attention),用于回归预测任务。 一、主要功能 使用 GRU + Self-Attention 神经网络模型对时间序列数据进行回归预测,评估模型在训练集和测试集上的性能,并可视化预测结…

【JavaEE】(24) Linux 基础使用和程序部署

一、Linux 背景知识 Linux 的第一个版本开发者是 Linus,所以部分人会叫“林纳斯”。Linux 只是一个开源的操作系统内核,有些公司/开源组织基于 Linux 内核,配套了不同的应用程序,构成不同的操作系统(比如 vivo、&#…

视觉SLAM第9讲:后端1(EKF、非线性优化)

目标: 1.理解后端的概念; 2.理解以EKF为代表的滤波器后端的工作原理; 3.理解非线性优化的后端,明白稀疏性是如何利用的; 4.使用g2o和Ceres实际操作后端优化。 9.1 概述 9.1.1 状态估计的概率解释 1.后端优化引出 前段…

楼宇自控系统监控建筑变配电系统:功效体现在安全与节能层面

建筑变配电系统是保障建筑电力供应的 “心脏”,负责将外界高压电转化为建筑内设备可使用的低压电,为暖通、照明、电梯等核心系统供电。传统变配电管理依赖人工巡检,不仅存在 “监测滞后、故障难预判” 的安全隐患,还因无法精准调控…

【Docker安装使用常见问题汇总】

文章目录1. wsl update failed: update failed:2.dockerDesktopLinuxEngine: The system cannot find the file specified.3. 中文语言包3.1. 下载中文包3.2 默认路径如下:3.3 备份并替换 app.asar 文件:4. Get "https://registry-1.docker.io/v2/&…

Android面试指南(八)

目录 1、Java语言相关 1.1、String的intern方法 1.2、HashMap的扩容 1.3、Java数组不支持泛型 1.4、泛型类型保留到运行时 1.5、匿名内部类使用的外部变量需要加final 2、Kotlin语言相关 3、设计模式 1、Java语言相关 1.1、String的intern方法 1)、String…

7、Matplotlib、Seaborn、Plotly数据可视化与探索性分析(探索性数据分析(EDA)方法论)

学习目标:掌握数据可视化的原理和工具,培养通过图表洞察数据规律的能力,建立数据驱动的分析思维数据可视化是数据科学的重要组成部分,它将抽象的数字转化为直观的图形,让我们能够快速识别模式、趋势和异常。从基础的柱…

Next系统学习(二)

SSR生命周期与实现详细解答 19. 如果不使用框架,如何从零用React/VueNode.js实现一个简单的SSR应用? React Node.js SSR实现步骤: 项目结构搭建 /project/client - 客户端代码/server - 服务端代码/shared - 共享代码服务端基础设置 // server/index…

零代码入侵:Kubernetes 部署时自动注入 kube-system UID 到 .NET 9 环境变量

在现代化 .net9 应用部署阶段,零代码入侵模式,自动获取 kubernetes 命名空间 kube-system 的 UID,并其作为变量配置到应用。 以下是几种实现方式: 方法一:使用 InitContainer Downward API 您可以通过 Kubernetes 的 …

基于Redis设计一个高可用的缓存

本文为您介绍,如何逐步设计一个基于Redis的高可用缓存。 目录 业务背景 步骤一:写一个最简单的缓存设计 存在的问题:大量冷数据占据Redis内存 解决思路:让缓存自主释放 步骤二:为缓存设置超时时间 存在的问题&a…

从原理到实践:LVS+Keepalived构建高可用负载均衡集群

从原理到实践:LVSKeepalived构建高可用负载均衡集群 文章目录从原理到实践:LVSKeepalived构建高可用负载均衡集群一、为什么需要LVSKeepalived?二、核心原理:Keepalived与VRRP协议1. VRRP的核心思想2. Keepalived的三大功能三、LV…

iOS混淆工具实战 在线教育直播类 App 的课程与互动安全防护

近年来,在线教育直播类 App 已成为学生与培训机构的重要工具。无论是 K12 教育、职业培训,还是兴趣学习,App 中承载的课程视频、题库与互动逻辑都是极高价值的内容资产。 然而,教育直播应用同样面临多重安全风险:课程视…