Apache Beam is a unified programming model for batch and streaming pipelines, written once in Java, Python, or Go and executed by a runner — Flink, Spark, Dataflow, or others — rather than by an engine of its own.
Beam runs nothing itself: pipelines execute on a runner (Dataflow, Flink, Spark, and others, with Prism for local runs). Scaling, state backends, and delivery guarantees are the runner's, so Dataflow autoscales while Flink rescales from a savepoint. Free and Apache-2.0; the cost profile is whatever the chosen runner costs.
How Apache Beam answers the questions Stream Processing turns on.
| How it works | |
| Processing model | A portable model, not an engine, one pipeline covering batch and streaming, translated by a runner |
| APIs | Java, Python and Go SDKs, TypeScript under development; SQL and declarative YAML |
| Windowing | Fixed, sliding, session, global; calendar in Java only |
| Event time and lateness | Watermarks with triggers, configurable allowed lateness and accumulation modes; late data fires the window again rather than being dropped |
| State backend | State API per key; the backend is the runner's |
| Delivery guarantee | The runner's: exactly-once on Dataflow and Flink |
| Reading results | Through sinks only: there is no serving layer and no engine to query |
| Running it | |
| What you run | Nothing of its own: a runner: Dataflow, Flink, Spark, Nemo, Hazelcast Jet or Twister2, with Prism for local runs |
| Scaling | The runner's: Dataflow autoscales, Flink rescales from a savepoint; Beam itself has no notion of capacity |
| Connections | |
| Connectors | Over 60 built-in I/O connectors, Kafka, Pub/Sub, Kinesis, JDBC, BigQuery, Iceberg, Delta Lake, files; Java has all of them, the other SDKs reach them cross-language |
vs Apache Beam: Free · Subscription · Operational complexity: High · Java, Scala, Python
vs Apache Beam: Free · Subscription · Operational complexity: High · Batch · Streaming · Scala, Python, Java
vs Apache Beam: Self-hosted · Rust