Flink-内存管理

本文深入探讨了Flink如何管理内存,包括其独特的内存管理方式,如何将对象序列化为预分配的内存段以减少序列化和反序列化开销,以及如何在内存不足时将数据溢出到磁盘。此外,还介绍了Flink如何分配内存,以及其自定义的序列化框架如何提升性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,此篇文章原版是大神zhisheng写的,我只是学习zhisheng并且做一个记录自己总结一下,水平一般

  1. Flink是如何管理内存的
    大多数的对象都是存储到内存中,而flink有着自己独特的管理内存的方式

Flink 将对象序列化为固定数量的预先分配的内存段,⽽不是直接把对象放在堆内存
上。它的 DBMS ⻛格的排序和连接算法尽可能多地对这个⼆进制数据进⾏操作,以
此将序列化和反序列化开销降到最低。如果需要处理的数据多于可以保存在内存中
的数据,Flink 的运算符会将部分数据溢出到磁盘

flink自主管理内存有以下好处

  • 内存安全执⾏和⾼效的核外算法 由于分配的内存段的数量是固定的,因此监控
    剩余的内存资源是⾮常简单的。在内存不⾜的情况下,处理操作符可以有效地将更
    ⼤批的内存段写⼊磁盘,后⾯再将它们读回到内存。因此,OutOfMemoryError 就
    有效的防⽌了。
  • 减少垃圾收集压⼒ 因为所有⻓⽣命周期的数据都是在 Flink 的管理内存中以⼆进
    制表示的,所以所有数据对象都是短暂的,甚⾄是可变的,并且可以重⽤。短⽣命
    周期的对象可以更有效地进⾏垃圾收集,这⼤⼤降低了垃圾收集的压⼒。现在,预
    先分配的内存段是 JVM 堆上的⻓期存在的对象,为了降低垃圾收集的压⼒,Flink
    社区正在积极地将其分配到堆外内存。这种努⼒将使得 JVM 堆变得更⼩,垃圾收集
    所消耗的时间将更少。
  • 节省空间的数据存储 Java 对象具有存储开销,如果数据以⼆进制的形式存储,
    则可以避免这种开销。
  • ⾼效的⼆进制操作和缓存敏感性 在给定合适的⼆进制表示的情况下,可以有效
    地⽐较和操作⼆进制数据。此外,⼆进制表示可以将相关值、哈希码、键和指针等
    相邻地存储在内存中。这使得数据结构通常具有更⾼效的缓存访问模式。

在这里插入图片描述

  1. Flink 如何分配内存?

Flink TaskManager 是由⼏个内部组件组成的:actor 系统(负责与 Flink master 协
调)、IOManager(负责将数据溢出到磁盘并将其读取回来)、
MemoryManager(负责协调内存使⽤

MemoryManager 负责将 MemorySegments 分配、计算和分发给数据处理操作符,例如 sort 和 join 等操作符.MemorySegment 是 Flink 的内存分配单元,由常规 Java 字节数组⽀持(默认⼤⼩为 32 KB)。MemorySegment 通过使⽤ Java 的unsafe ⽅法对其⽀持的字节数组提供⾮常有效的读写访问。

在TaskManager启动时,MemoryManager会被分配一次,当TaskManager关闭时,MemoryManager也会被销毁.在 TaskManager 的整个⽣命周期中,MemorySegment 是重⽤的,⽽不会被垃圾收集的。在初始化 TaskManager 的所有内部数据结构并且已启动所有核⼼服务之后,MemoryManager 开始创建 MemorySegments。默认情况下,服务初始化后,70% 可⽤的 JVM 堆内存由 MemoryManager 分配(也可以配置全部)。剩余的 JVM 堆内存⽤于在任务处理期间实例化的对象,包括由⽤户定义的函数创建的对象.

  1. Flink如何序列化对象
    Flink 包含⾃⼰的⾃定义序列化框架,以便控制数据的⼆进制表示。这⼀点很重要,因为对⼆进制数据进⾏操作需要对序列化布局有准确的了解.此外,根据在⼆进制数据上执⾏的操作配置序列化布局可以显著提升性能。Flink 的序列化机
    制利⽤了这⼀特性,即在执⾏程序之前,要序列化和反序列化的对象的类型是完全已知的。

Flink 使⽤ TypeInformation 表示每种数据类型

在这里插入图片描述

### Flink CDC v2.2 安装教程及使用指南 Flink CDC 是一种用于实时数据集成的工具,支持多种数据库的数据变更捕获和同步功能。以下是关于 Flink CDC v2.2 版本的具体安装与使用的详细介绍。 #### 一、环境准备 在开始安装之前,请确保满足以下条件: - Java JDK 8 或更高版本已正确配置。 - Apache Maven 已安装并可用(推荐版本为 3.x)。 - 配置好 Hadoop 和其他依赖组件(如果适用),具体取决于目标存储系统的类型[^1]。 #### 二、下载与安装 可以通过官方仓库获取最新稳定版的 Flink CDC: ```bash wget https://github.com/ververica/flink-cdc-connectors/releases/download/v2.2/flink-cdc-v2.2.zip unzip flink-cdc-v2.2.zip -d /opt/flink-cdc/ cd /opt/flink-cdc/ ``` 上述命令会将压缩包解压至指定目录 `/opt/flink-cdc` 下。请根据实际需求调整路径设置。 #### 三、配置连接器 对于不同的源端数据库(如 MySQL, PostgreSQL 等),需单独引入对应的 JAR 文件作为驱动程序。例如,在基于 MySQL 的场景下,执行如下操作加载必要库文件: ```xml <dependency> <groupId>com.ververica</groupId> <artifactId>flink-connector-mysql-cdc</artifactId> <version>2.2</version> </dependency> ``` 此部分通常通过构建工具(Maven 或 Gradle)完成自动化管理过程。 #### 四、运行示例代码 下面展示了一个简单的 Python 脚本来演示如何利用 PyFlink 实现基本的功能测试: ```python from pyflink.datastream import StreamExecutionEnvironment from pyflink.table import StreamTableEnvironment env = StreamExecutionEnvironment.get_execution_environment() t_env = StreamTableEnvironment.create(env) source_ddl = """ CREATE TABLE mysql_source ( id INT, name STRING, age INT, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'localhost', 'port' = '3306', 'username' = 'root', 'password' = 'your_password', 'database-name' = 'test_db' ); """ sink_ddl = """ CREATE TABLE print_sink ( id INT, name STRING, age INT ) WITH ( 'connector' = 'print' ); """ t_env.execute_sql(source_ddl) t_env.execute_sql(sink_ddl) insert_stmt = "INSERT INTO print_sink SELECT * FROM mysql_source" t_env.executeSql(insert_stmt).print() env.execute("MySQL to Print Example") ``` 该脚本定义了两个表结构——一个是来自 MySQL 数据库的增量更新流 `mysql_source`;另一个则是终端打印接收器 `print_sink`。最后启动任务并将结果输出到控制台显示出来。 #### 五、性能优化建议 当面对大规模状态处理时,可能需要考虑一些额外的技术手段来提升效率。比如针对频繁访问的状态对象采取缓存策略减少磁盘 I/O 开销等问题[^2]: - 使用 RocksDB 嵌入式键值存储引擎替代默认内存实现方式; - 启用异步快照机制加快 Checkpoint 进度; - 对热点 Key 分布情况进行分析进而重新设计分区逻辑等措施均有助于改善整体表现效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值