Ursa for Apache Kafka: opt-in diskless topics on object storage, with Iceberg materialization
538
A Kafka distribution with opt-in diskless topics on object storage — and a one-pass path from topic to Iceberg table.
Built on Apache Kafka · Apache-2.0 · openlakestream/kafka
docker pull lakestream/kafka:latest
Each image is built from an Apache Kafka release, and latest always points to the most recent build. See the Tags tab if you need to pin a specific Kafka version.
UFK is Apache Kafka plus a storage option. Diskless topics keep their records on object storage through Ursa; every other topic stays Kafka. Nothing changes until you turn it on — ursa.storage.enable defaults to false, so a stock configuration behaves exactly like the Apache Kafka release it is built from.
bin/ tools work unmodified.| Classic topic | Diskless topic | |
|---|---|---|
| Optimized for | Latency | Cost |
| Durability | Local log segments + ISR (RF >= 2) | Object storage through Ursa, RF = 1 |
| Cross-AZ traffic | Producer to leader, then followers | None with zone-aware routing |
| Broker state | Stateful: partition data on broker | Stateless for record data |
| Failover | New leader must catch up | Any live broker serves it immediately |
| Elasticity | Adding brokers moves partition data | Scale on CPU and network alone |
Both modes share one controller quorum, one metadata log, one set of ACLs, one consumer-group coordinator, and the same client protocol.
The brokers and controllers, the Kafka CLI, and the Ursa compactor — one image for every role in the stack.
Three brokers, Oxia, MinIO and the compactor, using the Compose files from the source repository:
git clone https://github.com/openlakestream/kafka.git && cd kafka
cd docker/examples/docker-compose-files/cluster/ursa
export IMAGE=lakestream/kafka:latest
make up # Oxia + MinIO + 3 brokers + compactor
make create-topic # create a diskless topic
make demo # producer/consumer perf demo
make destroy # tear everything down
Adding the Iceberg catalog is one more command:
make lakehouse-demo # Kafka -> Parquet -> Iceberg -> DuckDB, asserted end to end
Broker and controller configuration:
ursa.storage.enable=true
# Metadata and producer state
ursa.catalog.oxia.service.url=oxia://oxia:6648/default
ursa.oxia.service.url=oxia://oxia:6648/default
# Record storage
ursa.storage.backend.type=S3
ursa.storage.path=ursa/wal
ursa.storage.s3.bucket=my-kafka-bucket
ursa.storage.s3.region=us-east-1
# Compacted objects
ursa.storage.compaction.bucket=my-kafka-bucket
ursa.storage.compaction.prefix=ursa/compacted
Then create a diskless topic:
bin/kafka-topics.sh --create \
--topic events --partitions 12 --replication-factor 1 \
--config ursa.storage.enable=true \
--bootstrap-server localhost:9092
You need an object storage bucket, an Oxia service, and a running compaction service. Compaction is required: retention on a diskless topic only soft-trims the log, and compaction is what advances the watermark that lets storage actually be reclaimed. An Iceberg catalog is optional on top of that.
Diskless topics reject transactional producers, do not implement key-based log compaction, require replication-factor 1, and their mode is fixed at creation. Internal topics such as __consumer_offsets always stay classic.
Apache License 2.0, the same as Apache Kafka.
Content type
Image
Digest
sha256:09bbf8507…
Size
903.1 MB
Last updated
about 1 hour ago
docker pull lakestream/kafka