Flink组件一:state

本文深入探讨了Flink中的状态管理机制,包括keyedState和operatorState的区别与应用,介绍了托管状态与原始状态的实现方式及优缺点,适用于自定义operator的场景。

1.state

1.1.状态管理:

flink有两种状态:keyedState和operatorState

statekeyedStateoperatorState
支持的算子keyedState只能用在keyedStream的算子中每个key对应一个state可以用于所有算子常用于source,例如:FlinkKafkaConsumer
key和state一个operator实例处理多个key,访问相应的多个state并发改变,State随着key在实例中迁移一个operator实例对应一个state并发改变时,有多种重新分配方式可选:1.均匀分配 ;2.合并后每个得到全量
接口实现通过runcontext访问:RichFunction实现CheckPointed接口或ListCheckPointed接口
支持的数据结构valueState,ListState,ReducingState,AggregatingState,MapStateListState

KeyedState 和 OperatorState 都有两种形式存在:
1、原始状态 RawState
原始状态,是由用户自行管理状态具体的数据结构,框架在做 checkpoint 的时候,使用 byte[]来读写内容,对其内部数据结构一无所知
2、托管状态 ManagedState
托管状态是由 Flink 框架管理的状态
通常,在 DataStream 上的状态,推荐使用托管的状态,当实现一个用户自定义的 Operator的时候,会使用到原始状态

RawStateManagedState
状态管理方式用户自己管理 需要自己序列化FlinkRuntime管理 自动存储,自动恢复 内存管理上有优化
状态数据结构字节数组:byte[]已知的数据结构:value,map,list…
推荐使用场景自定义operator时可使用大多数情况下均可使用

在这里插入图片描述

### Flink 运行时遇到 `Java Heap Space` 错误的原因 当Flink应用程序抛出`java.lang.OutOfMemoryError: Java heap space`异常时,表明JVM无法分配足够的连续内存来满足程序的需求[^1]。此问题通常发生在处理大量数据或复杂计算逻辑的情况下。 ### 解决方案概述 #### 调整 JVM 参数配置 增加Flink作业的堆大小可以通过调整启动参数实现。具体来说,在启动命令中加入如下选项: ```bash -Xmx<size>g -Xms<size>g ``` 其中 `<size>` 表示期望设置的最大/最小堆空间尺寸(单位G)。例如,要将最大和初始堆大小都设为8GB,则应指定 `-Xmx8g -Xms8g`[^3]。 对于YARN集群上的部署,可以在提交应用时通过环境变量传递这些参数: ```bash yarn-session.sh \ --name "MySessionName" \ --jm-mem 2048 \ --tm-mem 8192 \ ... ``` 这里设置了JobManager 和 TaskManager 的内存分别为2GB 和8GB。 #### 数据流优化策略 除了简单地扩展可用RAM之外,还可以考虑改进算法效率以及减少中间结果集占用的空间量。这可能涉及到重新设计业务流程、采用更高效的序列化方式或是利用状态后端存储机制等措施[^2]。 另外,合理规划checkpoint间隔时间也能有效降低瞬态峰值负载对系统资源造成的压力。 #### 使用外部资源管理器特性 如果上述方法仍不足以解决问题,可以尝试启用Flink内置的些高级功能,比如: - **增量Checkpointing**: 减少每次保存整个工作进度所需的时间与开销; - **RocksDB State Backend**: 将部分热点数据持久化至磁盘而非完全依赖于内存缓存; - **Off-heap Memory Allocation**: 让某些特定组件的数据结构直接驻留在操作系统层面而不是受限于JVM内部约束之内; 以上三种技术都有助于缓解因频繁GC活动而引发的性能瓶颈现象。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值