Flink:内存使用
Flink: Memory Usage
我正在使用 ps -p TaskManagerPID -o rss
测量 Flink 中应用程序 (WordCount) 的内存使用情况。然而,结果没有任何意义。因为对于每种数据量(1MB、10MB、100MB、1GB、10GB),使用的内存量都是相同的。对于 10GB 数据,测量结果甚至小于 10GB。 TaskManager 是测量内存使用情况的错误进程吗? Flink Process Model 的哪个进程负责内存分配?
Flink有两种处理模式,流处理和批处理。
流处理:
在流处理中,Flink 使用可插拔状态后端来维护应用程序的状态。在 Flink 1.5.0 版本中,有两种类型的状态后端。 1) 将应用程序状态存储在工作程序 (TaskManager) JVM 进程的堆上的后端(FsStateBackend
和 MemoryStateBackend
)和 2) RocksDBStateBackend
将状态存储在磁盘上的 RocksDB 中。在这两种情况下,您都可以使用常规 JVM 内存监视工具来监视内存消耗。但是,对于 RocksDBStateBackend
,大部分状态将存储在磁盘上。
批处理
批处理运算符的内部处理算法(排序、哈希表)与托管内存一起工作,托管内存(通常)在工作进程 (TaskManager) 启动时预先分配并且永远不会返回。 Flink 将此托管内存分配给其算法,如果数据量超过其内存预算,算法将溢出到磁盘。由于所有内存都由Flink预先分配和内部管理,因此无法测量实际内存消耗。
我正在使用 ps -p TaskManagerPID -o rss
测量 Flink 中应用程序 (WordCount) 的内存使用情况。然而,结果没有任何意义。因为对于每种数据量(1MB、10MB、100MB、1GB、10GB),使用的内存量都是相同的。对于 10GB 数据,测量结果甚至小于 10GB。 TaskManager 是测量内存使用情况的错误进程吗? Flink Process Model 的哪个进程负责内存分配?
Flink有两种处理模式,流处理和批处理。
流处理:
在流处理中,Flink 使用可插拔状态后端来维护应用程序的状态。在 Flink 1.5.0 版本中,有两种类型的状态后端。 1) 将应用程序状态存储在工作程序 (TaskManager) JVM 进程的堆上的后端(FsStateBackend
和 MemoryStateBackend
)和 2) RocksDBStateBackend
将状态存储在磁盘上的 RocksDB 中。在这两种情况下,您都可以使用常规 JVM 内存监视工具来监视内存消耗。但是,对于 RocksDBStateBackend
,大部分状态将存储在磁盘上。
批处理
批处理运算符的内部处理算法(排序、哈希表)与托管内存一起工作,托管内存(通常)在工作进程 (TaskManager) 启动时预先分配并且永远不会返回。 Flink 将此托管内存分配给其算法,如果数据量超过其内存预算,算法将溢出到磁盘。由于所有内存都由Flink预先分配和内部管理,因此无法测量实际内存消耗。