mrkeyoor.com_
Tue 01 Sept 17:41 UTC
Dataevaluationupdated 28 Aug 2026

flink review

Apache Flink is a distributed engine for processing live streams and bounded data sets while keeping state, event time, and failures under control. Its main APIs are Java, with PyFlink providing Table and DataStream APIs for Python teams that need the same engine.

+9 / 4dstars / 7d
Verdict

Our PyFlink run installed 35 packages in 64 seconds and built in 8 seconds, but pytest hit 87 collection or setup errors before executing one test. Flink remains a serious choice for teams that specifically need stateful stream processing and can support a JVM cluster, yet this checkout did not give Python contributors a trustworthy clean-container test path. Adopt it for its event-time and state model, not because the Python package looks easy to install.

We ran it

Lab card: what happened when we ran flinkScreenshot of flink (flink.apache.org)
Install✓ · 64s35 packages · 37 MB
Build✓ · 8s
Tests✗ · 7s0 passed · 0 failed · 87 errors of 87 (pytest)
Known vulns0(pip-audit)
Repo24726 files~2,520,543 lines of source · 182.2 MB · 10 CI workflows

Answers from our run

Does flink build from source?

Dependencies installed in 64 seconds (35 packages), and the build succeeded in 8 seconds. We cloned commit 5265908 into a clean Debian container with 3 CPUs and no project-specific setup.

Do flink's tests pass?

Yes: 0 of 87 passed when we ran the project's own test command (pytest), with 87 collection errors. Some failures need services or credentials a bare container does not have.

Does flink have known vulnerabilities in its dependencies?

pip-audit found none in the dependency tree at the time of our run.

Who should not use flink?

Python developers expecting a small in-process data library: our PyFlink install pulled 35 packages, while the actual work runs on Flink's distributed engine.

What are the alternatives to flink?

Apache Spark, Apache Beam, Ray. Our PyFlink run installed 35 packages in 64 seconds and built in 8 seconds, but pytest hit 87 collection or setup errors before executing one test.

Setup2/5Install and build passed; 87 setup errors blocked every test
Docs4/5API and build paths are clear, but Python test setup failed for us
Community5/526,298 stars and active Apache development on August 28, 2026
Maturity5/5Long-running Apache engine with versioned releases and many connectors

Discussed on

  1. hnIntroducing Complex Event Processing (CEP) with Apache Flink150 points
  2. hnApache Flink115 points
  3. hnAnnouncing Apache Flink 1.0.0102 points
  4. hnDrivetribe’s Modern Take on CQRS with Apache Flink83 points
  5. hnDiscovering Anomalies in Real-Time with Apache Flink81 points

Who it’s for

Data platform teams building stateful pipelines that must handle late or out-of-order events.
Engineers who need one runtime for continuous streams and bounded batch jobs.
Java teams that want direct access to Flink's DataStream API, windows, state, and back-pressure.
Python teams prepared to operate a distributed JVM engine through PyFlink's Table or DataStream API.

Who it’s NOT for

Python developers expecting a small in-process data library: our PyFlink install pulled 35 packages, while the actual work runs on Flink's distributed engine.
Contributors who need a clean test result in a plain Python 3.12 Debian container: pytest stopped with 87 collection or setup errors before running a test.
Teams that want all connectors versioned inside one repository: the README says Kafka, JDBC, MongoDB, Elasticsearch, Pulsar, and other connectors live in separate Apache repositories.
Developers who require a native Windows source-build path: the root README lists a Unix-like environment among the build prerequisites.
Teams that rely on GitHub Issues alone for support: the repository disables GitHub Issues and directs bug reports to Apache Jira and questions to mailing lists.

Setup reality

Our sandbox run of flink-python installed successfully in 64 seconds, adding 35 packages and using 37 MB. The build succeeded in 8 seconds. Tests failed in 7 seconds with 87 collection or setup errors: pytest reported 0 passed and 0 failed because no test reached execution.

The measured Python package needs no hosted credential for local development. Running useful jobs still means choosing a Table or DataStream API, supplying data sources and sinks, and operating Flink locally or on a cluster. Many connectors are maintained in separate repositories.

Our image was an unprivileged Python 3.12 Debian container with 3 CPUs and 8 GB of RAM. The root source build has another toolchain: Unix-like system, Git, Maven 3.8.6 through the wrapper, and Java 11, 17, or 21. The test tail names table modules but does not show the cause of the 87 errors.

Flink handles event time and state in one distributed engine

Apache Flink processes unbounded streams and bounded data sets with the same streaming-first runtime. Its core ideas are more specific than generic distributed computation: event time, out-of-order records, stateful operators, windows, back-pressure, and exactly-once fault tolerance. Those features suit payment events, telemetry, operational joins, and other flows where records arrive late or a worker can fail after changing state. The Java API is the direct route. PyFlink adds Table and DataStream APIs for teams writing the job logic in Python.

