Apache Flink
The most widely used open-source engine for stateful stream processing: keyed state, event time and exactly-once recovery from checkpoints.
- What it is
- Stream processing
- Type
- Open source
- Made by
- Apache Software Foundation
- License
- Apache 2.0
- Facts checked
- 6 October 2026
What it is
A Flink job is a graph of operators (sources, maps, joins, windows, sinks) written in SQL, the Table API, the Java DataStream API or Python. A client hands the graph to the JobManager, which splits each operator into parallel subtasks and schedules them into the task slots of the TaskManager processes. Records are routed by key, so every event for one key reaches the same subtask, and that subtask keeps the key’s state: on the Java heap by default, in RocksDB on local disk for state bigger than memory, or, since Flink 2.0, experimentally in ForSt, which keeps state in object storage such as S3 with a local cache. Windows close by event time: a watermark says how far the event clock has got. To survive failures, the JobManager regularly injects checkpoint barriers at the sources; as they flow through the graph, each operator snapshots its state, and the source offsets are stored alongside it in durable storage. After a crash the job restarts from the last checkpoint and rereads the input from those offsets, and transactional sinks such as Kafka make the output exactly once. A savepoint is the same snapshot taken by hand, used to upgrade code or change parallelism.
Flink is an Apache project under Apache 2.0, and runs as a standalone cluster, on YARN or on Kubernetes, where the Flink Kubernetes Operator manages jobs as custom resources. Flink 2.0 (March 2025) was the first major release in nine years: it added disaggregated state and removed long-deprecated APIs such as DataSet and the Scala APIs; 2.3 followed in June 2026. Running it yourself is free but takes work, so three companies sell it as a service: AWS (Amazon Managed Service for Apache Flink, called Kinesis Data Analytics until 2023), Confluent (Confluent Cloud for Apache Flink, SQL over its Kafka topics) and Ververica, the company Flink’s creators founded, now with its own Flink-compatible engine.
Why teams pick it
- Large, exactly-once state: keyed state can outgrow memory (RocksDB, or ForSt on object storage), and checkpoints store it together with the source offsets
- Real event-time processing: watermarks, tumbling, sliding and session windows, timers and a CEP library for patterns across events
- Savepoints let you stop a job, change its code or parallelism, and resume from exactly where it was
- One engine for streams and bounded batch input, with SQL, Java and Python APIs on top
- The widest ecosystem in stream processing: Kafka, Kinesis, Iceberg, Paimon, database change capture through Flink CDC, and three managed services
Watch out for
- Running it is a job in itself: JobManager high availability, checkpoint storage, state backend and memory tuning, and upgrades through savepoints
- Flink 2.x broke compatibility: state from 1.x isn’t guaranteed to restore, and the DataSet API, Scala APIs and old
SourceFunction/SinkFunctionconnectors are gone - Connectors ship separately and lag the core: in October 2026 the Kafka connector supports Flink up to 2.2 and the AWS (Kinesis) connectors only 2.0, while Flink itself is at 2.3
- Disaggregated state (ForSt) is still experimental, and Amazon’s managed service doesn’t offer it, or materialized tables
- JVM first: Python user-defined functions run in separate Python processes by default, paying for serialization between the two
Alternatives
What all stream processing have in common →
ArroyoOpen sourceA stream processing engine in Rust: you write the pipeline as SQL, and it keeps windows and joins running with checkpointed state.
BytewaxOpen sourceA Python stream processing framework on a Rust engine built on Timely Dataflow; its company wound down in 2025 and the last release is from November 2024.
FelderaOpen sourceAn incremental view maintenance engine in Rust: you write SQL tables and views, and it keeps every view up to date by processing only the changes, based on the award-winning DBSP theory.
ksqlDBCommercialConfluent’s SQL server for Kafka: queries that run forever, turning topics into new topics and into tables you can look up.
PathwayCommercialA Python framework for streaming ETL and live RAG pipelines: you write table transformations in Python, and a Rust engine built on Differential Dataflow keeps the results up to date.
Quix StreamsOpen sourceA pure-Python library for stateful stream processing on Kafka: a pandas-like Streaming DataFrame, RocksDB state backed up to Kafka, and no cluster of its own.
Redpanda ConnectRenamedOpen sourceFormerly Benthos: one Go binary that runs a YAML pipeline of inputs, processors and outputs, with at-least-once delivery and no disk state of its own.
StreamlingCommercialGoldsky’s young Rust pipeline runtime: YAML pipelines of stateless SQL, TypeScript and plugin steps on Arrow, from Kafka or files into Postgres, ClickHouse or webhooks.Timely DataflowOpen sourceA Rust library for data-parallel dataflow with logical timestamps, loops and exact progress tracking; the engine underneath Materialize.How it fits with other technologies
What Apache Flink uses
- Apache Flinkreads and writes topics exactly once inApache Kafka
- Apache Flinkreads and writes streams via a connector inAmazon Kinesis Data Streams
- Apache Flinkstores checkpoints, savepoints and state inAmazon S3
- Apache Flinkstreams writes into tables inApache Iceberg
- Apache Flinkstreams upserts into lake tables inApache Paimon
- Apache Flinkcaptures row changes (Flink CDC) fromPostgreSQL
- Apache Flinkruns jobs through its operator onKubernetes
- Apache Flinkruns on YARN and checkpoints to HDFS inApache Hadoop
- Apache Flinkwas replaced at Goldsky byStreamling
What uses Apache Flink
- Apache Pekkoreplaced Akka (from Flink 1.18) insideApache Flink
- Apache Flussserves tables, changelogs and lookups toApache Flink
- Apache Pulsaris read and written with a connector byApache Flink
- StreamFusionspeeds up SQL jobs as a plugin forApache Flink
- RocksDBis a state backend forApache Flink
- Apache Cassandrais written to, via a sink connector, byApache Flink
- Apache HBaseis read and written, via a connector, byApache Flink
- QuestDBreceives streams, via a sink connector, fromApache Flink
- Apache Polarisserves Iceberg tables toApache Flink
- Project Nessieserves Iceberg tables toApache Flink
- Apache Calciteparses and optimizes streaming SQL forApache Flink
- Apache Hiveserves table metadata, via HMS, toApache Flink
- Apache Zeppelinruns streaming SQL and code onApache Flink
- Alibaba Cloud Hologresis a source, sink and lookup table forApache Flink
- Apache Doristakes streams and CDC, via a connector, fromApache Flink
- StarRocksreceives streams, via a connector, fromApache Flink
- Apache Amororuns optimizers as streaming jobs onApache Flink
Run a stateful job, stop it with a savepoint, and resume it with more parallelism · bash
./bin/start-cluster.sh # a JobManager and one TaskManager on localhost
# a long-running example job with keyed state and a built-in data generator
./bin/flink run --detached ./examples/streaming/StateMachineExample.jar
./bin/flink list # note the JobID
export JOB_ID=cca7bc1061d61cf15238e92312c2fc20
# stop gracefully: sources emit a final barrier, state is written to a savepoint
./bin/flink stop --savepointPath /tmp/flink-savepoints $JOB_ID
# Savepoint completed. Path: file:/tmp/flink-savepoints/savepoint-cca7bc-bb1e257f0dab
# add a second TaskManager (one slot each by default), then resume from that state
# with 2 subtasks per operator; the same JAR or a new version of it
./bin/taskmanager.sh start
./bin/flink run --detached --parallelism 2 \
--fromSavepoint /tmp/flink-savepoints/savepoint-cca7bc-bb1e257f0dab \
./examples/streaming/StateMachineExample.jarWays to run Flink in 2026#
The same open-source engine, run by you or by one of three vendors. List prices checked 2026-10-06.
| Self-managed Apache Flink | Amazon Managed Service for Apache Flink | Confluent Cloud for Apache Flink | Ververica | |
|---|---|---|---|---|
| Who runs it | You: a standalone cluster, YARN, or Kubernetes with the Flink Kubernetes Operator | AWS: serverless applications that scale in KPUs (1 vCPU and 4 GB each) | Confluent: serverless compute pools that scale between zero and a cap you set | Ververica’s control plane in your AWS, Azure or GCP account (BYOC), or self-managed on any Kubernetes |
| How you write jobs | SQL, Table API, DataStream API (Java), Python | Java or Python applications; Studio notebooks (Apache Zeppelin) for interactive SQL and Python | Flink SQL; Table API in Java (generally available) and Python (preview) | Apache Flink APIs, SQL and connectors, run on Ververica’s own VERA engine, which it says is fully compatible |
| Versions and gaps | Flink 2.3.0 (June 2026), with every experimental feature | Flink 2.3, 2.2, 1.20, 1.19, 1.18 and 1.15; no ForSt state backend, materialized tables or Java 21 | Managed by Confluent; every Kafka topic in the region appears as a table, and queries can’t cross regions | Ververica claims twice the throughput of open-source Flink; not independently verified here |
| Price | Free (Apache 2.0); you pay for machines, storage and people | $0.11 per KPU-hour in us-east-1, plus one extra KPU per application for orchestration, plus $0.10 per GB-month of running storage (50 GB per KPU) | $0.21 per CFU-hour (varies by region), billed by the minute, at least 1 CFU-minute per statement; Kafka networking charged as usual | Not published; through sales |
- On AWS, a small always-on application with one KPU is billed for two (one is for orchestration): about $160 a month, plus about $5 for its 50 GB of running storage.
- Confluent bills the CFUs statements actually use, not the pool’s maximum size; a Baseline CFU setting makes a statement pay for a floor even when idle.
What changed in Flink 2.x#
Flink 2.0 ended the 1.x compatibility promise that had held since 2016. The main changes, and what they mean for an upgrade:
Disaggregated state
2.0, experimentalThe ForSt state backend keeps state in a distributed file system such as S3 or HDFS, with local disk only as a cache, and operators read it asynchronously. State size is no longer capped by the TaskManager’s disk, and recovery doesn’t have to download the state first. Turned on with state.backend.type: forst; not every SQL operator supports it yet.
Removed APIs
2.0The DataSet API, the Scala DataStream and DataSet APIs, SourceFunction, SinkFunction, Sink V1 and the legacy TableSource/TableSink are gone. Connectors built on them had to be rewritten, and flink-conf.yaml was replaced by a standard config.yaml.
No state compatibility from 1.x
2.0Savepoints from 1.x aren’t guaranteed to restore in 2.x, so stateful jobs may need to rebuild their state. Java 17 became the default, Java 8 support was dropped, and the per-job deployment mode was removed in favour of application mode.
Materialized tables
2.0 to 2.3A table defined by a query that Flink keeps refreshed, choosing streaming or batch execution itself, with Apache Paimon as the supported catalog. Flink 2.3 added explicit column definitions and a START_MODE clause, so a changed query doesn’t always reprocess history.
Flink 2.3
June 2026SQL gained FROM_CHANGELOG and TO_CHANGELOG for converting between append-only streams and changelogs, and an ON CONFLICT clause that forces a choice when the upsert key differs from the sink’s primary key. A native S3 filesystem on AWS SDK v2 arrived as an experiment.
See it in a real stack
No architecture uses Apache Flink yet. Drop it into the playground and wire it up yourself.Open playground →Worth exploring
Where it came from2009–2026
In 2009 researchers at the Technical University of Berlin started Stratosphere, a research project to build the next generation of big data analytics platform. Its motto was “write like a programming language, execute like a database”: it mixed ideas from MapReduce and parallel databases, and managed its own memory as binary data instead of piling Java objects on the heap.
Stratosphere’s engine entered the Apache Incubator as Flink in April 2014 and graduated in December. The same year its core developers, among them Kostas Tzoumas and Stephan Ewen, founded data Artisans in Berlin to build a business around it, and in 2015 they turned Flink towards stream processing. Version 0.10 (November 2015) brought event time, out-of-order streams and exactly-once recovery; 1.0 (March 2016) added RocksDB state and savepoints. Alibaba, which ran its own fork called Blink, bought data Artisans for €90 million in January 2019 and contributed Blink back to the project; the company is now called Ververica.
Flink became the default open-source engine for stateful streaming, and cloud providers built services on it: AWS added Flink to Kinesis Data Analytics in 2018 and renamed the service after Flink in 2023. Flink 2.0, in March 2025, was the first major release in nine years.
Why it’s built this way
- Streams first, batch as a stream that ends
- If an engine can process unbounded streams continuously, bounded data sets are just streams that stop. Building on that idea let one runtime and, over time, one API serve both real-time and historical processing.
- Asynchronous barrier snapshots for fault tolerance
- Earlier approaches either paused the computation to take a global snapshot or saved every in-flight record. Barriers that flow with the data let each operator snapshot only its own state without stopping, which Flink’s developers described in a 2015 paper.
- Managing its own memory as binary data
- From its database roots, Flink serialized records into pre-allocated memory segments and ran sort and join algorithms directly on the bytes. That avoided out-of-memory crashes and heavy garbage collection on large JVM heaps, and let operators spill to disk predictably.
- Event time and watermarks
- Events often arrive late and out of order. Grouping by when things happened, with watermarks marking progress, gives the same results on live data and on a replay, which 0.10 made a core feature.
Timeline
- 2009
Stratosphere research project starts at TU Berlin
- 2014
Enters the Apache Incubator as Flink in April, top-level in December; data Artisans founded
- 2016
Flink 1.0 adds RocksDB state and savepoints, and promises API compatibility
- 2019
Alibaba buys data Artisans (now Ververica) and contributes its Blink fork
- 2023
Kinesis Data Analytics becomes Amazon Managed Service for Apache Flink
- 2025
Flink 2.0: disaggregated state; DataSet and Scala APIs removed
- 2026
Flink 2.3 adds changelog SQL operators and a native S3 filesystem
- Ververica blog: (Re)Introducing Ververica (Stratosphere at TU Berlin, formerly data Artisans)
- Apache Incubator: Flink project status (entered April 2014, graduated December 2014)
- Apache Flink blog: Juggling with bits and bytes (May 2015)
- Carbone et al.: Lightweight asynchronous snapshots for distributed dataflows (2015)
- Apache Flink blog: Announcing Apache Flink 0.10.0 (Nov 2015)
- Apache Flink blog: Announcing Apache Flink 1.0.0 (Mar 2016)
- TechCrunch: Alibaba acquires German big data startup Data Artisans for $103M (Jan 2019)
- Apache Flink blog: Batch as a special case of streaming and Alibaba’s contribution of Blink (Feb 2019)
- AWS News Blog: Amazon Managed Service for Apache Flink, renamed from Amazon Kinesis Data Analytics (Aug 2023)
- Apache Flink blog: Apache Flink 2.0.0, a new era of real-time data processing (Mar 2025)
- Apache Flink 2.3.0 release announcement (June 2026)
Sources29 · facts checked 6 October 2026
- Flink docs: Flink architecture (JobManager, TaskManagers, slots, YARN, Kubernetes, standalone)
- Flink docs: Fault tolerance via state snapshots (barriers, source offsets, savepoints)
- Flink docs: Timely stream processing (event time, watermarks)
- Flink docs: State backends (HashMap default, RocksDB, ForSt experimental)
- Flink docs: Disaggregated state management (experimental)
- Flink docs: Command-line interface (run, stop with savepoint, fromSavepoint)
- Flink docs: Apache Kafka connector (exactly-once)
- Flink docs: Amazon Kinesis Data Streams connector
- Flink docs: Amazon S3 filesystems (native, Presto, Hadoop)
- Flink docs: Configuration (taskmanager.numberOfTaskSlots defaults to 1)
- Flink docs: Standalone deployment (start-cluster.sh, taskmanager.sh)
- Flink docs: Apache Hadoop YARN
- PyFlink docs: Execution mode (Python UDFs in separate processes by default)
- Apache Flink downloads (release dates; connector compatibility by Flink version)
- Apache Flink Kubernetes Operator docs
- Flink CDC docs: Postgres CDC connector
- Apache Iceberg docs: Flink
- Apache Paimon docs: Flink quick start
- Apache Flink blog: Apache Flink 2.0.0 (disaggregated state, removed APIs, state compatibility)
- Apache Flink 2.3.0 release announcement (June 2026)
- Apache Flink LICENSE (Apache 2.0)
- Amazon Managed Service for Apache Flink pricing
- AWS docs: Use Python with Managed Service for Apache Flink
- AWS docs: Supported and deprecated Apache Flink versions
- AWS docs: Amazon Managed Service for Apache Flink 2.3 (unsupported features)
- Confluent docs: Confluent Cloud for Apache Flink overview
- Confluent docs: Billing on Confluent Cloud for Apache Flink
- Ververica: platform overview (BYOC, self-managed, VERA, compatibility claims)
- Goldsky blog: Open-sourcing Streamling (why Goldsky moved off Flink)