Introduction
Riffle is a high-performance shuffle server written in Rust and designed as a compatible implementation of the Apache Uniffle shuffle service.
It keeps the familiar remote shuffle architecture: Spark executors use the Uniffle client, a coordinator assigns shuffle servers, and Riffle stores and serves shuffle blocks. The replacement boundary is the shuffle server itself.
Architecture
Spark applications
│ Apache Uniffle client
▼
Uniffle coordinator
│ assignments + heartbeats
▼
Riffle shuffle servers
│
├── memory
├── local files / io_uring
└── HDFS
Why Riffle
- Protocol compatibility. Riffle is built to participate in an Apache Uniffle deployment.
- Tiered storage. Memory, local file, and HDFS backends can be combined for different workload shapes.
- Operational control. Metrics, profiling endpoints, disk throttling, and
riffle-ctlare part of the normal workflow. - Rust implementation. The server targets efficient resource use and predictable behavior under sustained shuffle pressure.
The project reports production deployment at 16 PB of shuffle data per day and 600 GB/s aggregate throughput for hyperscale Spark workloads. See the benchmark context before comparing those numbers with another environment.
Components
| Component | Role |
|---|---|
riffle-server |
Handles shuffle writes, reads, storage, and server-side metrics. |
riffle-coordinator |
Coordinates server assignment and cluster metadata. |
riffle-ctl |
Queries and administers a running cluster. |
| Apache Uniffle client | Connects Spark applications to the remote shuffle service. |
Documentation and release history
This guide describes the current master branch. The changelog lists every stable and pre-release tag, the exact source commit, and the changes introduced since the preceding tag.
Next step
For the fastest local evaluation, start the complete integration environment with Docker Compose. To create optimized binaries, continue to Build from source.