The abstraction choice matters. Table API gives Python users relational operations that resemble SQL or tabular work, while DataStream exposes state and time for lower-level pipelines. Flink can run batch work by setting a bounded runtime mode, so a team does not need a separate engine solely because one input ends. That flexibility carries operating cost: even a Python job belongs to a distributed system with sources, sinks, checkpoints, deployment settings, and a JVM runtime behind it.

The 182.2 MB checkout is an engine source tree, not a Python library

Our measured checkout contained 24,726 files, about 2,520,543 lines of source, and occupied 182.2 MB before installation. The Python project lives in flink-python, one part of a much larger Java-led repository. That explains why a quick pip result answers only a small setup question. It does not prove that a cluster starts, a checkpoint recovers, or a connector works with your data system. Evaluate PyFlink as an entry point into Flink, not as an independent dataframe package.

The root README lists Git, a Unix-like environment, Maven 3.8.6 through the wrapper, and Java 11, 17, or 21 for a full source build. Its example Maven command skips tests. PyFlink has its own development path and test script, plus dependencies on Py4J, CloudPickle, Apache Beam, Python date handling, Arrow, and dataframe packages. Those layers are normal for a cross-language engine, but they make environment parity important when a contributor tries to reproduce CI locally.

What happened when we ran it

Our sandbox installed the flink-python project in 64 seconds, adding 35 packages and consuming 37 MB on disk. Its build then succeeded in 8 seconds. We used commit 5265908 in a fresh unprivileged Debian container with Python 3.12, 3 CPUs, and 8 GB of RAM. Those are encouraging packaging results: the selected Python subproject could resolve dependencies and produce its build artifact without credentials or privileged container access.

Pytest failed after 7 seconds during collection and setup. It reported 0 passed, 0 failed, and 87 errors out of 87, which means no test body ran. The log tail names Table API cases such as pipeline, schema, types, UDAF, UDF, UDTF, and window tests, then ends at pyflink/testing/test_case_utils.py. The supplied tail does not contain the exception that triggered them, so blaming Java, a system package, or Python 3.12 would be guesswork.

Pip-audit found 0 known vulnerabilities among the installed dependencies. That result covers the 35-package Python environment we measured, not Flink's Java dependency graph, external connectors, cluster images, or later commits. Our scan also found 10 CI workflow files and no Dockerfile. The missing passing test signal matters more than the successful 8-second build for anyone changing PyFlink: packaging works in this container, while behavior remains unverified because collection never completed.

External connectors make version choice a deployment decision

The main README lists Kafka, JDBC, Cassandra, Elasticsearch, MongoDB, OpenSearch, Pulsar, RabbitMQ, and cloud connectors in separate Apache repositories. This keeps the 24,726-file core from absorbing every integration's release cycle, but adopters must choose compatible artifacts and track more than one project. A useful pilot should exercise the exact source, sink, schema, checkpoint store, and failure mode intended for production. A word-count example proves API shape; it says little about upgrade or recovery behavior.

Flink itself does not require a hosted API key. Real pipelines still need credentials for databases, object stores, queues, or cluster control planes, and those secrets belong outside source. Deployment may be local for learning or attached to a cluster environment for sustained work. Teams should test restarts and late data before choosing it, because the reasons to accept Flink's complexity are its state and time semantics. If those semantics are irrelevant, Spark, Beam, or Ray may fit the staff and workload better.

August 28 activity is strong, while support lives outside GitHub Issues

GitHub recorded 26,298 stars, 368 open issues and pull requests, and a last push on August 28, 2026. The repository has GitHub Issues disabled, so that combined count should not be read as 368 reported bugs; current GitHub activity is dominated by pull requests, while the README sends bug reports to Apache Jira and support questions to mailing lists. The GitHub latest-release endpoint returned 404, although repository tags include release-2.3.0. Release discovery therefore differs from projects that publish every package through GitHub Releases.

Flink has the maturity signals expected from a large Apache data engine: ongoing pushes, versioned tags, dedicated documentation, and separately maintained connectors. Its Python contributor experience did not pass our clean-container check. The decision is still straightforward. Choose Flink when event time, long-lived state, and recovery semantics are central enough to justify operating it. If the main attraction is that the Python install took 64 seconds, stop there and compare a smaller tool before committing to the cluster.

Alternatives

ProjectWhat it isPick it when
Apache SparkA general distributed analytics engine with Structured Streaming, SQL, and a broad batch ecosystem.pick this instead when batch analytics, notebooks, and an existing Spark estate matter more than a streaming-first runtime.
Apache BeamA portable programming model for batch and streaming pipelines that can target several runners.pick this instead when runner portability is a requirement and you do not want pipeline code tied directly to Flink.
Ray gh↗A distributed Python runtime centered on AI, machine learning, and general task execution.pick this instead when Python-native distributed functions and AI workloads are the main job rather than event-time stream processing.

What people are saying

  1. [velocity-scout] apache/flink

Sources

  1. Apache Flink repository README
  2. PyFlink README
  3. Apache Flink repository facts
  4. Apache Flink tags
  5. Apache Flink Jira
  6. Apache Flink community support

More data reviews

turso · TrackersListCollection · dash · getcontact-cli · awesome-zhuiju-free · iggy · the whole board →