【问题标题】:Memory management in flink streaming vs flink batchflink 流式处理与 flink 批处理中的内存管理
【发布时间】:2020-05-04 14:57:13
【问题描述】:
我浏览了很多博客和堆栈溢出的答案,但我不清楚 Flink 内存管理。在一些博客中,我发现了“内存管理器池”和“Rocksdb”。我正在使用rocksdb,我假设我所有的状态都存储在那个数据库中。
这是我的疑问..
- 如何在流中处理内存管理过程?
- 流和批处理中的内存管理有什么区别?
- “内存管理器池”和“后端状态 (Rcokdb”) 之间的区别
- 在流式传输中,“Flink Managed Memory”是什么意思?是否包括 RacksDb 缓存和缓冲区所需的内存?
【问题讨论】:
标签:
apache-flink
flink-streaming
【解决方案1】:
流式传输
当您使用 RocksDBStatebackend 时,所有 KeyedState(ValueState、MapState、... 和 Timers)都存储在 RocksDB 中。 OperatorState 保存在堆上。 OperatorState 通常很小,很少被 Flink 开发者直接使用。
对于 Flink 1.10+,托管内存包括 RocksDB 使用的所有内存。 Flink 确保 RocksDB 的内存使用量保持在分配的托管内存的限制范围内。使用taskmanager.memory.managed.fraction 调整您为 RocksDB 提供的内存量。通常,您可以将除 500MB 之外的所有内存都提供给 RockSDB。
批次
批处理程序不使用 Statebackend。托管内存用于堆外连接、排序等。像taskmanager.memory.managed.fraction 这样的内存配置对于批处理和流处理是相同的。