ā ļø Breaking Change
Impact Score: 7/10
Apache Airflow: Airflow 2.0.0, 2020-12-17
Source available ā automated, not human-reviewed
Component: airflow Ā· Channel: stable. Automated analysis, not a compatibility certification. How this works.
Analysis updated: 2026-11-01.
Breaking-change evidence from the source
Weāve tried to make as few breaking changes as possible and to provide deprecation path in the code, especially in the case of anything called in the DAG. That said, please read through UPDATING.md to check what might affect you. For example: We re-organized the layout of operators (they now all live under airflow.providers.*) but the old names should continue to work - youāll just notice a lot of DeprecationWarnings that need to be fixed up.
ā” Executive Summary (TL;DR)
Apache Airflow 2.0.0. Source highlight: A new way of writing dags: the TaskFlow API (AIP-31)
Who Does This Impact? (Role-Based Analysis)
š» Software Engineers & Devs
Check the source notes against the package and APIs you use before upgrading.
š Product & Engineering Leads
Use the documented changes to assess relevance to your product; release frequency alone is not a quality measure.
āļø DevOps & Security
Verify the target version, runtime requirements and rollback procedure in the official documentation.
ā ļø Breaking Changes & Deprecations (1)
- Weāve tried to make as few breaking changes as possible and to provide deprecation path in the code, especially in the case of anything called in the DAG. That said, please read through UPDATING.md to check what might affect you. For example: We re-organized the layout of operators (they now all live under airflow.providers.*) but the old names should continue to work - youāll just notice a lot of DeprecationWarnings that need to be fixed up.
š View Raw Release Notes (Original Developer Log)
The full changelog is about 3,000 lines long (already excluding everything backported to 1.10), so for now Iāll simply share some of the major features in 2.0.0 compared to 1.10.14:
### A new way of writing dags: the TaskFlow API (AIP-31)
(Known in 2.0.0alphas as Functional DAGs.)
DAGs are now much much nicer to author especially when using PythonOperator. Dependencies are handled more clearly and XCom is nicer to use
A quick teaser of what DAGs can now look like:
```python
from airflow.decorators import dag, task
from airflow.utils.dates import days_ago
@dag(default_args={'owner': 'airflow'}, schedule_interval=None, start_date=days_ago(2))
def tutorial_taskflow_api_etl():
@task
def extract():
return {"1001": 301.27, "1002": 433.21, "1003": 502.22}
@task
def transform(order_data_dict: dict) -> dict:
total_order_value = 0
for value in order_data_dict.values():
total_order_value += value
return {"total_order_value": total_order_value}
@task()
def load(total_order_value: float):
print("Total order value is: %.2f" % total_order_value)
order_data = extract()
order_summary = transform(order_data)
load(order_summary["total_order_value"])
tutorial_etl_dag = tutorial_taskflow_api_etl()
```
### Fully specified REST API (AIP-32)
We now have a fully supported, no-longer-experimental API with a comprehensive OpenAPI specification
Read more here:
REST API Documentation.
### Massive Scheduler performance improvements
As part of AIP-15 (Scheduler HA+performance) and other work Kamil did, we significantly improved the performance of the Airflow Scheduler. It now starts tasks much, MUCH quicker.
Over at Astronomer.io weāve benchmarked the schedulerāitās fast (we had to triple check the numbers as we donāt quite believe them at first!)
### Scheduler is now HA compatible (AIP-15)
Itās now possible and supported to run more than a single scheduler instance. This is super useful for both resiliency (in case a scheduler goes down) and scheduling performance.
To fully use this feature you need Postgres 9.6+ or MySQL 8+ (MySQL 5, and MariaDB wonāt work with more than one scheduler Iām afraid).
Thereās no config or other set up required to run more than one schedulerājust start up a scheduler somewhere else (ensuring it has access to the DAG files) and it will cooperate with your existing schedulers through the database.
For more information, read the Scheduler HA documentation.
### Task Groups (AIP-34)
SubDAGs were commonly used for grouping tasks in the UI, but they had many drawbacks in their execution behaviour (primarirly that they only executed a single task in parallel!) To improve this experience, weāve introduced āTask Groupsā: a method for organizing tasks which provides the same grouping behaviour as a subdag without any of the execution-time drawbacks.
SubDAGs will still work for now, but we think that any previous use of SubDAGs can now be replaced with task groups. If you find an example where this isnāt the case, please let us know by opening an issue on GitHub
For more information, check out the Task Group documentation.
### Refreshed UI
Weāve given the Airflow UI a visual refresh and updated some of the styling. Check out the UI section of the docs for screenshots.
We have also added an option to auto-refresh task states in Graph View so you no longer need to continuously press the refresh button :).
## Smart Sensors for reduced load from sensors (AIP-17)
If you make heavy use of sensors in your Airflow cluster, you might find that sensor execution takes up a significant proportion of your cluster even with ārescheduleā mode. To improve this, weāve added a new mode called āSmart Sensorsā.
This feature is in āearly-accessā: itās been well-tested by AirBnB and is āstableā/usable, but we reserve the right to make backwards-incompatible changes to it in a future release (if we have to. Weāll try very hard not to!)
### Simplified KubernetesExecutor
For Airflow 2.0, we have re-architected the KubernetesExecutor in a fashion that is simultaneously faster, easier to understand, and more flexible for Airflow users. Users will now be able to access the full Kubernetes API to create a .yaml pod_template_file instead of specifying parameters in their airflow.cfg.
We have also replaced the executor_config dictionary with the pod_override parameter, which takes a Kubernetes V1Pod object for a 1:1 setting override. These changes have removed over three thousand lines of code from the KubernetesExecutor, which makes it run faster and creates fewer potential errors.
### Airflow core and providers: Splitting Airflow into 60+ packages
Airflow 2.0 is not a monolithic āone to rule them allā package. Weāve split Airflow into core and 61 (for now) provider packages. Each provider package is for either a particular external service (Google, Amazon, Microsoft, Snowflake), a database (Postgres, MySQL), or a protocol (HTTP/FTP). Now you can create a custom Airflow installation from ābuildingā blocks and choose only what you need, plus add whatever other requirements you might have. Some of the common providers are installed automatically (ftp, http, imap, sqlite) as they are commonly used. Other providers are automatically installed when you choose appropriate extras when installing Airflow.
The provider architecture should make it much easier to get a fully customized, yet consistent runtime with the right set of Python dependencies.
But thatās not all: you can write your own custom providers and add things like custom connection types, customizations of the Connection Forms, and extra links to your operators in a manageable way. You can build your own provider and install it as a Python package and have your customizations visible right in the Airflow UI.
Security
As part of Airflow 2.0 effort, there has been a conscious focus on Security and reducing areas of exposure. This is represented across different functional areas in different forms. For example, in the new REST API, all operations now require authorization. Similarly, in the configuration settings, the Fernet key is now required to be specified.
### Configuration
Configuration in the form of the airflow.cfg file has been rationalized further in distinct sections, specifically around ācoreā. Additionally, a significant amount of configuration options have been deprecated or moved to individual component-specific configuration files, such as the pod-template-file for Kubernetes execution-related configuration.
Weāve tried to make as few breaking changes as possible and to provide deprecation path in the code, especially in the case of anything called in the DAG. That said, please read through UPDATING.md to check what might affect you. For example: We re-organized the layout of operators (they now all live under airflow.providers.*) but the old names should continue to work - youāll just notice a lot of DeprecationWarnings that need to be fixed up.