NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1196 most downloaded on PyPI
Provider package apache-airflow-providers-google for Apache Airflow
Last release 3 days ago
14 Sep 2026
Ships on a steady schedule
a new release about every 2 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
6 years old
225 releases · first in 2020
One column per quarter.
This release of provider is only available for Airflow 2.2+ as explained in the Apache Airflow providers support policy .
Release Date: 2022-06-13
Note
This release of provider is only available for Airflow 2.2+ as explained in the Apache Airflow providers support policy .
Add key_secret_project_id parameter which specifies a project with KeyFile (#23930)
Added impersonation_chain for DataflowStartFlexTemplateOperator and DataflowStartSqlJobOperator (#24046)
Add fields to CLOUD_SQL_EXPORT_VALIDATION. (#23724)
Update credentials when using ADC in Compute Engine (#23773)
set color to operators in cloud_sql.py (#24000)
Sql to gcs with exclude columns (#23695)
[Issue#22846] allow option to encode or not encode UUID when uploading from Cassandra to GCS (#23766)
Workflows assets & system tests migration (AIP-47) (#24105)
Spanner assets & system tests migration (AIP-47) (#23957)
Speech To Text assets & system tests migration (AIP-47) (#23643)
Cloud SQL assets & system tests migration (AIP-47) (#23583)
Cloud Storage assets & StorageLink update (#23865)
fix BigQueryInsertJobOperator (#24165)
Fix the link to google workplace (#24080)
Fix DataprocJobBaseOperator not being compatible with dotted names (#23439). (#23791)
Remove hack from BigQuery DTS hook (#23887)
Fix GCSToGCSOperator cannot copy a single file/folder without copying other files/folders with that prefix (#24039)
Workaround job race bug on biguery to gcs transfer (#24330)
Fix BigQuery system tests (#24013)
Ensure @contextmanager decorates generator func (#23103)
Migrate Dataproc to new system tests design (#22777)
AIP-47 - Migrate google leveldb DAGs to new design ##22447 (#24233)
Apply per-run log templates to log handlers (#24153)
Note
This release of provider is only available for Airflow 2.2+ as explained in the Apache Airflow providers support policy.
Add key_secret_project_id parameter which specifies a project with KeyFile (#23930)
Added impersonation_chain for DataflowStartFlexTemplateOperator and DataflowStartSqlJobOperator (#24046)
Add fields to CLOUD_SQL_EXPORT_VALIDATION. (#23724)
Update credentials when using ADC in Compute Engine (#23773)
set color to operators in cloud_sql.py (#24000)
Sql to gcs with exclude columns (#23695)
[Issue#22846] allow option to encode or not encode UUID when uploading from Cassandra to GCS (#23766)
Workflows assets & system tests migration (AIP-47) (#24105)
Spanner assets & system tests migration (AIP-47) (#23957)
Speech To Text assets & system tests migration (AIP-47) (#23643)
Cloud SQL assets & system tests migration (AIP-47) (#23583)
Cloud Storage assets & StorageLink update (#23865)
fix BigQueryInsertJobOperator (#24165)
Fix the link to google workplace (#24080)
Fix DataprocJobBaseOperator not being compatible with dotted names (#23439). (#23791)
Remove hack from BigQuery DTS hook (#23887)
Fix GCSToGCSOperator cannot copy a single file/folder without copying other files/folders with that prefix (#24039)
Workaround job race bug on biguery to gcs transfer (#24330)
Fix BigQuery system tests (#24013)
Ensure @contextmanager decorates generator func (#23103)
Migrate Dataproc to new system tests design (#22777)
AIP-47 - Migrate google leveldb DAGs to new design ##22447 (#24233)
Apply per-run log templates to log handlers (#24153)
Nothing published for this version
Nothing published for this version
- Remove deprecated parameters from PubSub operators:
Release Date: 2022-05-16
Remove deprecated parameters from PubSub operators: (#23261)
Upgrade to support Google Ads v10 (#22965)
'DataprocJobBaseOperator' changes (#23350)
'DataprocJobBaseOperator': order of parameters has changed.
'region' parameter has no default value affected functions/classes: 'DataprocHook.cancel_job' 'DataprocCreateClusterOperator' 'DataprocJobBaseOperator'
'DatastoreHook': Remove 'datastore_conn_id'. Please use 'gcp_conn_id' (#23323)
'CloudBuildCreateBuildOperator': Remove 'body'. Please use 'build' (#23263)
Replica cluster id removal (#23251)
'BigtableCreateInstanceOperator' Remove 'replica_cluster_id', 'replica_cluster_zone'. Please use 'replica_clusters'
'BigtableHook.create_instance': Remove 'replica_cluster_id', 'replica_cluster_zone'. Please use 'replica_clusters'
Remove params (#23230)
'GoogleDisplayVideo360CreateReportOperator': Remove 'params'. Please use 'parameters'
'FacebookAdsReportToGcsOperator': Remove 'params'. Please use 'parameters'
'GoogleDriveToGCSOperator': Remove 'destination_bucket' and 'destination_object'. Please use 'bucket_name' and 'object_name' (#23072)
'GCSObjectsWtihPrefixExistenceSensor' removed. Please use 'GCSObjectsWithPrefixExistenceSensor' (#23050)
Remove 'project': (#23231)
'PubSubCreateTopicOperator': Remove 'project'. Please use 'project_id'
'PubSubCreateSubscriptionOperator': Remove 'topic_project'. Please use 'project_id'
'PubSubCreateSubscriptionOperator': Remove 'subscription_project'. Please use 'subscription_project_id'
'PubSubDeleteTopicOperator': Remove 'project'. Please use 'project_id'
'PubSubDeleteSubscriptionOperator': Remove 'project'. Please use 'project_id'
'PubSubPublishMessageOperator': Remove 'project'. Please use 'project_id'
'PubSubPullSensor': Remove 'project'. Please use 'project_id'
'PubSubPullSensor': Remove 'return_immediately'
Remove 'location' - replaced with 'region' (#23250)
'DataprocJobSensor': Remove 'location'. Please use 'region'
'DataprocCreateWorkflowTemplateOperator': Remove 'location'. Please use 'region'
'DataprocCreateClusterOperator': Remove 'location'. Please use 'region'
'DataprocSubmitJobOperator': Remove 'location'. Please use 'region'
'DataprocHook': Remove 'location' parameter. Please use 'region'
Affected functions are:
'cancel_job'
'create_workflow_template'
'get_batch_client'
'get_cluster_client'
'get_job'
'get_job_client'
'get_template_client'
'instantiate_inline_workflow_template'
'instantiate_workflow_template'
'submit_job'
'update_cluster'
'wait_for_job'
'DataprocHook': Order of parameters in 'wait_for_job' function has changed
'DataprocSubmitJobOperator': order of parameters has changed.
Removal of xcom_push (#23252)
'CloudDatastoreImportEntitiesOperator': Remove 'xcom_push'. Please use 'BaseOperator.do_xcom_push'
'CloudDatastoreExportEntitiesOperator': Remove 'xcom_push'. Please use 'BaseOperator.do_xcom_push'
'bigquery_conn_id' and 'google_cloud_storage_conn_id' is removed. Please use 'gcp_conn_id' (#23326) .
Affected classes:
'BigQueryCheckOperator'
'BigQueryCreateEmptyDatasetOperator'
'BigQueryDeleteDatasetOperator'
'BigQueryDeleteTableOperator'
'BigQueryExecuteQueryOperator'
'BigQueryGetDataOperator'
'BigQueryHook'
'BigQueryIntervalCheckOperator'
'BigQueryTableExistenceSensor'
'BigQueryTablePartitionExistenceSensor'
'BigQueryToBigQueryOperator'
'BigQueryToGCSOperator'
'BigQueryUpdateTableSchemaOperator'
'BigQueryUpsertTableOperator'
'BigQueryValueCheckOperator'
'GCSToBigQueryOperator'
'ADLSToGCSOperator'
'BaseSQLToGCSOperator'
'CassandraToGCSOperator'
'GCSBucketCreateAclEntryOperator'
'GCSCreateBucketOperator'
'GCSDeleteObjectsOperator'
'GCSHook'
'GCSListObjectsOperator'
'GCSObjectCreateAclEntryOperator'
'GCSToBigQueryOperator'
'GCSToGCSOperator'
'GCSToLocalFilesystemOperator'
'LocalFilesystemToGCSOperator'
'S3ToGCSOperator': Remove 'dest_gcs_conn_id'. Please use 'gcp_conn_id' (#23348)
'BigQueryHook' changes (#23269)
'BigQueryHook.create_empty_table' Remove 'num_retries'. Please use 'retry'
'BigQueryHook.run_grant_dataset_view_access' Remove 'source_project'. Please use 'project_id'
'DataprocHook': Remove deprecated function 'submit' (#23389)
[FEATURE] google provider - BigQueryInsertJobOperator log query (#23648)
[FEATURE] google provider - split GkeStartPodOperator execute (#23518)
Add exportContext.offload flag to CLOUD_SQL_EXPORT_VALIDATION. (#23614)
Create links for BiqTable operators (#23164)
implements #22859 - Add .sql as templatable extension (#22920)
'GCSFileTransformOperator': New templated fields 'source_object', 'destination_object' (#23328)
Fix 'PostgresToGCSOperator' does not allow nested JSON (#23063)
Fix GCSToGCSOperator ignores replace parameter when there is no wildcard (#23340)
update processor to fix broken download URLs (#23299)
'LookerStartPdtBuildOperator', 'LookerCheckPdtBuildSensor' : fix empty materialization id handling (#23025)
Change ComputeSSH to throw provider import error instead paramiko (#23035)
Fix cancel_on_kill after execution timeout for DataprocSubmitJobOperator (#22955)
Fix select * query xcom push for BigQueryGetDataOperator (#22936)
MSSQLToGCSOperator fails: datetime is not JSON Serializable (#22882)
Add Stackdriver assets and migrate system tests to AIP-47 (#23320)
CloudTasks assets & system tests migration (AIP-47) (#23282)
TextToSpeech assets & system tests migration (AIP-47) (#23247)
Fix code-snippets in google provider (#23438)
Bigquery assets (#23165)
Remove redundant docstring in 'BigQueryUpdateTableSchemaOperator' (#23349)
Migrate gcs to new system tests design (#22778)
add missing docstring in 'BigQueryHook.create_empty_table' (#23270)
Cleanup Google provider CHANGELOG.rst (#23390)
migrate system test gcs_to_bigquery into new design (#22753)
Add example DAG for demonstrating usage of GCS sensors (#22808)
Clean up in-line f-string concatenation (#23591)
Bump pre-commit hook versions (#22887)
Use new Breese for building, pulling and verifying the images. (#23104)
Fix new MyPy errors in main (#22884)
Nothing published for this version
- Remove references to deprecated operators/params in PubSub operators
Release Date: 2022-04-11
Add autodetect arg in BQCreateExternalTable Operator (#22710)
Add links for BigQuery Data Transfer (#22280)
Modify transfer operators to handle more data (#22495)
Create Endpoint and Model Service, Batch Prediction and Hyperparameter Tuning Jobs operators for Vertex AI service (#22088)
PostgresToGoogleCloudStorageOperator - BigQuery schema type for time zone naive fields (#22536)
Update secrets backends to use get_conn_value instead of get_conn_uri (#22348)
Fix the docstrings (#22497)
Fix 'download_media' url in 'GoogleDisplayVideo360SDFtoGCSOperator' (#22479)
Fix to 'CloudBuildRunBuildTriggerOperator' fails to find build id. (#22419)
Fail ''LocalFilesystemToGCSOperator'' if src does not exist (#22772)
Remove coerce_datetime usage from GCSTimeSpanFileTransformOperator (#22501)
Refactor: BigQuery to GCS Operator (#22506)
Remove references to deprecated operators/params in PubSub operators (#22519)
New design of system tests (#22311)
Add autodetect arg in BQCreateExternalTable Operator (#22710)
Add links for BigQuery Data Transfer (#22280)
Modify transfer operators to handle more data (#22495)
Create Endpoint and Model Service, Batch Prediction and Hyperparameter Tuning Jobs operators for Vertex AI service (#22088)
PostgresToGoogleCloudStorageOperator - BigQuery schema type for time zone naive fields (#22536)
Update secrets backends to use get_conn_value instead of get_conn_uri (#22348)
Fix the docstrings (#22497)
Fix 'download_media' url in 'GoogleDisplayVideo360SDFtoGCSOperator' (#22479)
Fix to 'CloudBuildRunBuildTriggerOperator' fails to find build id. (#22419)
Fail ''LocalFilesystemToGCSOperator'' if src does not exist (#22772)
Remove coerce_datetime usage from GCSTimeSpanFileTransformOperator (#22501)
Refactor: BigQuery to GCS Operator (#22506)
Remove references to deprecated operators/params in PubSub operators (#22519)
New design of system tests (#22311)
Nothing published for this version
- Add dataflow_default_options to templated_fields
Release Date: 2022-03-26
Add dataflow_default_options to templated_fields (#22367)
Add 'LocalFilesystemToGoogleDriveOperator' (#22219)
Add timeout and retry to the BigQueryInsertJobOperator (#22395)
Fix skipping non-GCS located jars (#22302)
[FIX] typo doc of gcs operator (#22290)
Fix mistakenly added install_requires for all providers (#22382)
Nothing published for this version
- Support Uploading Bigger Files to Google Drive
Release Date: 2022-03-19
Support Uploading Bigger Files to Google Drive (#22179)
Change the default 'chunk_size' to a clear representation & add documentation (#22222)
Add guide for DataprocInstantiateInlineWorkflowTemplateOperator (#22062)
Allow for uploading metadata with GCS Hook Upload (#22058)
Add Dataplex operators (#20377)
Add support for ARM platform (#22127)
Add Trove classifiers in PyPI (Framework :: Apache Airflow :: Provider)
Use yaml safe load (#22091)
Support Uploading Bigger Files to Google Drive (#22179)
Change the default 'chunk_size' to a clear representation & add documentation (#22222)
Add guide for DataprocInstantiateInlineWorkflowTemplateOperator (#22062)
Allow for uploading metadata with GCS Hook Upload (#22058)
Add Dataplex operators (#20377)
Add support for ARM platform (#22127)
Add Trove classifiers in PyPI (Framework :: Apache Airflow :: Provider)
Use yaml safe load (#22091)
Nothing published for this version
- Add autodetect arg to external table creation in GCSToBigQueryOperator
Release Date: 2022-03-10
Add Looker PDT operators (#20882)
Add autodetect arg to external table creation in GCSToBigQueryOperator (#21944)
Add Dataproc assets/links (#21756)
Add Auto ML operators for Vertex AI service (#21470)
Add GoogleCalendarToGCSOperator (#20769)
Make project_id argument optional in all dataproc operators (#21866)
Allow templates in more DataprocUpdateClusterOperator fields (#21865)
Dataflow Assets (#21639)
Extract ClientInfo to module level (#21554)
Datafusion assets (#21518)
Dataproc metastore assets (#21267)
Normalize *_conn_id parameters in BigQuery sensors (#21430)
Fix bigquery_dts parameter docstring typo (#21786)
Fixed PostgresToGCSOperator fail on empty resultset for use_server_side_cursor=True (#21307)
Fix multi query scenario in bigquery example DAG (#21575)
Support for Python 3.10
Unpin 'google-cloud-memcache' (#21912)
Unpin ''pandas-gbq'' and remove unused code (#21915)
Suppress hook warnings from the Bigquery transfers (#20119)
Add Looker PDT operators (#20882)
Add autodetect arg to external table creation in GCSToBigQueryOperator (#21944)
Add Dataproc assets/links (#21756)
Add Auto ML operators for Vertex AI service (#21470)
Add GoogleCalendarToGCSOperator (#20769)
Make project_id argument optional in all dataproc operators (#21866)
Allow templates in more DataprocUpdateClusterOperator fields (#21865)
Dataflow Assets (#21639)
Extract ClientInfo to module level (#21554)
Datafusion assets (#21518)
Dataproc metastore assets (#21267)
Normalize *_conn_id parameters in BigQuery sensors (#21430)
Fix bigquery_dts parameter docstring typo (#21786)
Fixed PostgresToGCSOperator fail on empty resultset for use_server_side_cursor=True (#21307)
Fix multi query scenario in bigquery example DAG (#21575)
Support for Python 3.10
Unpin 'google-cloud-memcache' (#21912)
Unpin ''pandas-gbq'' and remove unused code (#21915)
Suppress hook warnings from the Bigquery transfers (#20119)
Nothing published for this version
- Add hook for integrating with Google Calendar
Release Date: 2022-02-18
Add hook for integrating with Google Calendar (#20542)
Add encoding parameter to 'GCSToLocalFilesystemOperator' to fix #20901 (#20919)
batch as templated field in DataprocCreateBatchOperator (#20905)
Make timeout Optional for wait_for_operation (#20981)
Add more SQL template fields renderers (#21237)
Create CustomJob and Datasets operators for Vertex AI service (#21253)
Support to upload file to Google Shared Drive (#21319)
(providers_google) add a location check in bigquery (#19571)
Add support for BeamGoPipelineOperator (#20386)
Google Cloud Composer opearators (#21251)
Enable asynchronous job submission in BigQuery hook (#21385)
Optionally raise an error if source file does not exist in GCSToGCSOperator (#21391)
Cloudsql import links fix. (#21199)
Fix BigQueryDataTransferServiceHook.get_transfer_run() request parameter (#21293)
:bug: (BigQueryHook) fix compatibility with sqlalchemy engine (#19508)
Refactor operator links to not create ad hoc TaskInstances (#21285)
Add hook for integrating with Google Calendar (#20542)
Add encoding parameter to 'GCSToLocalFilesystemOperator' to fix #20901 (#20919)
batch as templated field in DataprocCreateBatchOperator (#20905)
Make timeout Optional for wait_for_operation (#20981)
Add more SQL template fields renderers (#21237)
Create CustomJob and Datasets operators for Vertex AI service (#21253)
Support to upload file to Google Shared Drive (#21319)
(providers_google) add a location check in bigquery (#19571)
Add support for BeamGoPipelineOperator (#20386)
Google Cloud Composer opearators (#21251)
Enable asynchronous job submission in BigQuery hook (#21385)
Optionally raise an error if source file does not exist in GCSToGCSOperator (#21391)
Cloudsql import links fix. (#21199)
Fix BigQueryDataTransferServiceHook.get_transfer_run() request parameter (#21293)
:bug: (BigQueryHook) fix compatibility with sqlalchemy engine (#19508)
Refactor operator links to not create ad hoc TaskInstances (#21285)
Nothing published for this version
Nothing published for this version
Nothing published for this version
- avoid deprecation warnings in BigQuery transfer operators
Release Date: 2022-01-06
Add optional location to bigquery data transfer service (#15088) (#20221)
Add Google Cloud Tasks how-to documentation (#20145)
Added example DAG for MSSQL to Google Cloud Storage (GCS) (#19873)
Support regional GKE cluster (#18966)
Delete pods by default in KubernetesPodOperator (#20575)
Fixes docstring for PubSubCreateSubscriptionOperator (#20237)
Fix missing get_backup method for Dataproc Metastore (#20326)
BigQueryHook fix typo in run_load doc string (#19924)
Fix passing the gzip compression parameter on sftp_to_gcs. (#20553)
switch to follow_redirects on httpx.get call in CloudSQL provider (#20239)
avoid deprecation warnings in BigQuery transfer operators (#20502)
Change download_video parameter to resourceName (#20528)
Fix big query to mssql/mysql transfer issues (#20001)
Fix setting of project ID in ''provide_authorized_gcloud'' (#20428)
Move source_objects datatype check out of GCSToBigQueryOperator.init (#20347)
Organize S3 Classes in Amazon Provider (#20167)
Providers facebook hook multiple account (#19377)
Remove deprecated method call (blob.download_as_string) (#20091)
Remove deprecated template_fields from GoogleDriveToGCSOperator (#19991)
Note! optional features of the apache-airflow-providers-facebook and apache-airflow-providers-amazon require newer versions of the providers (as specified in the dependencies)
Add optional location to bigquery data transfer service (#15088) (#20221)
Add Google Cloud Tasks how-to documentation (#20145)
Added example DAG for MSSQL to Google Cloud Storage (GCS) (#19873)
Support regional GKE cluster (#18966)
Delete pods by default in KubernetesPodOperator (#20575)
Fixes docstring for PubSubCreateSubscriptionOperator (#20237)
Fix missing get_backup method for Dataproc Metastore (#20326)
BigQueryHook fix typo in run_load doc string (#19924)
Fix passing the gzip compression parameter on sftp_to_gcs. (#20553)
switch to follow_redirects on httpx.get call in CloudSQL provider (#20239)
avoid deprecation warnings in BigQuery transfer operators (#20502)
Change download_video parameter to resourceName (#20528)
Fix big query to mssql/mysql transfer issues (#20001)
Fix setting of project ID in ''provide_authorized_gcloud'' (#20428)
Move source_objects datatype check out of GCSToBigQueryOperator.__init__ (#20347)
Organize S3 Classes in Amazon Provider (#20167)
Providers facebook hook multiple account (#19377)
Remove deprecated method call (blob.download_as_string) (#20091)
Remove deprecated template_fields from GoogleDriveToGCSOperator (#19991)
Note! optional features of the apache-airflow-providers-facebook and apache-airflow-providers-amazon require newer versions of the providers (as specified in the dependencies)
Nothing published for this version
- Added wait mechanizm to the DataprocJobSensor to avoid 509 errors when Job is not available
Release Date: 2021-12-06
Added wait mechanizm to the DataprocJobSensor to avoid 509 errors when Job is not available (#19740)
Add support in GCP connection for reading key from Secret Manager (#19164)
Add dataproc metastore operators (#18945)
Add support of 'path' parameter for GCloud Storage Transfer Service operators (#17446)
Move 'bucket_name' validation out of 'init' in Google Marketing Platform operators (#19383)
Create dataproc serverless spark batches operator (#19248)
updates pipeline_timeout CloudDataFusionStartPipelineOperator (#18773)
Support impersonation_chain parameter in the GKEStartPodOperator (#19518)
Fix badly merged impersonation in GKEPodOperator (#19696)
Added wait mechanizm to the DataprocJobSensor to avoid 509 errors when Job is not available (#19740)
Add support in GCP connection for reading key from Secret Manager (#19164)
Add dataproc metastore operators (#18945)
Add support of 'path' parameter for GCloud Storage Transfer Service operators (#17446)
Move 'bucket_name' validation out of '__init__' in Google Marketing Platform operators (#19383)
Create dataproc serverless spark batches operator (#19248)
updates pipeline_timeout CloudDataFusionStartPipelineOperator (#18773)
Support impersonation_chain parameter in the GKEStartPodOperator (#19518)
Fix badly merged impersonation in GKEPodOperator (#19696)
Nothing published for this version
- Add value to 'namespaceId' of query
Release Date: 2021-11-04
Add value to 'namespaceId' of query (#19163)
Add pre-commit hook for common misspelling check in files (#18964)
Support query timeout as an argument in CassandraToGCSOperator (#18927)
Update BigQueryCreateExternalTableOperator doc and parameters (#18676)
Replacing non-attribute template_fields for BigQueryToMsSqlOperator (#19052)
Upgrade the Dataproc package to 3.0.0 and migrate from v1beta2 to v1 api (#18879)
Use google cloud credentials when executing beam command in subprocess (#18992)
Replace default api_version of FacebookAdsReportToGcsOperator (#18996)
Dataflow Operators - use project and location from job in on_kill method. (#18699)
Fix hard-coded /tmp directory in CloudSQL Hook (#19229)
Fix bug in Dataflow hook when no jobs are returned (#18981)
Fix BigQueryToMsSqlOperator documentation (#18995)
Move validation of templated input params to run after the context init (#19048)
Google provider catch invalid secret name (#18790)
Add value to 'namespaceId' of query (#19163)
Add pre-commit hook for common misspelling check in files (#18964)
Support query timeout as an argument in CassandraToGCSOperator (#18927)
Update BigQueryCreateExternalTableOperator doc and parameters (#18676)
Replacing non-attribute template_fields for BigQueryToMsSqlOperator (#19052)
Upgrade the Dataproc package to 3.0.0 and migrate from v1beta2 to v1 api (#18879)
Use google cloud credentials when executing beam command in subprocess (#18992)
Replace default api_version of FacebookAdsReportToGcsOperator (#18996)
Dataflow Operators - use project and location from job in on_kill method. (#18699)
Fix hard-coded /tmp directory in CloudSQL Hook (#19229)
Fix bug in Dataflow hook when no jobs are returned (#18981)
Fix BigQueryToMsSqlOperator documentation (#18995)
Move validation of templated input params to run after the context init (#19048)
Google provider catch invalid secret name (#18790)
Nothing published for this version
- Migrate Google Cloud Build from Discovery API to Python SDK
Release Date: 2021-10-05
Migrate Google Cloud Build from Discovery API to Python SDK (#18184)
Add index to the dataset name to have separate dataset for each example DAG (#18459)
Add missing init.py files for some test packages (#18142)
Add possibility to run DAGs from system tests and see DAGs logs (#17868)
Rename AzureDataLakeStorage to ADLS (#18493)
Make next_dagrun_info take a data interval (#18088)
Use parameters instead of params (#18143)
New google operator: SQLToGoogleSheetsOperator (#17887)
Fix part of Google system tests (#18494)
Fix kubernetes engine system test (#18548)
Fix BigQuery system test (#18373)
Fix error when create external table using table resource (#17998)
Fix ''BigQuery'' data extraction in ''BigQueryToMySqlOperator'' (#18073)
Fix providers tests in main branch with eager upgrades (#18040)
fix(CloudSqlProxyRunner): don't query connections from Airflow DB (#18006)
Remove check for at least one schema in GCSToBigquery (#18150)
deduplicate running jobs on BigQueryInsertJobOperator (#17496)
Migrate Google Cloud Build from Discovery API to Python SDK (#18184)
Add index to the dataset name to have separate dataset for each example DAG (#18459)
Add missing __init__.py files for some test packages (#18142)
Add possibility to run DAGs from system tests and see DAGs logs (#17868)
Rename AzureDataLakeStorage to ADLS (#18493)
Make next_dagrun_info take a data interval (#18088)
Use parameters instead of params (#18143)
New google operator: SQLToGoogleSheetsOperator (#17887)
Fix part of Google system tests (#18494)
Fix kubernetes engine system test (#18548)
Fix BigQuery system test (#18373)
Fix error when create external table using table resource (#17998)
Fix ''BigQuery'' data extraction in ''BigQueryToMySqlOperator'' (#18073)
Fix providers tests in main branch with eager upgrades (#18040)
fix(CloudSqlProxyRunner): don't query connections from Airflow DB (#18006)
Remove check for at least one schema in GCSToBigquery (#18150)
deduplicate running jobs on BigQueryInsertJobOperator (#17496)
Nothing published for this version
- Add error check for config_file parameter in GKEStartPodOperator
Release Date: 2021-09-03
Add error check for config_file parameter in GKEStartPodOperator (#17700)
Gcp ai hyperparameter tuning (#17790)
Allow omission of 'initial_node_count' if 'node_pools' is specified (#17820)
[Airflow 13779] use provided parameters in the wait_for_pipeline_state hook (#17137)
Enable specifying dictionary paths in 'template_fields_renderers' (#17321)
Don't cache Google Secret Manager client (#17539)
[AIRFLOW-9300] Add DatafusionPipelineStateSensor and aync option to the CloudDataFusionStartPipelineOperator (#17787)
GCP Secret Manager error handling for missing credentials (#17264)
Optimise connection importing for Airflow 2.2.0
Adds secrets backend/logging/auth information to provider yaml (#17625)
Add error check for config_file parameter in GKEStartPodOperator (#17700)
Gcp ai hyperparameter tuning (#17790)
Allow omission of 'initial_node_count' if 'node_pools' is specified (#17820)
[Airflow 13779] use provided parameters in the wait_for_pipeline_state hook (#17137)
Enable specifying dictionary paths in 'template_fields_renderers' (#17321)
Don't cache Google Secret Manager client (#17539)
[AIRFLOW-9300] Add DatafusionPipelineStateSensor and aync option to the CloudDataFusionStartPipelineOperator (#17787)
GCP Secret Manager error handling for missing credentials (#17264)
Optimise connection importing for Airflow 2.2.0
Adds secrets backend/logging/auth information to provider yaml (#17625)
Nothing published for this version
The underlying google-ads library had breaking changes.
Release Date: 2021-08-02
Updated GoogleAdsHook to support newer API versions after google deprecated v5. Google Ads v8 is the new default API. (#17111)
Google Ads Hook: Support newer versions of the google-ads library (#17160)
Warning
The underlying google-ads library had breaking changes.
Previously the google ads library returned data as native protobuf messages. Now it returns data as proto-plus objects that behave more like conventional Python objects.
To preserve compatibility the hook’s search() converts the data back to native protobuf before returning it. Your existing operators should work as before, but due to the urgency of the v5 API being deprecated it was not tested too thoroughly. Therefore you should carefully evaluate your operator and hook functionality with this new version.
In order to use the API’s new proto-plus format, you can use the search_proto_plus() method.
For more information, please consult google-ads migration document :
Standardise dataproc location param to region (#16034)
Adding custom Salesforce connection type + SalesforceToS3Operator updates (#17162)
Update alias for field_mask in Google Memmcache (#16975)
fix: dataprocpysparkjob project_id as self.project_id (#17075)
Fix GCStoGCS operator with replace diabled and existing destination object (#16991)
Updated GoogleAdsHook to support newer API versions after google deprecated v5. Google Ads v8 is the new default API. (#17111)
Google Ads Hook: Support newer versions of the google-ads library (#17160)
Warning
The underlying google-ads library had breaking changes.
Previously the google ads library returned data as native protobuf messages. Now it returns data as proto-plus objects that behave more like conventional Python objects.
To preserve compatibility the hook's search() converts the data back to native protobuf before returning it. Your existing operators should work as before, but due to the urgency of the v5 API being deprecated it was not tested too thoroughly. Therefore you should carefully evaluate your operator and hook functionality with this new version.
In order to use the API's new proto-plus format, you can use the search_proto_plus() method.
For more information, please consult google-ads migration document:
Standardise dataproc location param to region (#16034)
Adding custom Salesforce connection type + SalesforceToS3Operator updates (#17162)
Update alias for field_mask in Google Memmcache (#16975)
fix: dataprocpysparkjob project_id as self.project_id (#17075)
Fix GCStoGCS operator with replace diabled and existing destination object (#16991)
Nothing published for this version
Nothing published for this version
- Fix deprecation warnings location in google provider
Release Date: 2021-06-23
Auto-apply apply_default decorator (#15667)
Warning
Due to apply_default decorator removal, this version of the provider requires Airflow 2.1.0+. If your Airflow version is < 2.1.0, and you want to install this provider version, first upgrade Airflow to at least version 2.1.0. Otherwise your Airflow package version will be upgraded automatically and you will have to manually run airflow upgrade db to complete the migration.
Move plyvel to google provider extra (#15812)
Fixes AzureFileShare connection extras (#16388)
Add extra links for google dataproc (#10343)
add oracle connection link (#15632)
pass wait_for_done parameter down to _DataflowJobsController (#15541)
Use api version only in GoogleAdsHook not operators (#15266)
Implement BigQuery Table Schema Update Operator (#15367)
Add BigQueryToMsSqlOperator (#15422)
Fix: GCS To BigQuery source_object (#16160)
Fix: Unnecessary downloads in GCSToLocalFilesystemOperator (#16171)
Fix bigquery type error when export format is parquet (#16027)
Fix argument ordering and type of bucket and object (#15738)
Fix sql_to_gcs docstring lint error (#15730)
fix: ensure datetime-related values fully compatible with MySQL and BigQuery (#15026)
Fix deprecation warnings location in google provider (#16403)
Auto-apply apply_default decorator (#15667)
Warning
Due to apply_default decorator removal, this version of the provider requires Airflow 2.1.0+. If your Airflow version is < 2.1.0, and you want to install this provider version, first upgrade Airflow to at least version 2.1.0. Otherwise your Airflow package version will be upgraded automatically and you will have to manually run airflow upgrade db to complete the migration.
Move plyvel to google provider extra (#15812)
Fixes AzureFileShare connection extras (#16388)
Add extra links for google dataproc (#10343)
add oracle connection link (#15632)
pass wait_for_done parameter down to _DataflowJobsController (#15541)
Use api version only in GoogleAdsHook not operators (#15266)
Implement BigQuery Table Schema Update Operator (#15367)
Add BigQueryToMsSqlOperator (#15422)
Fix: GCS To BigQuery source_object (#16160)
Fix: Unnecessary downloads in ``GCSToLocalFilesystemOperator (#16171)``
Fix bigquery type error when export format is parquet (#16027)
Fix argument ordering and type of bucket and object (#15738)
Fix sql_to_gcs docstring lint error (#15730)
fix: ensure datetime-related values fully compatible with MySQL and BigQuery (#15026)
Fix deprecation warnings location in google provider (#16403)
Nothing published for this version
Nothing published for this version
📣 We are proud to announce the General Availability of Apache Airflow® 3.0, the most significant release in the project’s history.
📣 We are proud to announce the General Availability of Apache Airflow® 3.0, the most significant release in the project’s history.
Airflow 3.0 builds on the foundation of Airflow 2 and introduces a new service-oriented architecture, a modern React-based UI, enhanced security, and a host of long-requested features such as DAG versioning, improved backfills, event-driven scheduling, and support for remote execution.
You can read more about what 3.0 brings in https://airflow.apache.org/blog/airflow-three-point-oh-is-here/.
📦 PyPI: https://pypi.org/project/apache-airflow/3.0.0/ 📚 Docs: https://airflow.apache.org/docs/apache-airflow/3.0.0 🛠️ Release Notes: https://airflow.apache.org/docs/apache-airflow/3.0.0/release_notes.html 🪶 Sources: https://airflow.apache.org/docs/apache-airflow/3.0.0/installation/installing-from-sources.html
This is the result of 300+ developers within the Airflow community working together tirelessly for many months! A huge thank you to all of them for their contributions.
Resources
We are proud to announce the General Availability of Apache Airflow 3.0 — the most significant release in the project's history. This version introduces a service-oriented architecture, a stable DAG authoring interface, expanded support for event-driven and ML workflows, and a fully modernized UI built on React. Airflow 3.0 reflects years of community investment and lays the foundation for the next era of scalable, modular orchestration.
Service-Oriented Architecture: A new Task Execution API and airflow api-server enable task execution in remote environments with improved isolation and flexibility (AIP-72).
Edge Executor: A new executor that supports distributed, event-driven, and edge-compute workflows (AIP-69), now generally available.
Stable Authoring Interface: DAG authors should now use the new airflow.sdk namespace to import core DAG constructs like @dag, @task, and DAG.
Scheduler-Managed Backfills: Backfills are now scheduled and tracked like regular DAG runs, with native UI and API support (AIP-78).
DAG Versioning: Airflow now tracks structural changes to DAGs over time, enabling inspection of historical DAG definitions via the UI and API (AIP-66).
Asset-Based Scheduling: The dataset model has been renamed and redesigned as assets, with a new @asset decorator and cleaner event-driven DAG definition (AIP-74, AIP-75).
Support for ML and AI Workflows: DAGs can now run with logical_date=None, enabling use cases such as model inference, hyperparameter tuning, and non-interval workflows (AIP-83).
Removal of Legacy Features: SLAs, SubDAGs, DAG and Xcom pickling, and several internal context variables have been removed. Use the upgrade tools to detect deprecated usage.
Split CLI and API Changes: The CLI has been split into airflow and airflowctl (AIP-81), and REST API now defaults to logical_date=None when triggering a new DAG run.
Modern React UI: A complete UI overhaul built on React and FastAPI includes version-aware views, backfill management, and improved DAG and task introspection (AIP-38, AIP-84).
Migration Tooling: Use ruff and airflow config update to validate DAGs and configurations. Upgrade requires Airflow 2.7 or later and Python 3.9–3.12.
Airflow 3.0 introduces the most significant set of changes since the 2.0 release, including architectural shifts, new execution models, and improvements to DAG authoring and scheduling.
Airflow now supports a service-oriented architecture, enabling tasks to be executed remotely via a new Task Execution API. This API decouples task execution from the scheduler and introduces a stable contract for running tasks outside of Airflow's traditional runtime environment.
To support this, Airflow introduces the Task SDK — a lightweight runtime environment for running Airflow tasks in external systems such as containers, edge environments, or other runtimes. This lays the groundwork for language-agnostic task execution and brings improved isolation, portability, and extensibility to Airflow-based workflows.
Airflow 3.0 also introduces a new airflow.sdk namespace that exposes the core authoring interfaces for defining DAGs and tasks. DAG authors should now import objects like DAG, @dag, and @task from airflow.sdk rather than internal modules. This new namespace provides a stable, forward-compatible interface for DAG authoring across future versions of Airflow.
Airflow 3.0 introduces the Edge Executor as a generally available feature, enabling execution of tasks in distributed or remote compute environments. Designed for event-driven and edge-compute use cases, the Edge Executor integrates with the Task Execution API to support task orchestration beyond the traditional Airflow runtime. This advancement facilitates hybrid and cross-environment orchestration patterns, allowing task workers to operate closer to data or application layers.
Backfills are now fully managed by the scheduler, rather than being launched as separate command-line jobs. This change unifies backfill logic with regular DAG execution and ensures that backfill runs follow the same scheduling, versioning, and observability models as other DAG runs.
Airflow 3.0 also introduces native UI and REST API support for initiating and monitoring backfills, making them more accessible and easier to integrate into automated workflows. These improvements lay the foundation for smarter, safer historical reprocessing — now available directly through the Airflow UI and API.
Airflow 3.0 introduces native DAG versioning. DAG structure changes (e.g., renamed tasks, dependency shifts) are now tracked directly in the metadata database. This allows users to inspect historical DAG structures through the UI and API, and lays the foundation for safer backfills, improved observability, and runtime-determined DAG logic.
Note: DAG bundles are not initialized in the triggerer. In practice, this means that triggers cannot come from a DAG bundle. This is because the triggerer does not deal with changes in trigger code over time, as everything happens in the main process. Triggers can come from anywhere else on sys.path instead.
Airflow 3.0 ships with a completely redesigned user interface built on React and FastAPI. This modern architecture improves responsiveness, enables more consistent navigation across views, and unlocks new UI capabilities — including support for DAG versioning, asset-centric DAG definitions, and more intuitive filtering and search.
The new UI replaces the legacy Flask-based frontend and introduces a foundation for future extensibility and community contributions.
The concept of Datasets has been renamed to Assets, unifying terminology with common practices in the modern data ecosystem. The internal model has also been reworked to better support future features like asset partitions and validations.
The @asset decorator and related changes to the DAG parser enable clearer, asset-centric DAG definitions, allowing Airflow to more naturally support event-driven and data-aware scheduling patterns.
This renaming impacts modules, classes, functions, configuration keys, and internal models. Key changes include:
Dataset → Asset
DatasetEvent → AssetEvent
DatasetAlias → AssetAlias
airflow.datasets.* → airflow.sdk.*
airflow.timetables.simple.DatasetTriggeredTimetable → airflow.timetables.simple.AssetTriggeredTimetable
airflow.timetables.datasets.DatasetOrTimeSchedule → airflow.timetables.assets.AssetOrTimeSchedule
airflow.listeners.spec.dataset.on_dataset_created → airflow.listeners.spec.asset.on_asset_created
airflow.listeners.spec.dataset.on_dataset_changed → airflow.listeners.spec.asset.on_asset_changed
core.dataset_manager_class → core.asset_manager_class
core.dataset_manager_kwargs → core.asset_manager_kwargs
Airflow 3.0 removes the legacy schedule_interval and timetable parameters. DAGs must now use the unified schedule field for all time- and event-based scheduling logic. This simplifies DAG definition and improves consistency across scheduling paradigms.
Airflow 3.0 changes the default behavior for new DAGs by setting catchup_by_default = False in the configuration file. This means DAGs that do not explicitly set catchup=... will no longer backfill missed intervals by default. This change reduces confusion for new users and better reflects the growing use of on-demand and event-driven workflows.
The default DAG schedule has been changed to None from @once.
Task code can no longer directly access the metadata database. Interactions with DAG state, task history, or DAG runs must be performed via the Airflow REST API or exposed context. This change improves architectural separation and enables remote execution.
Airflow no longer supports triggering DAG runs with a logical date in the future. This change aligns with the logical execution model and removes ambiguity in backfills and event-driven DAGs. Use logical_date=None to trigger runs with the current timestamp.
For DAG runs triggered by an Asset event or through the REST API without specifying a logical_date, Airflow now sets logical_date=None by default. These DAG runs do not have a data interval, and attempting to access data_interval_start, data_interval_end, or logical_date from the task context will raise a KeyError.
DAG authors should use dag_run.logical_date and perform appropriate checks or fallbacks if supporting multiple trigger types. This change improves consistency with event-driven semantics but may require updates to existing DAGs that assume these values are always present.
Airflow 3.0 refines task callback behavior to improve clarity and consistency. In particular, on_success_callback is no longer executed when a task is marked as SKIPPED, aligning it more closely with expected semantics.
Several default configuration values have been updated in Airflow 3.0 to better reflect modern usage patterns and simplify onboarding:
catchup_by_default is now set to False by default. DAGs will not automatically backfill unless explicitly configured to do so.
create_cron_data_intervals is now set to False by default. As a result, cron expressions will be interpreted using the CronTriggerTimetable instead of the legacy CronDataIntervalTimetable. This only affects DAGs that pass a bare cron string to schedule=; DAGs that pass an explicit timetable instance are unaffected. If you rely on the data interval semantics (data_interval_start / data_interval_end, or templated values like ds / ts derived from logical_date), set create_cron_data_intervals=True explicitly before the upgrade. Flipping the value later, after Airflow 3 DAG runs already exist, will skip one scheduled run on each affected DAG to avoid colliding with the previous run's logical_date.
SimpleAuthManager is now the default auth_manager. To continue using Flask AppBuilder-based authentication, install the apache-airflow-providers-fab provider and explicitly set auth_manager = airflow.providers.fab.auth_manager.FabAuthManager.
These changes represent the most significant evolution of the Airflow platform since the release of 2.0 — setting the stage for more scalable, event-driven, and language-agnostic orchestration in the years ahead.
Airflow 3.0 introduces several important improvements and behavior changes in how DAGs and tasks are scheduled, prioritized, and executed.
Airflow 3.0 now requires the standalone DAG processor to parse DAGs. This dedicated process improves scheduler performance, isolation, and observability. It also simplifies architecture by clearly separating DAG parsing from scheduling logic. This change may affect custom deployments that previously used embedded DAG parsing.
The priority_weight value on a task is now capped by the number of available pool slots. This ensures that resource availability remains the primary constraint in task execution order, preventing high-priority tasks from starving others when resource contention exists.
Teardown tasks will now be executed even when a DAG run is terminated early. This ensures that cleanup logic is respected, improving reliability for workflows that use teardown tasks to manage ephemeral infrastructure, temporary files, or downstream notifications.
Scheduler components now use run_with_db_retries to handle transient database issues more gracefully. This enhances Airflow's fault tolerance in high-volume environments and reduces the likelihood of scheduler restarts due to temporary database connection problems.
Airflow 3.0 fixes a bug that caused incorrect task statistics to be reported for dynamic task mapping. Stats now accurately reflect the number of mapped task instances and their statuses, improving observability and debugging for dynamic workflows.
SequentialExecutor was primarily used for local testing but is now redundant, as LocalExecutor supports SQLite with WAL mode and provides better performance with parallel execution. Users should switch to LocalExecutor or CeleryExecutor as alternatives.
Airflow 3.0 includes several changes that improve consistency, clarity, and long-term stability for DAG authors.
Airflow 3.0 introduces a new, stable public API for DAG authoring under the airflow.sdk namespace, available via the apache-airflow-task-sdk package.
The goal of this change is to decouple DAG authoring from Airflow internals (Scheduler, API Server, etc.), providing a forward-compatible, stable interface for writing and maintaining DAGs across Airflow versions.
DAG authors should now import core constructs from airflow.sdk rather than internal modules.
Key Imports from airflow.sdk:
Classes:
Asset
BaseNotifier
BaseOperator
BaseOperatorLink
BaseSensorOperator
Connection
Context
DAG
EdgeModifier
Label
ObjectStoragePath
Param
TaskGroup
Variable
Decorators and Functions:
@asset
@dag
@setup
@task
@task_group
@teardown
chain
chain_linear
cross_downstream
get_current_context
get_parsing_context
For an exhaustive list of available classes, decorators, and functions, check airflow.sdk.__all__.
All DAGs should update imports to use airflow.sdk instead of referencing internal Airflow modules directly. Legacy import paths (e.g., airflow.models.dag.DAG, airflow.decorator.task) are deprecated and will be removed in a future Airflow version. Some additional utilities and helper functions that DAGs sometimes use from airflow.utils.* and others will be progressively migrated to the Task SDK in future minor releases.
These future changes aim to complete the decoupling of DAG authoring constructs from internal Airflow services. DAG authors should expect continued improvements to airflow.sdk with no backwards-incompatible changes to existing constructs.
For example, update:
# Old (Airflow 2.x)
from airflow.models import DAG
from airflow.decorators import task
# New (Airflow 3.x)
from airflow.sdk import DAG, task
The DAG argument fail_stop has been renamed to fail_fast for improved clarity. This parameter controls whether a DAG run should immediately stop execution when a task fails. DAG authors should update any code referencing fail_stop to use the new name.
Several legacy context variables have been removed or may no longer be available in certain types of DAG runs, including:
conf
execution_date
dag_run.external_trigger
In asset-triggered and manually triggered DAG runs with logical_date=None, data interval fields such as data_interval_start and data_interval_end may not be present in the task context. DAG authors should use explicit references such as dag_run.logical_date and conditionally check for the presence of interval-related fields where applicable.
Internal task context functions such as get_parsing_context have been moved to a more appropriate location (e.g., airflow.models.taskcontext). DAG authors using these utilities directly should update import paths accordingly.
The TriggerRule.ALWAYS rule can no longer be used with teardown tasks or tasks that are expected to honor upstream dependency semantics. DAG authors should ensure that teardown logic is defined with the appropriate trigger rules for consistent task resolution behavior.
A new utility function, create_asset_aliases(), allows DAG authors to define reusable aliases for frequently referenced Assets. This improves modularity and reuse across DAG files and is particularly helpful for teams adopting asset-centric DAGs.
The Operator Extra links, which can be defined either via plugins or custom operators now do not execute any user code in the Airflow UI, but instead push the "full" links to XCom backend and the link is fetched from the XCom backend when viewing task details, for example from grid view.
Example for users with custom links class:
@attr.s(auto_attribs=True)
class CustomBaseIndexOpLink(BaseOperatorLink):
"""Custom Operator Link for Google BigQuery Console."""
index: int = attr.ib()
@property
def name(self) -> str:
return f"BigQuery Console #{self.index + 1}"
@property
def xcom_key(self) -> str:
return f"bigquery_{self.index + 1}"
def get_link(self, operator, *, ti_key):
search_queries = XCom.get_one(
task_id=ti_key.task_id, dag_id=ti_key.dag_id, run_id=ti_key.run_id, key="search_query"
)
return f"https://console.cloud.google.com/bigquery?j={search_query}"
The link has an xcom_key defined, which is how it will be stored in the XCOM backend, with key as xcom_key and value as the entire link, this case: https://console.cloud.google.com/bigquery?j=search
Operator (including Sensors), Executors & Hooks can no longer be registered or imported via Airflow's plugin mechanism. These types of classes are just treated as plain Python classes by Airflow, so there is no need to register them with Airflow. They can be imported directly from their respective provider packages.
Before:
from airflow.hooks.my_plugin import MyHook
You should instead import it as:
from my_plugin import MyHook
Airflow 3.0 expands the types of DAGs that can be expressed by removing the constraint that each DAG run must correspond to a unique data interval. This change, introduced in AIP-83, enables support for workflows that don't operate on a fixed schedule — such as model training, hyperparameter tuning, and inference tasks.
These ML- and AI-oriented DAGs often run ad hoc, are triggered by external systems, or need to execute multiple times with different parameters over the same dataset. By allowing multiple DAG runs with logical_date=None, Airflow now supports these scenarios natively without requiring workarounds.
Airflow 3.0 introduces several configuration and interface updates that improve consistency, clarify ownership of core utilities, and remove legacy behaviors that were no longer aligned with modern usage patterns.
Airflow no longer silently updates configuration options that retain deprecated default values. Users are now required to explicitly set any config values that differ from the current defaults. This change improves transparency and prevents unintentional behavior changes during upgrades.
Several configuration defaults have changed in Airflow 3.0 to better reflect modern usage patterns:
The default value of catchup_by_default is now False. DAGs will not backfill missed intervals unless explicitly configured to do so.
The default value of create_cron_data_intervals is now False. Cron expressions are now interpreted using the CronTriggerTimetable instead of the legacy CronDataIntervalTimetable. This change simplifies interval logic and aligns with the future direction of Airflow's scheduling system. Set this flag explicitly before upgrading from Airflow 2 if you rely on data interval semantics; flipping it later (after Airflow 3 DAG runs exist) will skip one scheduled run per affected DAG.
Several core components have been moved to more intuitive or stable locations:
The SecretsMasker class has been relocated to airflow.sdk.execution_time.secrets_masker.
The ObjectStoragePath utility previously located under airflow.io is now available via airflow.sdk.
These changes simplify imports and reflect broader efforts to stabilize utility interfaces across the Airflow codebase.
Asset event mappings in the task context are improved to better support asset use cases, including new features introduced in AIP-74.
Events of an asset or asset alias are now accessed directly by a concrete object to avoid ambiguity. Using a str to access events is no longer supported. Use an Asset or AssetAlias object, or Asset.ref to refer to an entity explicitly instead, such as:
outlet_events[Asset.ref(name="myasset")] # Get events for asset named "myasset". outlet_events[AssetAlias(name="myalias")] # Get events for asset alias named "myalias".
Alternatively, two helpers for_asset and for_asset_alias are added as shortcuts:
outlet_events.for_asset(name="myasset") # Get events for asset named "myasset". outlet_events.for_asset_alias(name="myalias") # Get events for asset alias named "myalias".
The internal representation of asset event triggers now also includes an explicit uri field, simplifying traceability and aligning with the broader asset-aware execution model introduced in Airflow 3.0. DAG authors interacting directly with inlet_events may need to update logic that assumes the previous structure.
In Airflow 2, the xcom_pull() method allowed pulling XComs by key without specifying task_ids, despite the fact that the underlying DB model defines task_id as part of the XCom primary key. This created ambiguity: if two tasks pushed XComs with the same key, xcom_pull() would pull whichever one happened to be first, leading to unpredictable behavior.
Airflow 3 resolves this inconsistency by requiring task_ids when pulling by key. This change aligns with the task-scoped nature of XComs as defined by the schema, ensuring predictable and consistent behavior.
DAG Authors should update their dags to use task_ids if their dags used xcom_pull without task_ids such as:
kwargs["ti"].xcom_pull(key="key")
Should be updated to:
kwargs["ti"].xcom_pull(task_ids="task1", key="key")
As part of the deprecation cleanup, several legacy configuration options have been removed. These include:
[scheduler] allow_trigger_in_future
[scheduler] use_job_schedule
[scheduler] use_local_tz
[scheduler] processor_poll_interval
[logging] dag_processor_manager_log_location
[logging] dag_processor_manager_log_stdout
[logging] log_processor_filename_template
All the webserver configurations have also been removed since API server now replaces webserver, so the configurations like below have no effect:
[webserver] allow_raw_html_descriptions
[webserver] cookie_samesite
[webserver] error_logfile
[webserver] access_logformat
[webserver] web_server_master_timeout
etc
Several configuration options previously located under the [webserver] section have been moved to the new ``[api]`` section. The following configuration keys have been moved:
[webserver] web_server_host → [api] host
[webserver] web_server_port → [api] port
[webserver] workers → [api] workers
[webserver] web_server_worker_timeout → [api] worker_timeout
[webserver] web_server_ssl_cert → [api] ssl_cert
[webserver] web_server_ssl_key → [api] ssl_key
[webserver] access_logfile → [api] access_logfile
The following DAG parsing configuration options were moved to the new ``[dag_processor]`` section:
[core] dag_file_processor_timeout → [dag_processor] dag_file_processor_timeout
[scheduler] parsing_processes → [dag_processor] parsing_processes
[scheduler] file_parsing_sort_mode → [dag_processor] file_parsing_sort_mode
[scheduler] max_callbacks_per_loop → [dag_processor] max_callbacks_per_loop
[scheduler] min_file_process_interval → [dag_processor] min_file_process_interval
[scheduler] stale_dag_threshold → [dag_processor] stale_dag_threshold
[scheduler] print_stats_interval → [dag_processor] print_stats_interval
Users should review their airflow.cfg files or use the airflow config lint command to identify outdated or removed options.
Airflow 3.0 includes improved support for upgrade validation. Use the following tools to proactively catch incompatible configs or deprecated usage patterns:
airflow config lint: Identifies removed or invalid config keys
ruff check --select AIR30 --preview: Flags removed interfaces and common migration issues
Airflow 3.0 introduces changes to both the CLI and REST API interfaces to better align with service-oriented deployments and event-driven workflows.
The Airflow CLI has been split into two distinct interfaces:
The core airflow CLI now handles only local functionality (e.g., airflow tasks test, airflow dags list).
Remote functionality, including triggering DAGs or managing connections in service-mode environments, is now handled by a separate CLI called airflowctl, distributed via the apache-airflow-client package.
This change improves security and modularity for deployments that use Airflow in a distributed or API-first context.
The legacy REST API v1, previously built with Connexion and Marshmallow, has been replaced by a modern FastAPI-based REST API v2.
This new implementation improves performance, aligns more closely with web standards, and provides a consistent developer experience across the API and UI.
Key changes include stricter validation (422 errors instead of 400), the removal of the execution_date parameter in favor of logical_date, and more consistent query parameter handling.
The v2 API is now the stable, fully supported interface for programmatic access to Airflow, and also powers the new UI - achieving full feature parity between the UI and API.
For details, see the Airflow REST API v2 documentation.
The behavior of the POST /dags/{dag_id}/dagRuns endpoint has changed. If a logical_date is not explicitly provided when triggering a DAG via the REST API, it now defaults to None.
This aligns with event-driven DAGs and manual runs in Airflow 3.0, but may break backward compatibility with scripts or tools that previously relied on Airflow auto-generating a timestamped logical_date.
Several deprecated CLI arguments and commands that were marked for removal in earlier versions have now been cleaned up in Airflow 3.0. Run airflow --help to review the current set of available commands and arguments.
Deprecated --ignore-depends-on-past cli option is replaced by --depends-on-past ignore.
--tree flag for airflow tasks list command is removed. The format of the output with that flag can be expensive to generate and extremely large, depending on the DAG. airflow dag show is a better way to visualize the relationship of tasks in a DAG.
Changing dag_id from flag (-d, --dag-id) to a positional argument in the dags list-runs CLI command.
The airflow db init and airflow db upgrade commands have been removed. Use airflow db migrate instead to initialize or migrate the metadata database. If you would like to create default connections use airflow connections create-default-connections.
airflow api-server has replaced airflow webserver cli command.
Airflow 3.0 completes the migration of several core operators, sensors, hooks, and triggers into the new apache-airflow-providers-standard package. This package now includes commonly used components such as:
PythonOperator, BashOperator
ExternalTaskSensor, FileSensor
ShortCircuitOperator, LatestOnlyOperator
SubprocessHook, FilesystemHook
DateTimeTrigger, TimeDeltaTrigger, FileTrigger
These operators, sensors, hooks, and triggers were previously bundled inside airflow-core but are now treated as provider-managed components to improve modularity, testability, and lifecycle independence.
This change enables more consistent versioning across providers and prepares Airflow for a future where all integrations — including "standard" ones — follow the same interface model.
To maintain compatibility with existing DAGs, the apache-airflow-providers-standard package is installable on both Airflow 2.x and 3.x. Users upgrading from Airflow 2.x are encouraged to begin updating import paths and testing provider installation in advance of the upgrade.
Legacy imports such as airflow.operators.python.PythonOperator are deprecated and will be removed soon. They should be replaced with:
from airflow.providers.standard.operators.python import PythonOperator
The SimpleHttpOperator has been migrated to apache-airflow-providers-http and renamed to HttpOperator
Airflow 3.0 introduces a modernized user experience that complements the new React-based UI architecture (see Significant Changes). Several areas of the interface have been enhanced to improve visibility, consistency, and navigability.
The Airflow Home page now provides a high-level operational overview of your environment. It includes health checks for core components (Scheduler, Triggerer, DAG Processor), summary stats for DAG and task instance states, and a real-time feed of asset-triggered events. This view helps users quickly identify pipeline health, recent activity, and potential failures.
The DAG List page has been refreshed with a cleaner layout and improved responsiveness. Users can browse DAGs by name, tags, or owners. While full-text search has not yet been integrated, filters and navigation have been refined for clarity in large deployments.
The Graph and Grid views now display task information in the context of the DAG version that was used at runtime. This improves traceability for DAGs that evolve over time and provides more accurate debugging of historical runs.
The Graph view now supports visualizing the full chain of asset and task dependencies, including assets consumed or produced across DAG boundaries. This allows users to inspect upstream and downstream lineage in a unified view, making it easier to trace data flows, debug triggering behavior, and understand conditional dependencies between assets and tasks.
The "Code" tab now displays the exact DAG source as parsed by the scheduler for the selected DAG version. This allows users to inspect the precise code that was executed, even for historical runs, and helps debug issues related to versioned DAG changes.
Task log access has been streamlined across views. Logs are now easier to access from both the Grid and Task Instance pages, with cleaner formatting and reduced visual noise.
New UI components support asset-centric DAGs and backfill workflows:
Asset definitions are now visible from the DAG details page, allowing users to inspect upstream and downstream asset relationships.
Backfills can be triggered and monitored directly from the UI, including support for scheduler-managed backfills introduced in Airflow 3.0.
These improvements make Airflow more accessible to operators, data engineers, and stakeholders working across both time-based and event-driven workflows.
A number of deprecated features, modules, and interfaces have been removed in Airflow 3.0, completing long-standing migrations and cleanups.
Users are encouraged to review the following removals to ensure compatibility:
SubDag support has been removed entirely, including the SubDagOperator, related CLI and API interfaces. TaskGroups are now the recommended alternative for nested DAG structures.
SLAs have been removed: The legacy SLA feature, including SLA callbacks and metrics, has been removed. A more flexible replacement mechanism, DeadlineAlerts, is planned for a future version of Airflow. Users who relied on SLA-based notifications should consider implementing custom alerting using task-level success/failure hooks or external monitoring integrations.
Pickling support has been removed: All legacy features related to DAG pickling have been fully removed. This includes the PickleDag CLI/API, as well as implicit behaviors around store_serialized_dags = False. DAGs must now be serialized using the JSON-based serialization system. Ensure any custom Python objects used in DAGs are JSON-serializable.
Context parameter cleanup: Several previously available context variables have been removed from the task execution context, including conf, execution_date, and dag_run.external_trigger. These values are either no longer applicable or have been renamed (e.g., use dag_run.logical_date instead of execution_date). DAG authors should ensure that templated fields and Python callables do not reference these deprecated keys.
Deprecated core imports have been fully removed. Any use of airflow.operators.*, airflow.hooks.*, or similar legacy import paths should be updated to import from their respective providers.
Configuration cleanup: Several legacy config options have been removed, including:
scheduler.allow_trigger_in_future: DAG runs can no longer be triggered with a future logical date. Use logical_date=None instead.
scheduler.use_job_schedule and scheduler.use_local_tz have also been removed. These options were deprecated and no longer had any effect.
Deprecated utility methods such as those in airflow.utils.helpers, airflow.utils.process_utils, and airflow.utils.timezone have been removed. Equivalent functionality can now be found in the standard Python library or Airflow provider modules.
Removal of deprecated CLI flags and behavior: Several CLI entrypoints and arguments that were marked for removal in earlier versions have been cleaned up.
To assist with the upgrade, tools like ruff (e.g., rule AIR302) and airflow config lint can help identify obsolete imports and configuration keys. These utilities are recommended for locating and resolving common incompatibilities during migration. Please see Upgrade Guide for more information.
The following table summarizes user-facing features removed in 3.0 and their recommended replacements. Not all of these are called out individually above.
Feature |
Replacement / Notes |
|---|---|
SubDagOperator / SubDAGs |
Use TaskGroups |
SLA callbacks / metrics |
Deadline Alerts (planned post-3.0) |
DAG Pickling |
Use JSON serialization; pickling is no longer supported |
Xcom Pickling |
Use custom Xcom backend; pickling is no longer supported |
execution_date context var |
Use dag_run.logical_date |
conf and dag_run.external_trigger |
Removed from context; use DAG params or dag_run APIs |
Core EmailOperator |
Use EmailOperator from the smtp provider |
none_failed_or_skipped rule |
Use none_failed_min_one_success |
dummy trigger rule |
Use always |
fail_stop argument |
Use fail_fast |
store_serialized_dags=False |
DAGs are always serialized; config has no effect |
Deprecated core imports |
Import from appropriate provider package |
SequentialExecutor & DebugExecutor |
Use LocalExecutor for testing |
.airflowignore regex |
Uses glob syntax by default |
Airflow 3 was designed with migration in mind. Many Airflow 2 DAGs will work without changes, especially if deprecation warnings were addressed in earlier releases. To support the upgrade, Airflow 3 includes validation tools such as ruff and airflow config update, as well as a simplified startup model.
For a step-by-step upgrade process, see the Upgrade Guide.
To upgrade to Airflow 3.0, you must be running Airflow 2.7 or later.
Airflow 3.0 supports the following Python versions:
Python 3.9
Python 3.10
Python 3.11
Python 3.12
Earlier versions of Airflow or Python are not supported due to architectural changes and updated dependency requirements.
Airflow now includes a Ruff-based linter with custom rules to detect DAG patterns and interfaces that are no longer compatible with Airflow 3.0. These checks are packaged under the AIR30x rule series. Example usage:
ruff check dags/ --select AIR301 --preview
ruff check dags/ --select AIR301 --fix --preview
These checks can automatically fix many common issues such as renamed arguments, removed imports, or legacy context variable usage.
Airflow 3.0 introduces a new utility to validate and upgrade your Airflow configuration file:
airflow config update
airflow config update --fix
This utility detects removed or deprecated configuration options and, if desired, updates them in-place.
Additional validation is available via:
airflow config lint
This command surfaces obsolete configuration keys and helps align your environment with Airflow 3.0 requirements.
As with previous major releases, the Airflow 3.0 upgrade includes schema changes to the metadata database. Before upgrading, it is strongly recommended that you back up your database and optionally run:
airflow db clean
to remove old task instance, log, or XCom data. To apply the new schema:
airflow db migrate
Airflow components are now started explicitly. For example:
airflow api-server # Replaces airflow webserver
airflow dag-processor # Required in all environments
These changes reflect Airflow's new service-oriented architecture.
Upgrade Guide
Airflow 3.0 represents more than a year of collaboration across hundreds of contributors and dozens of organizations. We thank everyone who helped shape this release through design discussions, code contributions, testing, documentation, and community feedback. For full details, migration guidance, and upgrade best practices, refer to the official Upgrade Guide and join the conversation on the Airflow dev and user mailing lists.
Release Date: 2021-05-06
The params parameter in airflow.providers.google.cloud.operators.automl.AutoMLPredictOperator class was renamed operation_params because it conflicted with a param parameter in the BaseOperator class.
In 3.0.0 version of the provider we’ve changed the way of integrating with the apache.beam provider. The previous versions of both providers caused conflicts when trying to install them together using PIP > 20.2.4. The conflict is not detected by PIP 20.2.4 and below but it was there and the version of Google BigQuery python client was not matching on both sides. As the result, when both apache.beam and google provider were installed, some features of the BigQuery operators might not work properly. This was cause by apache-beam client not yet supporting the new google python clients when apache-beam[gcp] extra was used. The apache-beam[gcp] extra is used by Dataflow operators and while they might work with the newer version of the Google BigQuery python client, it is not guaranteed.
This version introduces additional extra requirement for the apache.beam extra of the google provider and symmetrically the additional requirement for the google extra of the apache.beam provider. Both google and apache.beam provider do not use those extras by default, but you can specify them when installing the providers. The consequence of that is that some functionality of the Dataflow operators might not be available.
Unfortunately the only complete solution to the problem is for the apache.beam to migrate to the new (>=2.0.0) Google Python clients.
This is the extra for the google provider:
extras_require = ( { # ... "apache.beam" : [ "apache-airflow-providers-apache-beam" , "apache-beam[gcp]" ], # ... }, )
And likewise this is the extra for the apache.beam provider:
extras_require = ({ "google" : [ "apache-airflow-providers-google" , "apache-beam[gcp]" ]},)
You can still run this with PIP version <= 20.2.4 and go back to the previous behaviour:
pip install apache-airflow-providers-google [ apache.beam ]
or
pip install apache-airflow-providers-apache-beam [ google ]
But be aware that some BigQuery operators functionality might not be available in this case.
[Airflow-15245] - passing custom image family name to the DataProcClusterCreateoperator (#15250)
Bugfix: Fix rendering of ''object_name'' in ''GCSToLocalFilesystemOperator'' (#15487)
Fix typo in DataprocCreateClusterOperator (#15462)
Fixes wrongly specified path for leveldb hook (#15453)
Nothing published for this version
Add deprecation notice for SubDagOperator
cwd for BashOperator (#17751)RESTARTING state (#16681)insert_args for support transfer replace (#15825)default_args for TaskGroup (#16557)kinit options [-f|-F] and [-a|-A] (#17816)DaskExecutor using Dask Worker Resources (#16829, #18720)processor_poll_interval to scheduler_idle_sleep_time (#18704)dagrun_conf (#18655)TaskInstanceModelView (#18438)Variable.update method and improving detection of variable key collisions (#18159)TaskInstance and TaskReschedule PK from execution_date to run_id (#17719)TaskGroup support in BaseOperator.chain() (#17456)template_ext attribute to show it in UI (#17985)robots.txt and X-Robots-Tag header (#17946)BranchDayOfWeekOperator, DayOfWeekSensor (#17940)none_failed_or_skipped by none_failed_min_one_success trigger rule (#17683)[core] store_dag_code & use DB to get Dag Code (#16342)task_concurrency to max_active_tis_per_dag (#17708)execution_date with run_id in airflow tasks run command (#16666)worker_log_server_port option to the logging section (#17621)SubDagOperator (#17488)template_fields_renderers (#17321)airflow celery stop to accept the pid file. (#17278)airflow_local_settings (#17195)AirflowException str when BashOperator fails. (#17151)SQLite or SequentialExecutor (#17133)init_containers defined in pod_override (#17537)airflow db init/upgrade migrations and setup in parallel. (#17078)chain() and cross_downstream() to support XComArgs (#16732)serve-logs and LocalExecutor (#16644)test_cycle to check_cycle (#16617)LocalExecutor (#16623)DbApiHook instance attribute (#16521, #17423)dag.sub_dag with dag.partial_subset (#16179)AirflowSensorTimeout as immediate failure without retrying (#12058)action_clear view (#15980)[core] dag_concurrency) settings for easier understanding (#16267, #18730)SKIPPED should not be logged again as SUCCESS (#14822)start_date for cleared tasks (#18708)AirflowDateTimePickerWidget a required field (#18602)retry_exponential_backoff divide by zero error when retry delay is zero (#17003){{ task.x }} attributes from within templates (#18516)sys.path (#18384)dag_tag rows that are now unused (#8231)wait_for_downstream dep (#18338)run_finished_callback for Debug Executor (#17983)XCom.get_one return full, not abbreviated values (#18274)XCom.set (#18240)_check_for_stalled_adopted_tasks method (#18208)StandardTaskRunner (#17967)self._error_file (#15947)DateTimeSensor (#17959)traceback.html (#17942)DagRunState enum query for MySQLdb driver (#17886)utf8mb3_general_ci collation for MySQL (#17729)TaskInstance does not work #17535 (#17548)DAG.cli() (#17105)None comparison in model_list template (#16893)cached_property module (#16710)Decimal (#16383)dag_id and empty subdir (#16513)dag.fileloc when using the @dag decorator (#16384)airflow/www/views.py (#15940)reschedule state (#17305, #18806)dagbag_size documentation (#18824)search_path set up instructions (#17600)AIRFLOW_GID from Docker images (#18747)sla_miss_callback section to the documentation (#18305)closer.lua script for downloading sources (#18179)DAG.is_active read-only in API (#17667)XCom.clear for data lifecycle management (#17589)pod_template_file (#16861)Jed and TP (#16671)flask-ouathlib to flask-oauthlib in Upgrading docs (#16320)Elasticsearch (#16275)dag_concurrency (#16177)default_pool slots (#15997)KubernetesExecutor git-sync pod template file (#15904)render_template_as_native_obj (#16534)POST to PATCH (#16511)BranchPythonOperator (#18623)boto3 to <1.19 (#18389)airflow.security.kerberos module (#18258)range(len()) to enumerate (#18174)main builds (#18035)tenacity (#17593)numpy dependency (#17594)mysql-connector-python to latest version (#17596)pandas an optional core dependency (#17575)airflow/utils/db.py (#17090)click to 8.x (#16779)dag.clear method (#16086)DAG_ACTIONS constant (#16232)_get_all_non_dag_permissions method (#16317)docutils to <0.17 until breaking behaviour is fixed (#16133)TaskInstance.log_filepath attribute (#15217)airflow/www/app.py (#15956)plyvel to google provider extra (#15812)find_permission_view_menu for get_permission wrapper (#16377)fab_logging_level to WARNING (#18783)CeleryKubernetesExecutor (#18441)Release Date: 2021-04-13
Adds 'Trino' provider (with lower memory footprint for tests) (#15187)
update remaining old import paths of operators (#15127)
Override project in dataprocSubmitJobOperator (#14981)
GCS to BigQuery Transfer Operator with Labels and Description parameter (#14881)
Add GCS timespan transform operator (#13996)
Add job labels to bigquery check operators. (#14685)
Use libyaml C library when available. (#14577)
Add Google leveldb hook and operator (#13109) (#14105)
Google Dataflow Hook to handle no Job Type (#14914)
Nothing published for this version
- Corrects order of argument in docstring in GCSHook.download method
Release Date: 2021-03-07
Corrects order of argument in docstring in GCSHook.download method (#14497)
Refactor SQL/BigQuery/Qubole/Druid Check operators (#12677)
Add GoogleDriveToLocalOperator (#14191)
Add 'exists_ok' flag to BigQueryCreateEmptyTable(Dataset)Operator (#14026)
Add materialized view support for BigQuery (#14201)
Add BigQueryUpdateTableOperator (#14149)
Add param to CloudDataTransferServiceOperator (#14118)
Add gdrive_to_gcs operator, drive sensor, additional functionality to drive hook (#13982)
Improve GCSToSFTPOperator paths handling (#11284)
Fixes to dataproc operators and hook (#14086)
#9803 fix bug in copy operation without wildcard (#13919)
Bump stylelint to remove vulnerable sub-dependency
New Features """"""""""""
PythonVirtualenvDecorator to Taskflow API (#14761)Taskgroup decorator (#15034)SubprocessHook for running commands from operators (#13423)WeekDayBranchOperator (#13997)worker_pod_pending_timeout support (#15263)template_fields_renderers additions (#15130)AirflowSkipException on exit code 99 (by default, configurable) (#13421) (#14963)airflow jobs check CLI command to check health of jobs (Scheduler etc) (#14519)DateTimeBranchOperator to BranchDateTimeOperator (#14720)Improvements """"""""""""
DbApiHook (#15581)apply_default to subclasses of BaseOperator (#15667)KubernetesExecutor pod templates to allow access to IAM permissions (#15669)airflow db check-migrations (#15662)secret_key when Webserver > 1 (#15546)JSONFormatter (#15414)on_failure_callback when SIGTERM is received (#15172)worker_refresh_interval to 6000 seconds (#14970)[celery] default_queue config to [operators] default_queue to re-use between executors (#14699)Bug Fixes """""""""
updateTaskInstancesState API endpoint when dry_run not passed (#15889)drawDagStatsForDag in dags.html (#13884)NotPreviouslySkippedDep (#13933)KubernetesExecutor (#14795)KubernetesPodOperator (#15388)dag.partial_subset (#13700) (#15308)pod_id for KubernetesPodOperator (#15445)pod_id ends with hyphen in KubernetesPodOperator (#15443)pool_slots > 1 (#15426)sync-perm to work correctly when update_fab_perms = False (#14847)GCSObjectsWtihPrefixExistenceSensor (#14179)CeleryKubernetesExecutor bug (#13247)StackdriverTaskHandler (#13784)func.sum may return Decimal that break rest APIs (#15585)AlreadyExists exception when the execution_date is same (#15174)sync_metadata inside DagFileProcessorManager (#15121)docker-py update to resolve docker op issues (#15731)user_id from API schema (#15117)airflow info work with pipes (#14528)CollectionInfo in all Collections that have total_entries (#14366)task_instance_mutation_hook when importing airflow.models.dagrun (#15851)Doc only changes """"""""""""""""
markdownlint and yamllint config files (#15682)git_sync_template.yaml (#13197)Misc/Internal """""""""""""
logging.exception redundancy (#14823)stylelint to remove vulnerable sub-dependency (#15784)ssri from 6.0.1 to 6.0.2 in /airflow/www (#15437)datepicker for task instance detail view (#15284)tableau extra (#13595)cached_property on Python 3.8 where possible (#14606)flynt. (#13732)jquery ready instead of vanilla js (#15258)Webpack entries (#14551)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…
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:
(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:
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()
We now have a fully supported, no-longer-experimental API with a comprehensive OpenAPI specification
Read more here:
REST API Documentation.
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!)
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.
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.
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 :).
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!)
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 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 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.
Release Date: 2021-02-08
This release of the provider package contains third-party library updates, which may require updating your DAG files or custom hooks and operators, if you were using objects from those libraries. Updating of these libraries is necessary to be able to use new features made available by new versions of the libraries and to obtain bug fixes that are only available for new versions of the library.
Details are covered in the UPDATING.md files for each library, but there are some details that you should pay attention to.
Library name
Previous constraints
Current constraints
Upgrade Documentation
google-cloud-automl
=0.4.0,<2.0.0
=2.1.0,<3.0.0
Upgrading google-cloud-automl
google-cloud-bigquery-datatransfer
=0.4.0,<2.0.0
=3.0.0,<4.0.0
Upgrading google-cloud-bigquery-datatransfer
google-cloud-datacatalog
=0.5.0,<0.8
=3.0.0,<4.0.0
Upgrading google-cloud-datacatalog
google-cloud-dataproc
=1.0.1,<2.0.0
=2.2.0,<3.0.0
Upgrading google-cloud-dataproc
google-cloud-kms
=1.2.1,<2.0.0
=2.0.0,<3.0.0
Upgrading google-cloud-kms
google-cloud-logging
=1.14.0,<2.0.0
=2.0.0,<3.0.0
Upgrading google-cloud-logging
google-cloud-monitoring
=0.34.0,<2.0.0
=2.0.0,<3.0.0
Upgrading google-cloud-monitoring
google-cloud-os-login
=1.0.0,<2.0.0
=2.0.0,<3.0.0
Upgrading google-cloud-os-login
google-cloud-pubsub
=1.0.0,<2.0.0
=2.0.0,<3.0.0
Upgrading google-cloud-pubsub
google-cloud-tasks
=1.2.1,<2.0.0
=2.0.0,<3.0.0
Upgrading google-cloud-task
If your DAG uses an object from the above mentioned libraries passed by XCom, it is necessary to update the naming convention of the fields that are read. Previously, the fields used the CamelSnake convention, now the snake_case convention is used.
Before:
set_acl_permission = GCSBucketCreateAclEntryOperator ( task_id = "gcs-set-acl-permission" , bucket = BUCKET_NAME , entity = "user-{{ task_instance.xcom_pull('get-instance')['persistenceIamIdentity'].split(':', 2)[1] }}" , role = "OWNER" , )
After:
set_acl_permission = GCSBucketCreateAclEntryOperator ( task_id = "gcs-set-acl-permission" , bucket = BUCKET_NAME , entity = "user-{{ task_instance.xcom_pull('get-instance')['persistence_iam_identity']" ".split(':', 2)[1] }}" , role = "OWNER" , )
Add Apache Beam operators (#12814)
Add Google Cloud Workflows Operators (#13366)
Replace 'google_cloud_storage_conn_id' by 'gcp_conn_id' when using 'GCSHook' (#13851)
Add How To Guide for Dataflow (#13461)
Generalize MLEngineStartTrainingJobOperator to custom images (#13318)
Add Parquet data type to BaseSQLToGCSOperator (#13359)
Add DataprocCreateWorkflowTemplateOperator (#13338)
Add OracleToGCS Transfer (#13246)
Add timeout option to gcs hook methods. (#13156)
Add regional support to dataproc workflow template operators (#12907)
Add project_id to client inside BigQuery hook update_table method (#13018)
Fix four bugs in StackdriverTaskHandler (#13784)
Decode Remote Google Logs (#13115)
Fix and improve GCP BigTable hook and system test (#13896)
updated Google DV360 Hook to fix SDF issue (#13703)
Fix insert_all method of BigQueryHook to support tables without schema (#13138)
Fix Google BigQueryHook method get_schema() (#13136)
Fix Data Catalog operators (#13096)
This release of the provider package contains third-party library updates, which may require updating your DAG files or custom hooks and operators, if you were using objects from those libraries. Updating of these libraries is necessary to be able to use new features made available by new versions of the libraries and to obtain bug fixes that are only available for new versions of the library.
Details are covered in the UPDATING.md files for each library, but there are some details that you should pay attention to.
Library name |
Previous constraints |
Current constraints |
Upgrade Documentation |
|---|---|---|---|
>=0.4.0,<2.0.0 |
>=2.1.0,<3.0.0 |
||
>=0.4.0,<2.0.0 |
>=3.0.0,<4.0.0 |
||
>=0.5.0,<0.8 |
>=3.0.0,<4.0.0 |
||
>=1.0.1,<2.0.0 |
>=2.2.0,<3.0.0 |
||
>=1.2.1,<2.0.0 |
>=2.0.0,<3.0.0 |
||
>=1.14.0,<2.0.0 |
>=2.0.0,<3.0.0 |
||
>=0.34.0,<2.0.0 |
>=2.0.0,<3.0.0 |
||
>=1.0.0,<2.0.0 |
>=2.0.0,<3.0.0 |
||
>=1.0.0,<2.0.0 |
>=2.0.0,<3.0.0 |
||
>=1.2.1,<2.0.0 |
>=2.0.0,<3.0.0 |
If your DAG uses an object from the above mentioned libraries passed by XCom, it is necessary to update the naming convention of the fields that are read. Previously, the fields used the CamelSnake convention, now the snake_case convention is used.
Before:
set_acl_permission = GCSBucketCreateAclEntryOperator(
task_id="gcs-set-acl-permission",
bucket=BUCKET_NAME,
entity="user-{{ task_instance.xcom_pull('get-instance')['persistenceIamIdentity'].split(':', 2)[1] }}",
role="OWNER",
)
After:
set_acl_permission = GCSBucketCreateAclEntryOperator(
task_id="gcs-set-acl-permission",
bucket=BUCKET_NAME,
entity="user-{{ task_instance.xcom_pull('get-instance')['persistence_iam_identity']"
".split(':', 2)[1] }}",
role="OWNER",
)
Add Apache Beam operators (#12814)
Add Google Cloud Workflows Operators (#13366)
Replace 'google_cloud_storage_conn_id' by 'gcp_conn_id' when using 'GCSHook' (#13851)
Add How To Guide for Dataflow (#13461)
Generalize MLEngineStartTrainingJobOperator to custom images (#13318)
Add Parquet data type to BaseSQLToGCSOperator (#13359)
Add DataprocCreateWorkflowTemplateOperator (#13338)
Add OracleToGCS Transfer (#13246)
Add timeout option to gcs hook methods. (#13156)
Add regional support to dataproc workflow template operators (#12907)
Add project_id to client inside BigQuery hook update_table method (#13018)
Fix four bugs in StackdriverTaskHandler (#13784)
Decode Remote Google Logs (#13115)
Fix and improve GCP BigTable hook and system test (#13896)
updated Google DV360 Hook to fix SDF issue (#13703)
Fix insert_all method of BigQueryHook to support tables without schema (#13138)
Fix Google BigQueryHook method get_schema() (#13136)
Fix Data Catalog operators (#13096)
Nothing published for this version
Initial version of the provider.
Release Date: 2020-12-14
Initial version of the provider.
Previous Next
Was this entry helpful?
Suggest a change on this page
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →