KTable/KStream memory consumption over time
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
Apache Kafka Streams is a client library for building applications and microservices, where the input and output data are stored in Kafka topics. It provides two abstractions for processing streams: KStream and KTable. Understanding the memory usage of these abstractions is crucial for developing efficient stream-processing applications. This article explores how KTable and KStream manage memory over time, highlighting key considerations for optimal performance.
KStream Memory Consumption
A KStream represents a record stream, where each data record in the stream is an independent unit that doesn’t necessarily relate to previous records. It mirrors the record stream of a Kafka topic.
1. Stateless Operations:
Stateless operations (like map, filter, or foreach) on a KStream do not require significant additional memory because each record is processed independently, and there is no need to maintain state.
2. Stateful Operations:
However, stateful operations (like aggregate, count, or join) require memory to hold the state. For instance, aggregating over a time window stores data in state stores that might grow depending on the window size and retention policy.
Memory consumption by stateful operations in a KStream depends primarily on:
- Number and size of records: Larger or more items contribute to larger state sizes.
- State store retention and window configurations: More extended retention periods or larger window sizes increase state size as more data points need to be stored.
KTable Memory Consumption
A KTable represents an updatable table, where each data record represents the current state of a keyed data record. The memory consumption patterns of KTable differ significantly due to its nature of maintaining state.
1. Table State Management: Each record in a KTable updates the table's current state. If a key is new, it's added; if it exists, its value is updated. Consequently, the memory usage tends to grow with the number of unique keys.
2. Log Compaction: Kafka topics backing KTables benefit from Kafka’s log compaction feature, which helps in reclaiming space by ensuring only the latest value for each key is retained in the log. However, the in-memory state still needs to hold all keys and their latest values.
3. State Store Backing: KTables use RocksDB or an in-memory hash map as a state store. RocksDB, being an on-disk store, can handle larger states more efficiently than in-memory stores, although with potential increased latency for state store accesses.
Memory Management Techniques
Understanding and utilizing Kafka Streams’ memory management features is essential for optimizing both KStream and KTable operations:
- State Store Configurations: Configuring the size and type of the state store (in-memory vs. RocksDB) and tuning RocksDB settings can significantly impact memory usage.
- Cache Size Tuning: Kafka Streams provides a cache for state stores to optimize read and write operations. Adjusting the cache size can help balance between memory usage and computational efficiency.
- Cleaning Policies: Customizing change log topics' retention policy and segment sizes can help manage the data footprint on the Kafka brokers.
- Monitoring and Metrics: Utilizing Kafka's built-in metrics to monitor parameters like memory usage, cache hit ratio, and state store sizes can aid in timely adjustments.
Summary Table
| Feature | Impact on Memory | Considerations |
| Stateless Ops | Low | Mostly stream processing, minimal state retention. |
| Stateful Ops | High | Dependent on number of items and windowing specifics. |
| Log Compaction | Reduces disk usage | Only latest records for each key are retained. |
| State Stores | Significant in KTable | Choice between in-memory or RocksDB impacts performance and space. |
| Cache Management | Critical for performance | Proper sizing can improve efficiency and reduce unnecessary memory usage. |
Conclusion
The memory consumption in Kafka Streams via KTable and KStream is deeply intertwined with the nature of operations (stateful vs. stateless) and the configurations of state stores and caching. Proper understanding and management of these aspects ensure that Kafka Streams applications are both performant and resource-efficient.
In-depth profiling and monitoring, combined with a thoughtful approach to state management and stream processing architecture, are foundational practices that ensure efficient memory utilization in Kafka Streams applications.
Related reading
- Kubernetes pod resolve external kafka hostname in coredns not as hostaliases inside pod
- Lagom service consuming input from Kafka
- Launching multiple Kafka brokers fails - Configured brokerId doesn't match stored brokerId
- Leader brokers without a matching listener error in kafka
- leader election in zookeeper and Kafka
- LEADER_NOT_AVAILABLE error in wurstmeister kafka
- Learning Kafka 0.8.2
- Legal Hierarchical Quorums in Zookeeper

System Design Fundamentals
Build a strong foundation in designing scalable, reliable distributed systems.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.