The modern data engineering stack is built predominantly on open source software. This is not an accident. Data engineering problems, moving large volumes of data reliably between systems, transforming it at scale, orchestrating complex dependencies, and making it queryable efficiently, are hard enough that no single commercial vendor has solved all of them better than the collective output of the open source community.
The result is a rich ecosystem where the best tool for each job is often free to use, backed by large communities, and deployable anywhere without vendor lock-in. The challenge is not finding open source data engineering tools. It is knowing which ones are worth learning, which problems each one solves, and how they fit together into a coherent stack.
This guide covers the best open source tools across every layer of the data engineering workflow. Orchestration, ingestion, transformation, storage and table formats, stream processing, query engines, and observability. For each tool it covers what it does, why it matters, what its limitations are, and who it is best suited for.
Orchestration
Orchestration is the layer that schedules, coordinates, and monitors the pipelines that move and transform data. It is the connective tissue of any data engineering stack and getting it right is foundational to everything else.
Apache Airflow
Apache Airflow is the most widely adopted open source workflow orchestrator in data engineering. Created at Airbnb and open sourced in 2015, it uses directed acyclic graphs (DAGs) defined in Python to represent workflows and their dependencies. Each node in the DAG is a task. Edges between nodes define execution order. Airflow schedules DAGs on a time-based or event-triggered basis, executes tasks across a distributed worker pool, and provides a web UI for monitoring runs, inspecting logs, and managing failures.
The reason Airflow became dominant is that Python-defined DAGs are expressive and flexible. Any workflow that can be expressed as a graph of dependent tasks can be represented in Airflow. The operator ecosystem covers connections to virtually every data system including databases, cloud storage, warehouses, APIs, and messaging systems. The community is enormous, which means answers to almost any operational question exist somewhere.
The limitations are real and worth being honest about. Airflow was designed for batch workflows triggered on schedules, not for event-driven or streaming pipelines. The scheduler has historically been a bottleneck at very large scale, though Airflow 2.0 improved this significantly. DAG code can become difficult to maintain when pipelines grow complex. And the operational overhead of running Airflow at production scale, managing the scheduler, workers, metadata database, and web server, is non-trivial.
Best for: teams that need a mature, flexible batch workflow orchestrator with a large ecosystem and strong community support. The default choice for most data engineering teams unless there is a specific reason to look elsewhere.
Prefect
Prefect is a newer orchestration tool that takes a different philosophy from Airflow. Where Airflow requires you to define workflows as DAGs in a specific structure, Prefect lets you decorate ordinary Python functions to make them tasks and flows. The resulting code looks more like regular Python and less like framework boilerplate.
Prefect’s hybrid execution model is architecturally interesting. The orchestration layer, which handles scheduling, state tracking, and the UI, runs separately from the execution layer, which runs wherever you deploy it. This means you can use Prefect Cloud or self-hosted Prefect server for orchestration while running actual pipeline code in your own infrastructure, on Kubernetes, on ECS, or locally.
Prefect handles dynamic workflows more naturally than Airflow. Tasks that generate other tasks at runtime, parallel execution over variable-length collections, and conditional branching based on data values are patterns that Prefect handles elegantly where Airflow can feel awkward.
Best for: teams that want more Pythonic workflow definitions, better support for dynamic workflows, or a cleaner separation between orchestration infrastructure and execution infrastructure.
Dagster
Dagster approaches orchestration from an asset-centric perspective rather than a task-centric one. Instead of defining pipelines as graphs of tasks, you define software-defined assets, the data artifacts your pipelines produce, and Dagster infers the execution graph from the dependencies between assets. This is a genuinely different mental model and one that aligns naturally with how data engineers actually think about their work.
Dagster has strong opinions about software engineering practices in data pipelines. Type checking, testing, configuration management, and resource injection are first-class concepts. The result is pipelines that are easier to test, easier to reason about, and easier to maintain as they grow complex.
The asset catalog in Dagster’s UI provides a view of every data asset your pipelines produce, its current state, its lineage, and its history. For teams that care about data observability and asset-level visibility, this is a significant advantage over Airflow’s task-centric view.
Best for: teams that prioritize software engineering rigor in their pipelines, want asset-level observability out of the box, or are starting fresh without existing Airflow investment.
Data Ingestion
Ingestion tools handle the movement of data from source systems into the data warehouse or data lake. This layer deals with API connections, change data capture, schema mapping, and the operational work of keeping data flowing reliably from dozens or hundreds of sources.
Airbyte
Airbyte is an open source ELT platform that connects source systems to destination warehouses through a library of pre-built connectors. It was designed specifically to address the connector problem: building and maintaining reliable connectors to every source system a business uses is significant engineering work that most teams would rather not do from scratch.
Airbyte’s connector catalog covers hundreds of sources including databases, SaaS applications, APIs, and file systems. The connectors handle authentication, pagination, rate limiting, incremental sync logic, and schema mapping. Deploying Airbyte gives a data team access to all of these connectors without building them individually.
The architecture is straightforward. Connectors run as Docker containers, which makes them isolated and portable. Airbyte manages the orchestration of sync runs, tracks sync state for incremental loads, and provides a UI for configuring connections and monitoring their health.
The open source version requires self-hosting, which introduces operational overhead. Airbyte Cloud is the managed version. For teams with the infrastructure capacity to run it, the self-hosted version provides full control and avoids per-row pricing models.
Best for: teams that need a broad library of pre-built connectors and want to avoid building and maintaining custom ingestion pipelines for every source system.
Apache Kafka (with Kafka Connect)
Apache Kafka is the dominant open source platform for event streaming and real-time data movement. Kafka itself is a distributed event log that stores streams of records reliably and makes them available to multiple consumers. Kafka Connect is the integration framework built on top of Kafka that provides source connectors for pulling data from external systems into Kafka and sink connectors for pushing data from Kafka into destinations.
For data engineering purposes, Kafka Connect is what makes Kafka relevant as an ingestion tool. Source connectors for databases using change data capture (CDC), for APIs, for file systems, and for SaaS tools publish data to Kafka topics. Sink connectors consume those topics and write to data warehouses, object storage, or other systems.
The Debezium connector deserves specific mention. Debezium is an open source CDC platform built on Kafka Connect that captures row-level changes from databases, PostgreSQL, MySQL, MongoDB, Oracle, and others, and publishes them as Kafka events. For teams that need to replicate database changes in real time, Debezium plus Kafka is the standard open source approach.
Kafka is operationally complex. Running a production Kafka cluster requires significant infrastructure expertise. Managed Kafka services from Confluent, AWS MSK, and others reduce this burden but at cost.
Best for: teams that need real-time data movement, event streaming, or change data capture from operational databases. Essential for architectures where data needs to move in seconds rather than minutes or hours.
Singer
Singer is a simpler open source standard for writing data extraction scripts. It defines a specification for how data taps (sources) and targets (destinations) communicate using JSON over standard input and output. Any Singer-compliant tap can be paired with any Singer-compliant target, creating a composable ingestion framework.
Singer’s strength is its simplicity and the ease of writing custom taps. When you need to ingest from a source that does not have a pre-built connector in Airbyte or another tool, writing a Singer tap is often the fastest path. The specification is lightweight and the implementation complexity is low.
The weakness is that Singer taps are standalone scripts rather than managed services. Scheduling, monitoring, and failure handling need to be provided by an external orchestrator. For simple use cases it is elegant. For production ingestion at scale it requires more surrounding infrastructure than Airbyte provides out of the box.
Best for: teams that need to build custom ingestion from sources not covered by larger platforms, or teams that want a lightweight scriptable approach to data extraction.
Transformation
Transformation tools handle the SQL and Python logic that converts raw ingested data into clean, modeled tables that analysts and downstream systems can use.
dbt (data build tool)
dbt is the most important open source tool to emerge in the analytics engineering space in the past decade. It brings software engineering practices, version control, testing, documentation, and modular project structure, to SQL-based data transformation work in the warehouse.
The core concept is simple. You write SQL SELECT statements in files. dbt wraps them in the appropriate CREATE TABLE or CREATE VIEW statements and executes them in your warehouse in dependency order. The ref() function declares dependencies between models and dbt builds a DAG that ensures models are built in the correct sequence.
What makes dbt transformative beyond this simple execution model is everything built around it. Schema tests catch data quality issues automatically. Documentation lives alongside the code and is automatically published as a searchable data catalog. The staging, intermediate, and mart layer convention gives projects a structure that scales cleanly. Integration with version control means transformation logic is reviewed, versioned, and auditable like application code.
dbt Core is fully open source and connects to all major warehouses including Snowflake, BigQuery, Redshift, Databricks, DuckDB, and PostgreSQL. dbt Cloud is the managed platform with a web IDE, job scheduling, and hosted documentation.
Best for: any team doing SQL-based transformation in a cloud data warehouse. It has become the default standard for analytics engineering and the skill is increasingly expected in data roles.
Apache Spark
Apache Spark is the dominant open source large-scale data processing engine. It provides APIs in Python (PySpark), Scala, Java, and R for processing data at scales that exceed what can fit in memory on a single machine. Spark distributes computation across a cluster and handles the parallelization, fault tolerance, and data shuffling automatically.
For data engineering, Spark is most relevant when data volumes exceed what warehouse-native SQL can handle efficiently, when transformation logic requires complex Python or Scala code that cannot be expressed in SQL, or when processing needs to happen outside of a SQL warehouse, against data in object storage, for example.
Spark’s DataFrame API lets you write transformation logic that looks similar to pandas but executes across a distributed cluster. Spark SQL lets you run SQL queries against distributed datasets. Spark Streaming extends the model to micro-batch stream processing.
The operational complexity of running Spark is significant. Managing clusters, tuning memory and executor configuration, and debugging distributed execution failures requires specialized knowledge. Managed Spark services like Databricks, AWS EMR, and Google Dataproc reduce but do not eliminate this complexity.
Best for: large-scale batch processing that exceeds warehouse SQL capabilities, teams with complex Python or Scala transformation logic, and organizations already using Databricks or a managed Spark platform.
Apache Flink
Apache Flink is the leading open source stream processing engine for true real-time transformation. Where Spark Streaming uses micro-batches (processing data in small time windows), Flink processes each event individually as it arrives, enabling genuinely low-latency stream processing.
Flink’s stateful stream processing capabilities are what distinguish it from simpler streaming tools. It maintains state across events, which enables complex operations like windowed aggregations over time, joining streams with each other or with static datasets, and detecting patterns that span multiple events over time.
For data engineering use cases that require real-time aggregation, streaming ETL, or event-driven processing with sub-second latency, Flink is the open source standard. It is more complex to operate than batch processing tools and requires a different mental model from SQL-based transformation, but for genuine streaming use cases it is the right tool.
Best for: real-time stream processing, streaming ETL pipelines, complex event processing, and use cases where batch processing latency is genuinely unacceptable.
Storage and Table Formats
The tools in this category define how data is physically stored and organized on object storage and what capabilities that storage layer supports.
Apache Iceberg
Apache Iceberg is an open table format for large analytical datasets stored on object storage. It adds a metadata layer above Parquet files that provides ACID transactions, time travel to query historical snapshots, schema evolution without data rewrites, and partition evolution without rewriting existing data.
Iceberg is engine-agnostic by design. Spark, Trino, Flink, DuckDB, Hive, and virtually every major query engine supports reading and writing Iceberg tables. For teams that use multiple engines on the same data, Iceberg provides a shared table format that all of them can work with reliably.
The transaction log in Iceberg tracks every change as a new snapshot. This enables time travel queries, rollback to previous states, and a complete audit trail of table modifications. Schema evolution works correctly because columns are tracked by ID rather than name, meaning renames and additions are metadata operations that do not require rewriting data files.
Best for: lakehouse architectures on object storage, teams using multiple query engines on shared data, and organizations that need database-like reliability guarantees without a traditional database.
Delta Lake
Delta Lake is the open table format created by Databricks and now governed by the Linux Foundation. Like Iceberg, it adds ACID transactions, time travel, and schema enforcement to Parquet files on object storage through a transaction log architecture.
Delta Lake has the deepest integration with Apache Spark and the Databricks ecosystem. For teams already using Databricks or Spark as their primary processing engine, Delta Lake is often the path of least resistance. The performance optimizations available through Databricks, Z-ordering, liquid clustering, and predictive I/O, are designed around Delta Lake specifically.
The open source Delta Kernel project is improving Delta Lake’s support for non-Spark engines, but Iceberg currently has broader multi-engine support in the open source ecosystem.
Best for: teams using Databricks or Spark as their primary compute engine who want transactional guarantees and time travel on their data lake storage.
Apache Parquet
Apache Parquet is the columnar file format that both Iceberg and Delta Lake build on top of. It is worth understanding as a foundational layer independently of the table formats above.
Parquet stores data column by column rather than row by row. This makes it highly efficient for analytical queries that read a subset of columns across many rows. Column-level compression is very effective because values in the same column tend to be similar. Row group statistics enable query engines to skip row groups that cannot contain matching data.
Parquet is the standard file format for data lake storage and is supported by every major processing and query engine. Understanding how Parquet works, row groups, column chunks, page encodings, and statistics, helps data engineers make better decisions about file sizes, compression codecs, and partitioning strategies.
Best for: it is not a choice so much as the standard. Most data lake storage uses Parquet and understanding it is foundational knowledge for data engineers working with large-scale storage.
Query Engines
Query engines execute SQL against data in warehouses, data lakes, and object storage. The open source query engines in this category are particularly relevant for teams building on data lake storage.
Trino (formerly PrestoSQL)
Trino is a distributed SQL query engine designed for fast analytical queries across large datasets in object storage and multiple data sources. It federates queries across heterogeneous sources, letting you join data from S3, PostgreSQL, Kafka, and other systems in a single SQL query.
Trino’s architecture separates the query engine from storage. It does not store data itself. Instead it connects to data sources through connectors and executes queries in memory across a distributed cluster. For interactive analytical queries on data lake storage, Trino is one of the fastest open source options available.
The ability to federate across sources is one of Trino’s distinctive strengths. A single Trino query can join a table in S3 with a table in PostgreSQL and a topic in Kafka, which is powerful for organizations with data spread across many systems.
Best for: interactive analytical queries on object storage, federated queries across multiple data sources, and teams building open source query infrastructure on top of a data lake.
DuckDB
DuckDB is an embedded analytical database that runs in-process without a separate server. It can query Parquet, CSV, and JSON files directly from local disk or object storage, execute SQL with full analytical function support, and handle datasets that do not fit in memory through its streaming execution model.
For data engineers, DuckDB is increasingly valuable as a local development and testing tool. You can develop and test transformation logic against real data formats without spinning up a cluster or connecting to a remote warehouse. The read_parquet, read_csv, and read_json_auto functions make it trivial to query files in any of these formats.
DuckDB also runs well in serverless environments and lightweight compute contexts where a full Spark cluster would be overkill. For medium-scale data processing, typically up to a few hundred gigabytes, DuckDB on a single machine is often faster and simpler than distributed alternatives.
Best for: local development and testing, lightweight data processing that does not require distributed compute, rapid exploratory analysis of files in object storage.
Data Observability and Quality
Observability tools monitor data pipelines and data quality, detecting anomalies, tracking freshness, and alerting when something goes wrong before downstream consumers are affected.
Great Expectations
Great Expectations is the most mature open source data quality framework. It lets you define expectations about your data, that a column should be non-null, that values should fall within a range, that row counts should be above a threshold, and validates incoming data against those expectations automatically.
Expectations are organized into expectation suites that can be run against any dataset in any environment. When validation runs, Great Expectations produces detailed HTML reports showing which expectations passed and which failed, with sample failing rows for diagnosis.
The integration with orchestration tools like Airflow and Dagster means data quality checks can be embedded directly into pipeline runs, failing the pipeline before bad data propagates downstream when expectations are violated.
Best for: teams that need systematic data quality validation embedded in their pipelines, with detailed reporting on validation failures.
Elementary
Elementary is an open source data observability tool built on top of dbt. It runs as a dbt package, adding anomaly detection, data freshness monitoring, schema change detection, and test result tracking to existing dbt projects without requiring a separate infrastructure deployment.
For teams already using dbt, Elementary is the lowest-friction path to data observability. The setup is a dbt package installation rather than a new system to operate. The observability data lives in your existing warehouse and the reports are generated from dbt models.
Best for: dbt-centric teams that want data observability without adopting a separate observability platform.
OpenLineage and Marquez
OpenLineage is an open standard for lineage metadata that defines how pipelines emit information about the datasets they read and write. Marquez is the open source lineage metadata server that implements the OpenLineage standard and provides a UI for exploring lineage graphs.
Together, OpenLineage and Marquez let you track the full lineage of every dataset in your organization. Which pipelines produce it, which consume it, what schema it had at each point in time, and how it flows from raw source to final analytical output. When a data quality issue occurs, lineage lets you trace it upstream to the root cause and identify all downstream consumers that may be affected.
Best for: organizations that need end-to-end data lineage tracking, compliance with data governance requirements, or systematic impact analysis when upstream data changes.
Open Source Data Engineering Stack Cheat Sheet
| Layer | Top Open Source Tool | Runner Up | Best For |
|---|---|---|---|
| Orchestration | Apache Airflow | Dagster | Batch workflow scheduling |
| Modern orchestration | Dagster | Prefect | Asset-centric pipelines |
| Batch ingestion | Airbyte | Singer | Pre-built connector library |
| Streaming ingestion | Apache Kafka + Debezium | Apache Pulsar | Real-time CDC and event streaming |
| SQL transformation | dbt Core | SQLMesh | Warehouse-native modeling |
| Large-scale processing | Apache Spark | Apache Beam | Distributed batch processing |
| Stream processing | Apache Flink | Spark Streaming | Real-time event processing |
| Table format | Apache Iceberg | Delta Lake | Multi-engine lakehouse storage |
| Local query engine | DuckDB | Apache Arrow | File querying and development |
| Distributed SQL | Trino | Apache Drill | Interactive lakehouse queries |
| Data quality | Great Expectations | Soda Core | Pipeline-embedded validation |
| dbt observability | Elementary | re_data | dbt-native monitoring |
| Lineage | OpenLineage + Marquez | Amundsen | End-to-end data lineage |
How These Tools Fit Together
A complete open source data engineering stack typically combines tools from each layer into a coherent architecture. A common pattern looks like this.
Airbyte ingests data from source systems into a staging area in object storage or a raw schema in the warehouse. Kafka handles real-time event streams from operational systems and applications. dbt transforms raw ingested data into clean, tested, documented analytical models in the warehouse. Airflow or Dagster orchestrates the ingestion and transformation pipelines, managing dependencies and failures. Apache Iceberg provides the table format for data lake storage, enabling multiple engines to read the same data reliably. Trino or DuckDB serve interactive analytical queries against the data lake. Great Expectations validates data quality at key points in the pipeline. OpenLineage and Marquez track lineage across the entire stack.
No single team uses all of these simultaneously. The right subset depends on data volumes, team size, infrastructure preferences, and the specific problems that matter most. But understanding each layer and the leading open source options for it gives you the framework to assemble the stack that fits your situation.
Common Mistakes When Building an Open Source Data Stack
Adopting too many tools too quickly is the most common failure mode. Each open source tool introduces operational overhead, learning curve, and maintenance burden. Starting with the minimum set that solves your current problems and adding complexity only when a specific limitation demands it is almost always the right approach.
Underestimating operational complexity is a consistent mistake with self-hosted open source tools. Airflow, Kafka, Spark, and Trino all require meaningful infrastructure expertise to run reliably in production. Managed versions of these tools, Astronomer for Airflow, Confluent for Kafka, Databricks for Spark, exist precisely because the self-hosted operational burden is real. Factor operational cost into the total cost of self-hosting when comparing against managed alternatives.
Not investing in data quality tooling early enough creates compounding problems. Bad data that flows through a well-orchestrated pipeline and populates well-structured tables is still bad data. Great Expectations or Elementary added early, before trust in the data is established, is far less painful than adding them after analysts have already built dashboards on questionable numbers.
Treating orchestration as solved once Airflow is running misses the ongoing maintenance work. DAGs accumulate technical debt. Pipelines that were designed for one data volume start struggling at higher volumes. Monitoring that made sense for ten pipelines becomes inadequate for a hundred. Orchestration is an ongoing investment, not a one-time deployment.
FAQs
What is the best open source tool for data pipeline orchestration?
Apache Airflow is the most widely adopted open source orchestration tool and the default choice for most data engineering teams. It has a mature ecosystem, a large community, and broad operator support for connecting to any data system. Dagster is the strongest alternative for teams starting fresh who want asset-centric pipeline definitions and better built-in observability. Prefect is worth considering for teams that want more Pythonic workflow definitions and a cleaner separation between orchestration and execution infrastructure.
Is dbt free to use?
dbt Core is fully open source and free to use. It runs from the command line and connects to all major data warehouses. dbt Cloud is the managed platform built on top of dbt Core that adds a web IDE, managed job scheduling, hosted documentation, and team collaboration features. dbt Cloud has a free tier for individual developers and paid tiers for teams. Most teams start with dbt Core and consider dbt Cloud when they need the managed infrastructure and team features.
What is the difference between Apache Kafka and Airbyte for data ingestion?
Kafka is a real-time event streaming platform designed for continuous, low-latency data movement. It is the right tool when data needs to move in seconds and when you are working with event streams from applications or change data capture from databases. Airbyte is a batch ELT platform designed for periodic syncs from SaaS tools, APIs, and databases into data warehouses. It is the right tool when you need a library of pre-built connectors and are comfortable with sync latencies measured in minutes or hours rather than seconds.
What open source tools do data engineers use most in production?
The most consistently used open source tools in production data engineering stacks are Apache Airflow for orchestration, dbt for SQL transformation, Apache Kafka for event streaming, Apache Spark for large-scale processing, and Apache Iceberg or Delta Lake as table formats for lakehouse storage. Airbyte has grown rapidly as a standard for batch ingestion. DuckDB has become popular for local development and lightweight processing. Great Expectations is widely used for data quality validation.
How do I choose between Apache Iceberg and Delta Lake?
he primary consideration is your compute ecosystem. Teams using Databricks or Spark as their primary engine get the deepest integration and most mature tooling with Delta Lake. Teams using multiple engines, Spark plus Trino, Flink, or DuckDB for example, or teams prioritizing vendor neutrality, generally prefer Iceberg for its broader multi-engine support and Apache Software Foundation governance. The fundamental capabilities of both formats are similar enough that ecosystem fit matters more than format differences for most teams.