Airflow Summit 2025 即將於 10 月 07-09 日舉行。立即註冊以獲取早鳥票!

發行說明

Airflow 3.0.0 (2025-04-22)

我們很自豪地宣佈 Apache Airflow 3.0 的正式釋出 — 這是該專案歷史上最重要的版本。 此版本引入了面向服務的架構、穩定的 DAG 創作介面、擴充套件了對事件驅動和 ML 工作流的支援,以及基於 React 構建的完全現代化的 UI。 Airflow 3.0 反映了社群多年的投資,併為下一個可擴充套件、模組化編排時代奠定了基礎。

亮點

  • 面向服務的架構:新的任務執行 API 和 airflow api-server 可以在遠端環境中執行任務,並具有更高的隔離性和靈活性 (AIP-72)。

  • Edge Executor:一種新的 executor,支援分散式、事件驅動和邊緣計算工作流 (AIP-69),現在正式釋出。

  • 穩定的創作介面:DAG 作者現在應該使用新的 airflow.sdk 名稱空間來匯入核心 DAG 結構,例如 @dag@taskDAG

  • 排程器管理的 Backfill:Backfill 現在像常規 DAG 執行一樣進行排程和跟蹤,並具有原生 UI 和 API 支援 (AIP-78)。

  • DAG 版本控制:Airflow 現在跟蹤 DAG 隨時間推移的結構變化,從而可以透過 UI 和 API 檢查歷史 DAG 定義 (AIP-66)。

  • 基於資產的排程:資料集模型已重新命名並重新設計為資產,具有新的 @asset 裝飾器和更清晰的事件驅動型 DAG 定義 (AIP-74, AIP-75)。

  • 對 ML 和 AI 工作流的支援:DAG 現在可以使用 logical_date=None 執行,從而實現模型推理、超引數調整和非間隔工作流等用例 (AIP-83)。

  • 移除遺留功能:SLA、SubDAG、DAG 和 Xcom pickling 以及多個內部上下文變數已被移除。 使用升級工具檢測已棄用的用法。

  • 拆分 CLI 和 API 更改:CLI 已拆分為 airflowairflowctl (AIP-81),並且 REST API 現在在觸發新的 DAG 執行時預設使用 logical_date=None

  • 現代 React UI:基於 React 和 FastAPI 構建的完整 UI 大修包括版本感知檢視、backfill 管理以及改進的 DAG 和任務內省 (AIP-38, AIP-84)。

  • 遷移工具:使用 ruffairflow config update 驗證 DAG 和配置。 升級需要 Airflow 2.7 或更高版本以及 Python 3.9–3.12。

重大更改

Airflow 3.0 引入了自 2.0 版本以來最重要的一系列更改,包括架構轉變、新的執行模型以及對 DAG 創作和排程的改進。

任務執行 API & 任務 SDK (AIP-72)

Airflow 現在支援面向服務的架構,從而可以透過新的任務執行 API 遠端執行任務。 此 API 將任務執行與排程器分離,並引入了一個穩定的合約,用於在 Airflow 傳統執行時環境之外執行任務。

為了支援這一點,Airflow 引入了任務 SDK — 一個輕量級的執行時環境,用於在外部系統(例如容器、邊緣環境或其他執行時)中執行 Airflow 任務。 這為與語言無關的任務執行奠定了基礎,併為基於 Airflow 的工作流帶來了更高的隔離性、可移植性和可擴充套件性。

Airflow 3.0 還引入了一個新的 airflow.sdk 名稱空間,該名稱空間公開了用於定義 DAG 和任務的核心創作介面。 DAG 作者現在應該從 airflow.sdk 而不是內部模組匯入諸如 DAG@dag@task 之類的物件。 這個新的名稱空間為未來版本的 Airflow 提供了穩定的、向前相容的 DAG 創作介面。

Edge Executor (AIP-69)

Airflow 3.0 引入了 Edge Executor 作為正式釋出的功能,支援在分散式或遠端計算環境中執行任務。 Edge Executor 專為事件驅動和邊緣計算用例而設計,它與任務執行 API 整合,以支援超越傳統 Airflow 執行時的任務編排。 這種進步促進了混合和跨環境編排模式,允許任務 worker 更靠近資料或應用程式層執行。

排程器管理的 Backfill (AIP-78)

Backfill 現在完全由排程器管理,而不是作為單獨的命令列作業啟動。 這種更改將 backfill 邏輯與常規 DAG 執行統一起來,並確保 backfill 執行遵循與其他 DAG 執行相同的排程、版本控制和可觀察性模型。

Airflow 3.0 還引入了原生 UI 和 REST API 支援,用於啟動和監控 backfill,使其更易於訪問並更易於整合到自動化工作流程中。 這些改進為更智慧、更安全的歷史重新處理奠定了基礎 — 現在可以直接透過 Airflow UI 和 API 獲得。

DAG 版本控制 (AIP-66)

Airflow 3.0 引入了原生 DAG 版本控制。 DAG 結構更改(例如,重新命名的任務、依賴關係變化)現在直接在元資料資料庫中進行跟蹤。 這允許使用者透過 UI 和 API 檢查歷史 DAG 結構,併為更安全的 backfill、改進的可觀察性和執行時確定的 DAG 邏輯奠定了基礎。

React UI 重寫 (AIP-38, AIP-84)

Airflow 3.0 附帶了一個基於 React 和 FastAPI 構建的完全重新設計的使用者介面。 這種現代架構提高了響應速度,可以在檢視之間實現更一致的導航,並解鎖了新的 UI 功能 — 包括對 DAG 版本控制、以資產為中心的 DAG 定義以及更直觀的過濾和搜尋的支援。

新的 UI 取代了基於 Flask 的舊版前端,併為未來的可擴充套件性和社群貢獻奠定了基礎。

基於資產的排程和術語對齊 (AIP-74, AIP-75)

資料集(Datasets)的概念已重新命名為資產(Assets),以統一術語,與現代資料生態系統中的常用實踐保持一致。內部模型也已重新設計,以更好地支援未來的功能,如資產分割槽和驗證。

@asset 裝飾器以及對 DAG 解析器的相關更改,實現了更清晰、以資產為中心的 DAG 定義,使 Airflow 能夠更自然地支援事件驅動和資料感知的排程模式。

統一排程欄位

Airflow 3.0 移除了遺留的 schedule_intervaltimetable 引數。DAG 現在必須使用統一的 schedule 欄位來處理所有基於時間和事件的排程邏輯。這簡化了 DAG 定義,並提高了跨排程模式的一致性。

更新的排程預設值

Airflow 3.0 更改了新 DAG 的預設行為,在配置檔案中設定 catchup_by_default = False。這意味著未顯式設定 catchup=... 的 DAG 將不再預設回填錯過的間隔。此更改減少了新使用者的困惑,並更好地反映了按需和事件驅動工作流程的日益增長的使用。

限制對元資料資料庫的訪問

任務程式碼不再能直接訪問元資料資料庫。與 DAG 狀態、任務歷史記錄或 DAG 執行的互動必須透過 Airflow REST API 或公開的上下文來執行。此更改改進了架構分離並實現了遠端執行。

不再支援未來邏輯日期

Airflow 不再支援使用未來邏輯日期觸發 DAG 執行。此更改與邏輯執行模型保持一致,並消除了回填和事件驅動 DAG 中的歧義。使用 logical_date=None 以使用當前時間戳觸發執行。

資產和手動觸發 DAG 的上下文行為

對於由資產事件觸發的 DAG 執行,或透過 REST API 觸發且未指定 logical_date 的 DAG 執行,Airflow 現在預設設定 logical_date=None。這些 DAG 執行沒有資料間隔,並且嘗試從任務上下文中訪問 data_interval_startdata_interval_endlogical_date 將引發 KeyError

DAG 作者應使用 dag_run.logical_date 並執行適當的檢查或回退,以支援多種觸發型別。此更改提高了與事件驅動語義的一致性,但可能需要更新現有 DAG,因為它們假設這些值始終存在。

改進的回撥行為

Airflow 3.0 改進了任務回撥行為,以提高畫質晰度和一致性。特別是,當任務標記為 SKIPPED 時,不再執行 on_success_callback,使其更符合預期語義。

更新的預設配置

Airflow 3.0 中更新了幾個預設配置值,以更好地反映現代使用模式並簡化入門。

  • catchup_by_default 現在預設設定為 False。除非明確配置,否則 DAG 將不會自動回填。

  • create_cron_data_intervals 現在預設設定為 False。因此,將使用 CronTriggerTimetable 而不是遺留的 CronDataIntervalTimetable 來解釋 cron 表示式。

  • SimpleAuthManager 現在是預設的 auth_manager。要繼續使用基於 Flask AppBuilder 的身份驗證,請安裝 apache-airflow-providers-flask-appbuilder 提供程式並顯式設定 auth_manager = airflow.providers.fab.auth_manager.FabAuthManager

這些更改代表了自 2.0 版本釋出以來 Airflow 平臺最重大的演變——為未來幾年更具可擴充套件性、事件驅動和語言無關的編排奠定了基礎。

執行器和排程器更新

Airflow 3.0 在 DAG 和任務的排程、優先順序排序和執行方式方面引入了幾個重要的改進和行為變更。

需要獨立的 DAG 處理器

Airflow 3.0 現在需要獨立的 DAG 處理器來解析 DAG。此專用程序提高了排程器效能、隔離性和可觀察性。它還透過將 DAG 解析與排程邏輯清楚地分離來簡化架構。此更改可能會影響以前使用嵌入式 DAG 解析的自定義部署。

優先順序權重受池槽位限制

任務上的 priority_weight 值現在受可用池槽位數量的限制。這確保了資源可用性仍然是任務執行順序的主要約束,防止高優先順序任務在存在資源爭用時餓死其他任務。

DAG 終止期間的拆卸任務處理

即使 DAG 執行提前終止,現在也將執行拆卸任務。這確保了清理邏輯得到尊重,提高了使用拆卸任務來管理臨時基礎設施、臨時檔案或下游通知的工作流程的可靠性。

改進的排程器容錯性

排程器元件現在使用 run_with_db_retries 更優雅地處理瞬態資料庫問題。這增強了 Airflow 在高容量環境中的容錯能力,並降低了由於臨時資料庫連線問題導致排程器重新啟動的可能性。

對映的任務統計資訊準確性

Airflow 3.0 修復了一個導致動態任務對映報告不正確的任務統計資訊的錯誤。統計資訊現在準確地反映了對映任務例項的數量及其狀態,從而提高了動態工作流程的可觀察性和除錯能力。

DAG 編寫增強功能

Airflow 3.0 包括一些更改,這些更改提高了 DAG 作者的一致性、清晰度和長期穩定性。

重新命名的引數:fail_stopfail_fast

為了提高畫質晰度,DAG 引數 fail_stop 已重新命名為 fail_fast。此引數控制 DAG 執行在任務失敗時是否應立即停止執行。DAG 作者應更新任何引用 fail_stop 的程式碼以使用新名稱。

上下文清理和引數刪除

幾個遺留的上下文變數已被刪除,或者在某些型別的 DAG 執行中可能不再可用,包括

  • conf

  • execution_date

  • dag_run.external_trigger

logical_date=None 的資產觸發和手動觸發的 DAG 執行中,資料間隔欄位(如 data_interval_startdata_interval_end)可能不存在於任務上下文中。DAG 作者應使用顯式引用(如 dag_run.logical_date),並在適用的情況下有條件地檢查與間隔相關的欄位是否存在。

任務上下文實用程式已移動

內部任務上下文函式(如 get_parsing_context)已移動到更合適的位置(例如,airflow.models.taskcontext)。直接使用這些實用程式的 DAG 作者應相應地更新匯入路徑。

觸發規則限制

TriggerRule.ALWAYS 規則不能再與拆卸任務或預期遵守上游依賴項語義的任務一起使用。DAG 作者應確保使用適當的觸發規則定義拆卸邏輯,以實現一致的任務解析行為。

用於可重用性的資產別名

新的實用程式函式 create_asset_aliases() 允許 DAG 作者為經常引用的資產定義可重用的別名。這提高了跨 DAG 檔案的模組化和重用,並且對於採用以資產為中心的 DAG 的團隊特別有用。

支援 ML 和 AI 用例 (AIP-83)

Airflow 3.0 透過刪除每個 DAG 執行必須對應於唯一資料間隔的約束來擴充套件可以表示的 DAG 型別。AIP-83 中引入的此更改支援不按固定計劃執行的工作流程,例如模型訓練、超引數調整和推理任務。

這些面向 ML 和 AI 的 DAG 通常即席執行,由外部系統觸發,或者需要在同一資料集上使用不同的引數多次執行。透過允許使用 logical_date=None 的多個 DAG 執行,Airflow 現在原生支援這些場景,而無需任何解決方法。

配置和介面更改

Airflow 3.0 引入了幾個配置和介面更新,這些更新提高了核心實用程式的一致性、明確了所有權,並刪除了不再與現代使用模式對齊的遺留行為。

預設值處理

Airflow 不再靜默更新保留已棄用預設值的配置選項。現在,使用者需要顯式設定任何與當前預設值不同的配置值。此更改提高了透明度,並防止了升級期間的意外行為更改。

重構的配置預設值

Airflow 3.0 中更改了幾個配置預設值,以更好地反映現代使用模式。

  • catchup_by_default 的預設值現在為 False。除非明確配置,否則 DAG 將不會回填錯過的間隔。

  • create_cron_data_intervals 的預設值現在為 False。現在使用 CronTriggerTimetable 而不是舊的 CronDataIntervalTimetable 來解釋 Cron 表示式。此更改簡化了間隔邏輯,並與 Airflow 排程系統的未來方向保持一致。

重構的內部實用程式

幾個核心元件已移動到更直觀或更穩定的位置。

  • SecretsMasker 類已重新定位到 airflow.utils.secrets_masker

  • 先前位於 airflow.io 下的 ObjectStoragePath 實用程式現在可以透過 airflow.utils.object_storage_path 獲得。

這些更改簡化了匯入,並反映了在整個 Airflow 程式碼庫中穩定實用程式介面的更廣泛努力。

改進的 inlet_eventsoutlet_eventstriggering_asset_events

任務上下文中的資產事件對映已得到改進,以更好地支援資產用例,包括 AIP-74 中引入的新功能。

現在直接透過具體物件訪問資產或資產別名的事件,以避免歧義。不再支援使用 str 訪問事件。使用 AssetAssetAlias 物件,或 Asset.ref 來顯式引用實體,例如

outlet_events[Asset.ref(name="myasset")]  # Get events for asset named "myasset".
outlet_events[AssetAlias(name="myalias")]  # Get events for asset alias named "myalias".

或者,添加了兩個輔助函式 for_assetfor_asset_alias 作為快捷方式

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".

資產事件觸發器的內部表示現在還包括一個顯式的 uri 欄位,從而簡化了可追溯性,並與 Airflow 3.0 中引入的更廣泛的資產感知執行模型保持一致。直接與 inlet_events 互動的 DAG 作者可能需要更新假設先前結構的邏輯。

xcom_pull 中的行為變更

拉取時不設定 ``task_ids``:

在 Airflow 2 中,xcom_pull() 方法允許透過鍵拉取 XComs,而無需指定 task_ids,儘管底層 DB 模型將 task_id 定義為 XCom 主鍵的一部分。這造成了歧義:如果兩個任務推送了具有相同鍵的 XComs,xcom_pull() 將拉取碰巧排在第一個的 XComs,從而導致不可預測的行為。

Airflow 3 透過要求在按鍵拉取時指定 task_ids 來解決此不一致問題。此更改與模式定義的 XComs 的任務範圍性質保持一致,確保可預測和一致的行為。

如果 DAG 作者的 DAG 在沒有 task_ids 的情況下使用了 xcom_pull,則應更新他們的 DAG 以使用 task_ids,例如

kwargs["ti"].xcom_pull(key="key")

應更新為

kwargs["ti"].xcom_pull(task_ids="task1", key="key")

單個任務 ID 的返回型別更改:

在 Airflow 2 中,當在列表中使用帶有單個任務 ID 的 xcom_pull()(例如,task_ids=["task1"])時,它將返回一個包含一個值的 LazyXComSelectSequence 物件。 在 Airflow 3.0.0 中,此行為已更改為直接返回該值。

因此,如果您之前使用過

xcom_values = kwargs["ti"].xcom_pull(task_ids=["task1"], key="key")
xcom_value = xcom_values[0]  # Access the first value

現在您將直接獲得該值,而不是包含一個值的序列。

xcom_value = kwargs["ti"].xcom_pull(task_ids=["task1"], key="key")

先前的行為(傳遞列表時返回列表)將在 Airflow 3.0.1 中恢復,以保持向後相容性。

但是,建議在使用 task_ids 時明確您的意圖(在 3.0.1 中的修復之後)

  • 如果您想要單個值,請使用 task_ids="task1"

  • 如果您想要一個序列,請使用 task_ids=["task1"]

這使得程式碼更加明確和易於理解。

刪除的配置鍵

作為棄用清理的一部分,已刪除幾個舊的配置選項。這些選項包括

  • scheduler.allow_trigger_in_future

  • scheduler.use_job_schedule

  • scheduler.use_local_tz

使用者應檢視他們的 airflow.cfg 檔案或使用 airflow config lint 命令來識別過時或已刪除的選項。

升級工具

Airflow 3.0 包括對升級驗證的改進支援。使用以下工具主動捕獲不相容的配置或已棄用的使用模式。

  • airflow config lint:標識已刪除或無效的配置鍵

  • ruff check --select AIR30:標記已刪除的介面和常見的遷移問題

CLI & API 更改

Airflow 3.0 引入了對 CLI 和 REST API 介面的更改,以更好地與面向服務的部署和事件驅動的工作流保持一致。

拆分 CLI 架構 (AIP-81)

Airflow CLI 已拆分為兩個不同的介面

  • 核心 airflow CLI 現在僅處理本地功能(例如,airflow tasks test, airflow dags list)。

  • 遠端功能,包括觸發 DAG 或管理服務模式環境中的連線,現在由一個單獨的 CLI airflowctl 處理,該 CLI 透過 apache-airflow-client 包分發。

此更改提高了在分散式或 API 優先的上下文中使用 Airflow 的部署的安全性和模組化。

REST API:已更新 DAG 觸發行為

POST /dags/{dag_id}/dagRuns 端點的行為已更改。如果在透過 REST API 觸發 DAG 時未顯式提供 logical_date,則現在預設為 None

這與 Airflow 3.0 中的事件驅動 DAG 和手動執行保持一致,但可能會破壞與先前依賴 Airflow 自動生成帶時間戳的 logical_date 的指令碼或工具的向後相容性。

刪除的 CLI 標誌和命令

在早期版本中標記為要刪除的幾個已棄用的 CLI 引數和命令現在已在 Airflow 3.0 中清理。請參閱棄用和刪除部分或執行 airflow --help 以檢視當前可用的命令和引數集。

Provider 重構和標準化

Airflow 3.0 完成了將幾個核心運算子、感測器和鉤子遷移到新的 apache-airflow-providers-standard 包中。此包現在包括常用的元件,例如

  • PythonOperator

  • BashOperator

  • EmailOperator

  • SimpleHttpOperator

  • ShortCircuitOperator

這些運算子以前捆綁在 airflow-core 中,但現在被視為 provider 管理的元件,以提高模組化、可測試性和生命週期獨立性。

此更改使 provider 之間的版本控制更加一致,併為 Airflow 的未來做好準備,屆時所有整合(包括“標準”整合)都將遵循相同的介面模型。

為了保持與現有 DAG 的相容性,apache-airflow-providers-standard 包可以在 Airflow 2.x 和 3.x 上安裝。鼓勵從 Airflow 2.x 升級的使用者提前開始更新匯入路徑並測試 provider 安裝。

舊的匯入(例如 airflow.operators.python.PythonOperator)已被棄用,並將很快被刪除。它們應替換為

from airflow.providers.standard.operators.python import PythonOperator

UI & 可用性改進

Airflow 3.0 引入了現代化的使用者體驗,以補充新的基於 React 的 UI 架構(請參閱重大更改)。介面的幾個區域已得到增強,以提高可見性、一致性和可導航性。

新主頁

Airflow 主頁現在提供了環境的高階操作概述。它包括核心元件(排程器、觸發器、DAG 處理器)的執行狀況檢查、DAG 和任務例項狀態的摘要統計資訊以及資產觸發事件的即時饋送。此檢視可幫助使用者快速識別管道執行狀況、近期活動和潛在故障。

統一的 DAG 列表檢視

DAG 列表頁面已更新為更清晰的佈局和改進的響應能力。使用者可以按名稱、標籤或所有者瀏覽 DAG。雖然尚未整合全文搜尋,但已改進過濾器和導航,以提高大型部署中的清晰度。

版本感知的圖形和網格檢視

圖形和網格檢視現在在執行時使用的 DAG 版本的上下文中顯示任務資訊。這提高了隨時間推移而演變的 DAG 的可追溯性,併為歷史執行提供更準確的除錯。

擴充套件的 DAG 圖形視覺化

圖形檢視現在支援視覺化資產和任務依賴關係的完整鏈,包括跨 DAG 邊界使用或生成的資產。這允許使用者在統一檢視中檢查上游和下游沿襲,從而更容易跟蹤資料流、除錯觸發行為以及瞭解資產和任務之間的條件依賴關係。

DAG 程式碼檢視

“程式碼”選項卡現在顯示排程程式為所選 DAG 版本解析的精確 DAG 原始碼。這允許使用者檢查已執行的精確程式碼,即使對於歷史執行也是如此,並有助於除錯與版本化 DAG 更改相關的問題。

改進的任務日誌訪問

任務日誌訪問已在各個檢視中得到簡化。現在可以從網格和任務例項頁面更輕鬆地訪問日誌,格式更清晰,視覺干擾更少。

增強的資產和回填檢視

新的 UI 元件支援以資產為中心的 DAG 和回填工作流程

  • 現在可以從 DAG 詳情頁面檢視資產定義,從而允許使用者檢查上游和下游資產關係。

  • 可以直接從 UI 觸發和監控回填,包括對 Airflow 3.0 中引入的排程器管理的回填的支援。

這些改進使 Airflow 更容易被操作員、資料工程師和跨基於時間和事件驅動的工作流程工作的利益相關者訪問。

棄用和移除

Airflow 3.0 中刪除了一些已棄用的特性、模組和介面,完成了長期存在的遷移和清理。

鼓勵使用者檢視以下刪除項以確保相容性

  • 已完全刪除 SubDag 支援,包括 SubDagOperator、相關的 CLI 和 API 介面。TaskGroup 現在是巢狀 DAG 結構的推薦替代方案。

  • 已刪除 SLA:已刪除舊版 SLA 功能,包括 SLA 回撥和指標。計劃在未來版本的 Airflow 中提供更靈活的替代機制 DeadlineAlerts。依賴於基於 SLA 的通知的使用者應考慮使用任務級別的成功/失敗鉤子或外部監控整合來實現自定義警報。

  • 已刪除 Pickling 支援:與 DAG pickling 相關的所有舊版功能都已完全刪除。 這包括 PickleDag CLI/API,以及圍繞 store_serialized_dags = False 的隱式行為。 現在必須使用基於 JSON 的序列化系統來序列化 DAG。 確保 DAG 中使用的任何自定義 Python 物件都是 JSON 可序列化的。

  • 上下文引數清理:已從任務執行上下文中刪除幾個以前可用的上下文變數,包括 confexecution_datedag_run.external_trigger。 這些值要麼不再適用,要麼已重新命名(例如,使用 dag_run.logical_date 而不是 execution_date)。 DAG 作者應確保模板化欄位和 Python 可呼叫物件不引用這些已棄用的鍵。

  • 已完全刪除已棄用的核心匯入。任何使用 airflow.operators.*airflow.hooks.* 或類似舊版匯入路徑的情況都應更新為從其各自的提供程式匯入。

  • 配置清理:已刪除幾個舊版配置選項,包括

    • scheduler.allow_trigger_in_future:DAG 執行不再可以使用未來的邏輯日期觸發。請改用 logical_date=None

    • scheduler.use_job_schedulescheduler.use_local_tz 也已被刪除。這些選項已被棄用,並且不再具有任何作用。

  • 已刪除已棄用的實用程式方法,例如 airflow.utils.helpersairflow.utils.process_utilsairflow.utils.timezone 中的方法。現在可以在標準 Python 庫或 Airflow 提供程式模組中找到等效的功能。

  • 刪除了已棄用的 CLI 標誌和行為:已清理在早期版本中標記為刪除的幾個 CLI 入口點和引數。

為了協助升級,諸如 ruff(例如,規則 AIR302)和 airflow config lint 之類的工具可以幫助識別過時的匯入和配置鍵。 建議使用這些實用程式來查詢和解決遷移期間常見的不相容性問題。 有關更多資訊,請參閱升級指南

已刪除功能的摘要

下表總結了 3.0 中刪除的面向使用者的功能及其推薦的替代方案。 並非所有這些都在上面單獨列出。

功能

替代方案/說明

SubDagOperator / SubDAG

使用 TaskGroups

SLA 回撥/指標

截止日期警報(計劃在 3.0 之後)

DAG Pickling

使用 JSON 序列化;不再支援 pickling

Xcom Pickling

使用自定義 Xcom 後端;不再支援 pickling

execution_date 上下文變數

使用 dag_run.logical_date

confdag_run.external_trigger

已從上下文中刪除;使用 DAG 引數或 dag_run API

核心 EmailOperator

使用來自 smtp 提供程式的 EmailOperator

none_failed_or_skipped 規則

使用 none_failed_min_one_success

dummy 觸發規則

使用 always

fail_stop 引數

使用 fail_fast

store_serialized_dags=False

DAG 始終被序列化;配置無效

已棄用的核心匯入

從相應的提供程式包匯入

DebugExecutor

使用 LocalExecutor 進行測試

.airflowignore 正則表示式

預設情況下使用 glob 語法

遷移工具和升級過程

Airflow 3 的設計考慮了遷移。許多 Airflow 2 DAG 無需更改即可工作,尤其是在早期版本中已解決棄用警告的情況下。為了支援升級,Airflow 3 包括驗證工具,例如 ruffairflow config update,以及簡化的啟動模型。

有關分步升級過程,請參閱升級指南

最低支援版本

要升級到 Airflow 3.0,您必須執行 Airflow 2.7 或更高版本

Airflow 3.0 支援以下 Python 版本

  • Python 3.9

  • Python 3.10

  • Python 3.11

  • Python 3.12

由於架構更改和更新的依賴關係要求,不支援更早版本的 Airflow 或 Python。

DAG 相容性檢查

Airflow 現在包含一個基於 Ruff 的 linter,其中包含自定義規則,用於檢測不再與 Airflow 3.0 相容的 DAG 模式和介面。 這些檢查打包在 AIR30x 規則系列下。 用法示例

ruff check dags/ --select AIR301
ruff check dags/ --select AIR301 --fix

這些檢查可以自動修復許多常見問題,例如重新命名的引數、刪除的匯入或舊版上下文變數用法。

配置遷移

Airflow 3.0 引入了一個新實用程式來驗證和升級您的 Airflow 配置檔案

airflow config update
airflow config update --fix

此實用程式檢測已刪除或已棄用的配置選項,如果需要,可以就地更新它們。

可以透過以下方式獲得其他驗證

airflow config lint

此命令會顯示過時的配置鍵,並幫助您使環境與 Airflow 3.0 要求保持一致。

元資料資料庫升級

與之前的重大版本一樣,Airflow 3.0 升級包括對元資料資料庫的架構更改。 在升級之前,強烈建議您備份資料庫並選擇執行

airflow db clean

以刪除舊的任務例項、日誌或 XCom 資料。要應用新架構

airflow db migrate

啟動行為更改

現在顯式啟動 Airflow 元件。 例如

airflow api-server        # Replaces airflow webserver
airflow dag-processor     # Required in all environments

這些更改反映了 Airflow 的新型面向服務的架構。

資源

Airflow 3.0 代表了數百名貢獻者和數十個組織一年多的合作成果。 我們感謝每個人透過設計討論、程式碼貢獻、測試、文件和社群反饋來幫助塑造此版本。 有關完整詳細資訊、遷移指南和升級最佳實踐,請參閱官方升級指南,並加入 Airflow 開發和使用者郵件列表中的對話。

Airflow 2.10.5 (2025-02-10)

重大更改

確保在 DAG 執行設定為失敗時執行清理任務 (#45530)

以前,當 DAG 執行被手動設定為“失敗”或“成功”狀態時,終端狀態設定為所有任務。但是,這對於定義了 setup- 和 teardown 任務的情況存在差距:如果 teardown 用於清理基礎設施或其他資源,它們也會被跳過,因此資源可能會保持分配狀態。

從現在開始,如果在之前執行了 setup 任務,並且 DAG 被手動設定為“失敗”或“成功”,則執行 teardown 任務。 如果 setup 也被跳過,則 teardown 任務將被跳過。

副作用是,如果 DAG 包含 teardown 任務,則手動將 DAG 標記為“失敗”或“成功”將需要保持 DAG 處於執行狀態,以確保計劃 teardown 任務。 如果 DAG 直接設定為“失敗”或“成功”,則不會計劃它們。

錯誤修復

  • 防止在裸任務中的任務生成的對映中使用 trigger_rule=TriggerRule.ALWAYS (#44751)

  • 修復 ShortCircuitOperator 對映的任務 (#44912)

  • 修復在對映的任務組中提前評估具有某些觸發規則(例如 ONE_DONE)的任務 (#44937)

  • 修復 BaseOperator 中的 task_id 驗證 (#44938) (#44938)

  • 允許從 API 中獲取帶有正斜槓的 XCom 並在 UI 中對其進行轉義 (#45134)

  • 修復 FileTaskHandler 僅從預設執行程式讀取 (#46000)

  • 修復日誌的空任務例項 (#45702) (#45703)

  • 在執行 TaskFlow virtualenv 任務之前刪除 skip_ifrun_if 裝飾器 (#41832) (#45680)

  • 修復事件日誌中 json 請求的請求正文 (#45546) (#45560)

  • 確保在 DAG 執行設定為失敗時執行清理任務 (#45530) (#45581)

  • 在任務執行後,不要在 TI 更新時更新 DR (#45348)

  • 修復具有 None 預設值的物件和陣列 DAG 引數 (#45313) (#45315)

  • 修復無限迴圈的感測器重新排程 (#45224) (#45250)

  • 在 SQLAlchemy 的擴充套件 JSON 型別裝飾器中評估 None (#45119) (#45120)

  • 允許透過 rendered_map_index 過濾動態任務 (#45109) (#45122)

  • 處理清理 URL 時的相對路徑 (#41995) (#45080)

  • 在登入表單上設定自動完成關閉 (#44929) (#44940)

  • 新增 Webserver 引數 max_form_parts, max_form_memory_size (#46243) (#45749)

  • 修復了在 BaseOperators execute 安全機制中訪問執行緒區域性變數的問題 (#44646) (#46280)

  • 將 map_index 引數新增到 extra links API (#46337)

其他

  • 添加發送 SIGTERMs 時的回溯日誌輸出 (#44880) (#45077)

  • 刪除了 Operators 指定其自身“排程依賴”的能力 (#45713) (#45742)

  • 棄用 Task Context 中的 conf (#44993)

Airflow 2.10.4 (2024-12-16)

重大更改

TaskInstance priority_weight 被限制在 32 位有符號整數範圍內 (#43611)

某些資料庫引擎僅限於 32 位整數值。由於某些使用者報告了權重滾動到負值的錯誤,我們決定將該值限制為 32 位整數。即使在 python 內部支援小於或大於 64 位的數值,priority_weight 也被限制,並且僅儲存 -2147483648 到 2147483647 的值。

Bug 修復

  • 修復失敗任務自動重試後動態對映任務的統計資訊 (#44300)

  • 修復過濾後日志中多行訊息的錯誤顯示 (#44457)

  • 允許 metrics validator 中使用“/” (#42934) (#44515)

  • 修復甘特圖閃爍問題 (#44488) (#44517)

  • 修復無法從連線表單中刪除欄位的問題 (#40421) (#44442)

  • 對部分任務匯入而不是執行檢查 pool_slots (#39724) (#42693)

  • 避免按動態對映任務的 try_number 對任務例項統計資訊進行分組 (#44300) (#44319)

  • 當任務卡在排隊狀態時重新排隊任務 (#43520) (#44158)

  • 抑制檢查敏感值時的警告 (#44148) (#44167)

  • 修復 get_task_instance_try_details 以返回適當的模式 (#43830) (#44133)

  • 日誌訊息源詳細資訊已分組 (#43681) (#44070)

  • 修復 UI 中任務嘗試的重複 (#43891) (#43950)

  • 在 OpenAPI 規範中新增正確的 mime-type (#43879) (#43901)

  • 如果連結為空或為空,則停用額外的連結按鈕 (#43844) (#43851)

  • 停用按 execution_date 排序 XCom 列表 (#43680) (#43696)

  • 修復 venv numpy 示例,它至少需要 1.26 才能在 Python 3.12 中工作 (#43659)

  • 修復對映任務中的嘗試選擇器,也包括索引 0 (#43590) (#43591)

  • 防止在動態對映任務中使用 trigger_rule="always" (#43810)

  • 防止在裸任務中的任務生成的對映中使用 trigger_rule=TriggerRule.ALWAYS (#44751)

僅文件更改

  • 更新有關容器/helm 的 XCom 文件 (#44570) (#44573)

其他

  • 當透過 str 訪問 inlet 或 outlet 事件時,引發棄用警告 (#43922)

Airflow 2.10.3 (2024-11-05)

重大更改

沒有重大更改。

Bug 修復

  • 改進了設定 Airflow 變數時對值掩碼的處理,以增強安全性。 (#43123) (#43278)

  • 添加了對 task_instance_mutation_hook 的支援,以處理索引為 0 的對映運算子。 (#42661) (#43089)

  • 修復了執行器清理,以在任務例項終止時正確處理殭屍任務。 (#43065)

  • 在內部 API 呼叫中添加了針對 HTTP 502 和 504 錯誤的重試邏輯,以處理 webserver 啟動問題。 (#42994) (#43044)

  • 恢復使用單獨的會話來寫入和刪除 RTIF 資料,以防止 StaleDataError。 (#42928) (#43012)

  • 透過在 DAG 名稱中將連字元替換為下劃線來修復 PythonOperator 錯誤。 (#42993)

  • 改進了任務重試的驗證,以處理 None 值 (#42532) (#42915)

  • 修復了將資料集別名解析為新資料集時資料集管理器中的錯誤處理 (#42733)

  • 啟用在 DAG 圖形檢視中單擊任務名稱以正確選擇相應的任務。 (#38782) (#42697)

  • 防止在 /home 上使用標籤/上次執行過濾器時出現重定向迴圈 (#42607) (#42609) (#42628)

  • 支援 OTEL 指標中的 host.name 以及在指標中使用 OTEL_RESOURCE_ATTRIBUTES (#42428) (#42604)

  • 透過降低對比度和飽和度來減少暗模式下的眼睛疲勞 (#42567) (#42583)

  • 正確處理觸發器表單中的 ENTER 鍵並允許手動 JSON (#42525) (#42535)

  • 確保 DAG 觸發器表單在鍵盤提交時使用更新的引數進行提交 (#42487) (#42499)

  • 如果啟用了 pickling,則不要嘗試透過 xcom 將非 stringified 物件提供給 UI (#42388) (#42486)

  • 修復任務例項的 span 連結以指向 scheduler_job_loop 中正確的 span (#42430) (#42480)

  • 修復 Windows 中 runner 執行任務的問題 (#42426) (#42478)

  • 允許使用環境變數覆蓋硬編碼的 OTEL_SERVICE_NAME (#42242) (#42441)

  • 透過使用 selectinload 而不是 joinedload 來提高觸發器效能 (#40487) (#42351)

  • 在遮蔽敏感配置時抑制警告 (#43335) (#43337)

  • 遮蔽與 DAG 作者無關的配置值 (#43040) (#43336)

  • 在 BashOperator 中將模板化的 bash 指令碼作為檔案執行 (#43191)

  • 修復了 schedule_downstream_tasks 以包含 one_success 觸發規則的上游任務 (#42582) (#43299)

  • 在排程程式中新增重試邏輯,以在死鎖的情況下更新觸發器超時。 (#41429) (#42651)

  • 手動使 dag_run 失敗時,將所有任務標記為跳過 (#43572)

  • 修復日誌和詳細資訊網格面板中對映任務的 TrySelector (#43566)

  • 在處理執行器事件時有條件地新增 OTEL 事件 (#43558) (#43567)

  • 修復損壞的統計資料 scheduler_loop_duration (#42886) (#43544)

  • 確保 /api/v1/dags 中的 total_entries (#43377) (#43429)

  • 在 List task instances (batch) 端點的請求正文模式中包含 limit 和 offset (#43479)

  • 當從擴充套件運算子呼叫 execute 時,不要在 ExecutorSafeguard 中引發警告 (#42849) (#43577)

其他

  • 棄用會話身份驗證後端 (#42911)

  • 刪除了 Airflow 版本 2.8.0 及更高版本的 providers 的 unicodecsv 依賴項 (#42765) (#42970)

  • 從 Webserver 中刪除對 Scarf 的引用 (#42901) (#42942)

  • 將 /airflow/www 中的 dompurify 從 2.2.9 提升到 2.5.6 (#42263) (#42270)

  • 更正 _get_template_context 中的文件字串格式 (#42244) (#42272)

  • 向後移植: 將 Flask-AppBuilder 提升到 4.5.2 (#43309) (#43318)

  • 檢查用於安裝 pre-commit venvs 的 python 版本 (#43282) (#43310)

  • 解決資料集別名遷移中的警告 (#43425)

僅文件更改

  • 透過 DAG 作者闡明 PLUGINS_FOLDER 許可權 (#43022) (#43029)

  • 將模板資訊新增到 TaskFlow 教程 (#42992)

  • Airflow 本地設定不再可從 dags 資料夾匯入 (#42231) (#42603)

  • 修復 cpu 和記憶體使用情況的文件 (#42147) (#42256)

  • 修復 docker compose 的說明 (#43119) (#43321)

  • 更新文件以反映返回的是 dag_warnings 而不是 import_errors。 (#42858) (#42888)

Airflow 2.10.2 (2024-09-18)

重大更改

沒有重大更改。

Bug 修復

  • 恢復“修復:如果 dags 資料夾更改,DAG 不會被標記為過期” (#42220, #42217)

  • 新增缺少的 open telemetry span 並更正計劃的插槽文件 (#41985)

  • 修復 require_confirmation_dag_change (#42063) (#42211)

  • 僅在呈現 XComEntry 時將 null/undefined 視為 falsy (#42199) (#42213)

  • 新增 extra 和 renderedTemplates 作為跳過 camelCasing 的鍵 (#42206) (#42208)

  • 不要 camelcase xcom 條目 (#42182) (#42187)

  • 修復列表檢視中的 task_instance 和 dag_run 連結 (#42138) (#42143)

  • 支援觸發器 UI 表單中字串型別引數的多行輸入 (#40414) (#42139)

  • 修復詳細資訊選項卡日誌 URL 檢測 (#42104) (#42114)

  • 新增新的異常型別來捕獲超時 (#42064) (#42078)

  • 重寫 DAG 到資料集/資料集別名的儲存方式 (#41987) (#42055)

  • 允許資料集別名新增多個數據集事件 (#42189) (#42247)

其他

  • 將 universal-pathlib 限制在 0.2.4 以下,因為它會破壞我們的整合 (#42101)

  • 使用 LibCST 自動修復預設的可延遲選項 (#42089)

  • 棄用 tasks list cli 命令的 --tree 標誌 (#41965)

僅文件更改

  • 更新 security_model.rst 以清除未經身份驗證的端點異常 (#42085)

  • 將有關 dataclasses 和 attrs 的註釋新增到 XComs 頁面 (#42056)

  • 改進 DAG 中 markdown 文件的文件 (#42013)

  • 新增關於監聽器可能很危險的警告 (#41968)

Airflow 2.10.1 (2024-09-05)

重大更改

沒有重大更改。

Bug 修復

  • 處理檢查缺少檔案時的示例 dags 情況 (#41874)

  • 修復“沒有角色”錯誤頁面中的登出連結 (#41845)

  • 當 end_from_trigger 為 True 時,為已完成的觸發器設定 end_date 和 duration。 (#41834)

  • 如果 DAGs 資料夾發生更改,DAGs 不會被標記為陳舊。 (#41829)

  • 修復與 FAB provider 版本 <1.3.0 的相容性。 (#41809)

  • 不要在心跳時使 LocalTaskJob 失敗。 (#41810)

  • 在外掛管理器中移除對 cgitb 的棄用警告。 (#41793)

  • 修復沒有 __name__ 的 notifier(instance) 的日誌。 (#41699)

  • 將 syspath 準備工作分解為多個階段。 (#41694)

  • 為額外的連結新增 URL 清理。 (#41680)

  • 修復 InletEventsAccessors 型別存根。 (#41607)

  • 修復當 XCom 為 INT、FLOAT、BOOL 或 NULL 時的 UI 渲染問題。 (#41605)

  • 修復 try selector 重新整理。 (#41503)

  • 不正確的嘗試次數減法導致 OTEL airflow 的無效 span id。 (#41535)

  • 新增 WebEncoder 用於觸發頁面渲染,以避免渲染失敗。 (#41485)

  • tojson 過濾器新增到 example_inlet_event_extra 示例 DAG。 (#41890)

  • 為不繼承 BaseExecutor 的執行器新增向後相容性檢查。 (#41927)

雜項

  • 在 /airflow/www 中將 webpack 從 5.76.0 升級到 5.94.0。 (#41879)

  • 在日誌中為超連結新增 rel 屬性。 (#41783)

  • 編輯連線時顯示欄位刪除警告。 (#41504)

  • 使 Scarf 使用情況報告以主版本 + 次版本顯示,計數器以 buckets 顯示。 (#41900)

  • 將 universal-pathlib 的最低版本降低到 0.2.2。 (#41943)

  • 防止 universal pathlib xcom 後端的 None 元件。 (#41938)

僅文件更改

  • 移除對 Debian bullseye 的支援。 (#41569)

  • 為使用 keycloak 進行身份驗證新增示例。 (#41791)

Airflow 2.10.0 (2024-08-15)

重大變更

基於 Scarf 的遙測:Airflow 現在收集遙測資料。 (#39510)

Airflow 集成了 Scarf 以在執行期間收集基本的使用情況資料。 部署可以透過將 [usage_data_collection]enabled 選項設定為 FalseSCARF_ANALYTICS=false 環境變數來選擇退出資料收集。

資料集不再觸發非活躍的 DAGs。 (#38891)

以前,當 DAG 暫停或移除時,傳入的資料集事件仍然會觸發它,並且當 DAG 恢復暫停或重新新增到 DAG 檔案中時,DAG 將會執行。 這已經改變了; 現在,只有在 DAG 處於活動狀態時發生的事件才能滿足 DAG 的資料集計劃。 雖然這是一個重大變更,但之前的行為被認為是 bug。

基於時間的排程的行為沒有改變,包括 DatasetOrTimeSchedule 的時間表部分。

try_number 不再在任務執行期間遞增。 (#39336)

以前,嘗試次數 (try_number) 在 worker 上任務執行開始時遞增。 這在很多方面都有問題。 首先,這意味著嘗試次數在不應該遞增的時候遞增,即從重新排程或推遲恢復時。 並且它還導致當任務尚未啟動時嘗試次數“錯誤”。 解決這兩個問題的變通方法造成了很多混亂。

現在,相反,任務執行的嘗試次數在任務被排程時確定,並且在執行中不會改變,並且永遠不會遞減。 因此,在任務執行後,觀察到的嘗試次數與任務執行時保持相同; 只有在有“新嘗試”時,嘗試次數才會再次遞增。

此更改的一個結果是,如果使用者“手動”執行任務(例如,透過直接呼叫 ti.run() 或命令列 airflow tasks run),則嘗試次數將不再遞增。 Airflow 假設任務總是在被排程程式排程後執行,因此我們不認為這是一個重大變更。

FAB 身份驗證管理器中的 /logout 端點現在受到 CSRF 保護。 (#40145)

FAB 身份驗證管理器中 /logout 端點的方法已從 GET 更改為所有現有 AuthViews(AuthDBViewAuthLDAPViewAuthOAuthViewAuthOIDViewAuthRemoteUserView)中的 POST,現在包含 CSRF 保護,以提高安全性並防止未經授權的登出。

Apache Airflow 的 OpenTelemetry 追蹤。 (#37948).

此新功能為 Apache Airflow 增加了以下能力:1) 排程程式、觸發器、執行器、處理器的 airflow 系統追蹤 2) 以 OpenTelemetry 格式部署的 DAG 執行的 DAG 執行追蹤。 以前,僅支援指標,這些指標以 OpenTelemetry 格式發出指標。 這個新功能將為使用者新增更豐富的資料,以便使用者使用 OpenTelemetry 標準來發出其追蹤資料並將其傳送到 OTLP 相容端點。

Task Flow 的裝飾器 (@skip_if, @run_if) 使應用是否跳過任務變得簡單。 (#41116)

此功能添加了一個裝飾器,使跳過任務變得簡單。

同時使用多個執行器。 (#40701)

以前稱為混合執行器,這項新功能允許 Airflow 同時使用多個執行器。 可以配置 DAG 甚至單個任務,以使用最適合其需求的特定執行器。 單個 DAG 可以包含全部使用不同執行器的任務。 有關更多詳細資訊,請參閱 Airflow 文件。 注意:此功能仍處於實驗階段。 有關更詳細的描述,請參閱執行器文件

新功能

  • AIP-61 混合執行 (AIP-61)

  • AIP-62 從 Hook Instrumentation 獲取 Lineage (AIP-62)

  • AIP-64 TaskInstance 嘗試歷史 (AIP-64)

  • AIP-44 內部 API (AIP-44)

  • 允許直接從觸發器結束任務,而無需進入 worker。 (#40084)

  • 擴充套件資料集依賴項。 (#40868)

  • 功能/新增 token 身份驗證到內部 API。 (#40899)

  • 新增 DatasetAlias 以支援動態資料集事件釋出和資料集建立。 (#40478)

  • 為 inlet_events 新增示例 DAG。 (#39893)

  • 實現 accessors 以讀取定義為 inlet 的資料集事件。 (#39367)

  • Task Flow 的裝飾器,使應用是否跳過任務變得簡單。 (#41116)

  • 新增從觸發器開始執行對動態任務對映的支援。 (#39912)

  • 將 try_number 新增到日誌表。 (#40739)

  • 在宏中添加了 ds_format_locale 方法,允許使用 Babel 本地化日期時間格式。 (#40746)

  • 新增 DatasetAlias 以支援動態資料集事件釋出和資料集建立 (#40478, #40723, #40809, #41264, #40830, #40693, #41302)

  • 使用 sentinel 在重新序列化時將 dag 標記為已移除。 (#39825)

  • 在 DAG 檔案處理統計資訊中新增最後一個數據庫查詢數的引數。 (#40323)

  • 為 Airflow UI 新增原型版本暗模式。 (#39355)

  • 新增在 dag test 中將某些任務標記為成功的的功能。 (#40010)

  • 允許使用可呼叫物件作為 template_fields。 (#37028)

  • 在主頁上過濾正在執行/失敗和活動/暫停的 dags。 (#39701)

  • 新增有關任務 CPU 和記憶體使用情況的指標。 (#39650)

  • DAG 重新解析功能的 UI 更改。 (#39636)

  • 新增基於 Scarf 的遙測。 (#39510, #41318)

  • 新增 dag 重新解析請求端點。 (#39138)

  • 從網格檢視觸發後重定向到新的 DAGRun。 (#39569)

  • 在任務例項工具提示中顯示 endDate。 (#39547)

  • 實現 accessors 以讀取定義為 inlet 的資料集事件 (#39367, #39893)

  • 在 UI 中為基於關鍵字的錯誤和警告的日誌行新增顏色。 (#39006)

  • 將 Rendered k8s pod spec 標籤新增到 ti 詳細資訊檢視。 (#39141)

  • 使審計日誌 before/after 可過濾。 (#39120)

  • 將網格摺疊操作整合到單個全屏切換中。 (#39070)

  • 實現 Metadata 以釋出執行時額外資訊。 (#38650)

  • 將執行器欄位新增到資料庫,並將引數新增到運算子。 (#38474)

  • 實現 DatasetEvent extra 的上下文訪問器。 (#38481)

  • 將資料集事件資訊新增到 dag 圖。 (#41012)

  • 新增在 dag 圖中切換資料集開/關的按鈕。 (#41200)

  • 新增 run_if & skip_if 裝飾器。 (#41116)

  • 新增 dag_stats rest api 端點。 (#41017)

  • 為 Dag 匯入錯誤新增偵聽器。 (#39739)

  • 允許 DateTimeSensorAsync、FileSensor 和 TimeSensorAsync 在動態任務對映期間從觸發器開始執行。 (#41182)

改進

  • 允許將 Dag Run 資源設定為 Dag 級別許可權:擴充套件 Dag 的 access_control 功能以允許 Dag Run 資源許可權。 (#40703)

  • 提高內部 API 的安全性和錯誤處理能力。 (#40999)

  • 資料集 UI 改進。 (#40871)

  • 將 DAG 審計日誌標籤更改為事件日誌。 (#40967)

  • 使獨立的 dag 檔案處理器在 DB 隔離模式下工作。 (#40916)

  • 僅在消費者 DAG 頁面上顯示源,僅在生產者 DAG 頁面上顯示觸發的 DAG 執行。 (#41300)

  • 更新指標名稱以允許多個執行器報告指標。 (#40778)

  • 格式化 DAG 執行計數。 (#39684)

  • 更新 renderedjson 元件的樣式。 (#40964)

  • 改進 ATTRIBUTE_REMOVED 哨兵,使用類和更多上下文 (#40920)

  • 使 XCom 顯示為 React JSON (#40640)

  • 用日誌表替換任務上下文日誌記錄器的用法 (#40867)

  • 回滾所有重試異常 (#40882) (#40883)

  • 支援渲染 ObjectStoragePath 值 (#40638)

  • 新增 try_number 和 map_index 作為日誌事件端點的引數 (#40845)

  • 分批輪換 fernet 金鑰以限制記憶體使用 (#40786)

  • 為 ‘last_num_of_db_queries’ 引數新增 gauge 指標 (#40833)

  • 將並行日誌訊息設定為警告級別以提高可見性 (#39298)

  • 為 DAG 執行的編碼新增錯誤處理 (#40222)

  • 在示例 DAG 中使用 params 代替 dag_run.conf (#40759)

  • 使用示例 DAG 載入示例外掛 (#39999)

  • 當 target_dttm 過去時,停止延遲 TimeDeltaSensorAsync 任務 (#40719)

  • 將重要的執行器日誌傳送到任務日誌 (#40468)

  • 在新標籤頁中開啟外部連結 (#40635)

  • 嘗試向渲染的模板新增 ReactJSON 檢視 (#40639)

  • 加快自定義警告的正則表示式匹配時間 (#40513)

  • 將 DAG.dataset_triggers 重構到時間表類中 (#39321)

  • 將 next_kwargs 新增到 StartTriggerArgs (#40376)

  • 改進 UI 錯誤處理 (#40350)

  • 當配置值已棄用時,刪除 CLI 中的雙重警告 (#40319)

  • 實現 XComArg concat() (#40172)

  • 添加了 get_extra_dejson 方法,其中包含巢狀引數,允許您指定是否還要反序列化巢狀的 json 字串 (#39811)

  • 將執行器欄位新增到任務例項 API (#40034)

  • 支援在 Windows 上檢查資料庫路徑的絕對性 (#40069)

  • 引入 StartTriggerArgs 並阻止排程程式中的啟動觸發器初始化 (#39585)

  • 將任務文件新增到網格檢視中的詳細資訊選項卡 (#39899)

  • 允許僅使用 Executor 的類名來指定執行器 (#40131)

  • 刪除與 try_number 相關的過時條件邏輯 (#40104)

  • 允許將任務組 ID 作為 BranchMixIn 中的分支傳遞 (#38883)

  • Javascript 連線表單會將 CodeMirror 動態應用於所有 textarea (#39812)

  • 在序列化時確定 needs_expansion (#39604)

  • 在引用表中 dag_id 列上新增索引,以加快刪除 dag 記錄的速度 (#39638)

  • 將任務失敗的依賴項新增到詳細資訊頁面 (#38449)

  • 刪除 Web 伺服器 try_number 調整 (#39623)

  • 在惰性序列中實現切片 (#39483)

  • 統一惰性資料庫序列實現 (#39426)

  • __getattr__ 新增到任務裝飾器存根 (#39425)

  • 允許將標籤傳遞給透過外掛註冊的 FAB 檢視 (#39444)

  • 嘗試使用 sqlite 進行離線遷移時,提供更簡單的錯誤訊息 (#39441)

  • 將 soft_fail 新增到 TriggerDagRunOperator (#39173)

  • 將上下文中的“資料集事件”重新命名為使用“outlet” (#39397)

  • 解決 airflow task 命令中的 RemovedIn20Warning (#39244)

  • 當資料庫隔離時,在客戶端確定 fail_stop (#39258)

  • 重構 Python 運算子/裝飾器中的 cloudpickle 支援 (#39270)

  • 更新觸發器 kwargs 遷移以指定 existing_nullable (#39361)

  • 允許任務直接從觸發器程式開始執行,而無需進入 worker (#38674)

  • 更好的 db migrate 錯誤訊息 (#39268)

  • 將 stacklevel 新增到 suppress_and_warn 警告 (#39263)

  • 支援按 dag_display_name 搜尋 (#39008)

  • 允許在 MappedInstances.tsx 中按所有欄位排序 (#38090)

  • 在指標中公開計劃任務的計數 (#38899)

  • 使用來自 sqlalchemy.ormdeclarative_base 而不是 sqlalchemy.ext.declarative (#39134)

  • 新增示例 DAG 來演示發出方法 (#38821)

  • 使 on_task_instance_failed 能夠訪問導致失敗的錯誤 (#38155)

  • 簡化資料集序列化 (#38694)

  • 向作業新增心跳恢復訊息 (#34457)

  • 刪除 TaskInstance.get_task_instance 中的 select_column 選項 (#38571)

  • 如果未從資料庫讀取 DAG,則不要在 get_dag 中建立會話 (#38553)

  • 為加密的觸發器 kwargs 新增遷移指令碼 (#38358)

  • 在 TaskInstancePydantic 上實現 render_templates (#38559)

  • 處理 _refresh_from_db 中的可選會話 (#38572)

  • 使 task_command.py 中的型別註解不那麼令人困惑 (#38561)

  • 直接使用 fetch_dagrun 以避免建立會話 (#38557)

  • output_processor 引數新增到 BashProcessor (#40843)

  • 改進資料庫隔離模式的序列化 (#41239)

  • 僅孤立非孤立資料集 (#40806)

  • 根據任務歷史記錄日期調整甘特圖寬度 (#41192)

  • 啟用圖例中大量元素的滾動 (#41187)

Bug 修復

  • 使用 LocalExecutor 執行時,修復 get_parsing_context() 的錯誤 (#40738)

  • 在檢視中顯示之前驗證提供程式文件 URL (#40933)

  • 移動匯入以使 PythonOperator 在 Windows 上工作 (#40424)

  • 修復 dataset_with_extra_from_classic_operator 示例 DAG (#40747)

  • 在更改 ti 狀態後呼叫偵聽器 on_task_instance_failed() (#41053)

  • 在 BaseSensor 中新增 never_fail (#40915)

  • 修復 DAG 沒有 start_date 時的任務 API 端點 (#40878)

  • 修復並調整 UI 網格和舊版執行的 URL 生成 (#40764)

  • 輪換 fernet 金鑰最佳化 (#40758)

  • 修復 validate_database_executor_compatibility() 呼叫中的類例項與類型別 (#40626)

  • 清理暗模式 (#40466)

  • 驗證 DAG、BaseOperator 和 TaskGroup 的 args 的預期型別 (#40269)

  • BaseSensorOperator 重新排程模式下指數退避不起作用 (#39823)

  • 本地任務作業:新增超時,避免過早殺死 on_task_instance_success 偵聽器 (#39890)

  • 將後執行日誌分組移動到異常列印後面 (#40146)

  • 修復 HA 設定中的觸發器程式競爭條件 (#38666)

  • 將觸發的或現有的 DAG 執行邏輯日期傳遞給 DagStateTrigger (#39960)

  • external_task_group_id 傳遞給 WorkflowTrigger (#39617)

  • ECS Executor:將任務設定為活動後處於 RUNNING 狀態 (#39212)

  • 僅在回填迴圈中必要時才進行心跳 (#39399)

  • 修復觸發器 kwarg 加密遷移 (#39246)

  • 修復降級時觸發器 kwargs 的解密 (#38743)

  • 修復 TriggeredDagRuns 中的錯誤連結 (#41166)

  • 將 MapIndex 傳遞給外部日誌系統的 LogLink 元件 (#41125)

  • 為 worker 任務新增 NonCachingRotatingFileHandler (#41064)

  • 在方法 resolve an optional value 中新增引數 include_xcom (#41062)

  • 清理 example_bash_decorator DAG 中的檔名 (#40949)

  • 在依賴關係圖中顯示資料集別名 (#41128)

  • 在 DAG 圖檢視中渲染資料集條件 (#41137)

  • 新增跨 dagruns 的任務持續時間圖 (#40755)

  • 為現有核心感測器新增從觸發器程式啟動執行的支援 (#41021)

  • 新增 dataset_alias 的示例 dag (#41037)

  • 新增資料集別名唯一約束並刪除錯誤的資料集別名刪除邏輯 (#41097)

  • 如果存在“資料集別名”,則將“has_outlet_datasets”設定為 true (#41091)

  • 使 HookLineageCollector 按資料集分組 (#41034)

  • 增強 start_trigger_args 序列化 (#40993)

  • 重構 BaseSensorOperator 引入 skip_policy 引數 (#40924)

  • 修復從觸發器程式檢視任務被延遲時的日誌 (#41272)

  • 重構觸發的 dag 執行 url 的替換方式 (#41259)

  • 添加了對其他 sql alchemy 會話引數的支援 (#41048)

  • 允許 TriggerDagRun failed_state 中存在空列表 (#41249)

  • 當 run_as_user 是 airflow 使用者時,清理異常處理程式 (#41241)

  • 單擊並摺疊時摺疊文件 (#41214)

  • 將 updated_at 儲存到資料庫時更新,因為 session.merge 不會觸發 on-update (#40782)

  • 修復解析 DAF 檔案時的查詢計數統計資訊 (#41149)

  • 沒有 __init__ 的運算子中的方法解析順序 (#41086)

  • 確保為空運算子遞增 try_number (#40426)

其他

  • OTel 跟蹤中刪除 Experimental 標誌 (#40874)

  • 將 packaging 版本提升到 23.0,以修復舊版 otel 的問題 (#40865)

  • 簡化 _auth_manager_is_authorized_map 函式 (#40803)

  • 在排程程式作業中使用正確的未知執行器異常 (#40700)

  • 將 D1 pydocstyle 規則新增到 pyproject.toml (#40569)

  • 在 ruff 中啟用強制執行 pydocstyle 規則 D213 (#40448, #40464)

  • 更新 Dag.test() 以在需要時與執行器一起執行 (#40205)

  • 更新 jest 和 babel 次要版本 (#40203)

  • 重構 BashOperator 和 Bash 裝飾器,以實現一致性和簡單性 (#39871)

  • 新增 AirflowInternalRuntimeError 以引發 non catchable 錯誤 (#38778)

  • ruff 版本提升 0.4.5 (#39849)

  • pytest 提升到 8.0+ (#39450)

  • 刪除有關 TI 索引的過時註釋 (#39470)

  • DagScheduleDatasetReference.dagDagModel.schedule_dataset_references 之間配置 back_populates (#39392)

  • 刪除 endpoints.py 中的棄用警告 (#39389)

  • 修復 Airflow 核心中的 SQLA 棄用 (#39211)

  • 在 SA 中直接使用類繫結屬性 (#39198, #39195)

  • 修復 TaskContextLogger 的 stacklevel (#39142)

  • 捕獲收集 DAG 期間的警告 (#39109)

  • 解決核心中的 B028 (no-explicit-stacklevel) (#39123)

  • 將模型 ImportError 重新命名為 ParseImportError 以避免與內建異常衝突 (#39116)

  • 新增選項以支援 PythonVenv/External Operator 中的 cloudpickle (#38531)

  • 禁止顯示 SubDagOperator 示例警告 (#39057)

  • 新增用於執行回撥的日誌 (#38892)

  • 使用 model_dump 而不是 dict 來序列化 Pydantic V2 模型 (#38933)

  • 加寬備忘單列以避免包裝命令 (#38888)

  • hatchling 更新到最新版本 (1.22.5) (#38780)

  • 將 uv 提升到 0.1.29 (#38758)

  • 新增在提供程式測試修復期間發現的缺失序列化 (#41252)

  • 將 /airflow/www 中的 ws 從 7.5.5 提升到 7.5.10 (#40288)

  • 改進 TriggerDagRunOperator 中 allowed/failed_states 的型別 (#39855)

僅文件變更

  • 在“如何建立自己的提供程式”頁面中新增 filesystemsdataset-uris (#40801)

  • 將 Airflow 儲存庫中的 (TM) 更正為 (R) (#40783)

  • 在示例 airflow.cfg 中將 otel_on 設定為 True (#40712)

  • 為 _AIRFLOW_PATCH_GEVENT 新增警告 (#40677)

  • 更新 Airflow 3 討論後的多團隊圖表提案 (#40671)

  • 新增更強烈的警告,說明不再支援 MSSQL 並且不再可用 (#40565)

  • 修復 howto 中具有誤導性的 mac 選單結構 (#40440)

  • 更新文件中支援的 k8s 版本 (#39878)

  • 為 Listeners 新增相容性說明 (#39544)

  • 使用新的圖形檢視更新文件示例中的邊緣標籤影像 (#38802)

  • 更新 UI 文件截圖 (#38680)

  • 新增“透過 REST API 操作排隊的 Dataset 事件”部分 (#41022)

  • 新增關於 docker compose 缺乏安全保證的資訊 (#41072)

  • 在 use params 部分新增指向示例 dags 的連結 (#41031)

  • task_idsend_email 更改為 send_email_notificationtaskflow.rst 中 (#41060)

  • 從反向代理文件中刪除不必要的 nginx 重定向規則 (#38953)

Airflow 2.9.3 (2024-07-15)

重大變更

scheduled_durationqueued_duration 的時間單位已更改 (#37936)

scheduled_durationqueued_duration 指標現在以毫秒而不是秒為單位發出。

按照慣例,所有 statsd 指標都應以毫秒為單位發出,這在例如 prometheus statsd-exporter 中是之後期望的。

對 OpenTelemetry 指標的支援不再是“實驗性的” (#40286)

自 2.7.0 版本以來,添加了對 OpenTelemetry 的實驗性支援,此後添加了修復和改進,現在我們將該功能宣佈為穩定。

Bug 修復

  • 修復日曆檢視滾動 (#40458)

  • 驗證提供程式列表檢視中 url 的提供程式描述 (#40475)

  • 修復與舊 MySQL 8.0 的相容性 (#40314)

  • 修復 dag 檔案缺失的環境中 dag (取消)暫停不起作用的問題 (#40345)

  • 傳遞給 SQLalchemy 的額外引數 (#40391)

  • 當 tag 的值為 int (job_id) 時,處理不支援的運算元 int + str (#40407)

  • 修復 TriggeredDagRunOperator 觸發連結 (#40336)

  • [webserver]update_fab_perms 新增到已棄用的配置 (#40317)

  • 將 dag run 連結從舊版圖形切換到帶有圖形選項卡的網格 (#40241)

  • file_task_handler 中的 httpx 更改為 requests (#39799)

  • 修復 venv jinja 模板中 future 註釋的匯入 (#40208)

  • 確保 DAG 引數順序與後端無關 (#40156)

  • 在 TI 批處理 API 端點中使用 join 來獲取 TI 備註 (#40028)

  • 改進字串陣列格式驗證的觸發器 UI (#39993)

  • 停用 doc_md 的 jinja2 渲染 (#40522)

  • 如果 taskinstance 狀態為 skipped,則跳過檢查子 dags 列表 (#40578)

  • 識別在日誌中解析 url 時的引號 (#40508)

僅文件變更

  • 新增關於透過環境變數傳遞金鑰的說明 (#40519)

  • 改進一些令人困惑的日誌訊息 (#40334)

  • 新增更精確的描述,說明如何遮蔽敏感欄位名稱 (#40512)

  • 新增關於升級到文件的更詳細的指導 (#40227)

  • Metrics allow_list 完整示例 (#40120)

  • 向已棄用的 api 文件新增警告,說明未應用訪問控制 (#40129)

  • 檢查本地排程程式是否存活的更簡單的命令 (#40074)

  • 新增一個說明和一個示例,闡明 DAG 級別引數的用法 (#40541)

  • 修復 dags.rst 中示例程式碼的突出顯示 (#40114)

  • 新增關於 PostgresOperator 已棄用的警告 (#40662)

  • 將 airflow 下載連結更新為基於 CDN 的連結 (#40618)

  • 修復 DatasetOrTimetable 示例的匯入語句 (#40601)

  • 進一步闡明診斷流程 (#40536)

  • 修復 PythonOperator docstring 中的引數順序 (#40122)

  • 更新 serializers.rst 以提及不支援 bytes (#40597)

其他

  • 升級構建安裝程式和依賴項 (#40177)

  • 將 /airflow/www 中的 braces 從 3.0.2 升級到 3.0.3 (#40180)

  • 升級到另一個版本的 trove-classifier(新的 CUDA 分類器)(#40564)

  • 重新命名與 airflow 概念無關的“try_number”增量 (#39317)

  • 將 trove 分類器更新為最新版本作為構建依賴項 (#40542)

  • 升級到最新版本的 hatchling 作為構建依賴項 (#40387)

  • 修復 SchedulerJobRunner._process_executor_events 中的 bug (#40563)

  • 刪除“blocked”事件的日誌記錄 (#40446)

Airflow 2.9.2 (2024-06-10)

重大變更

沒有重大更改。

Bug 修復

  • 修復導致 AirflowSecurityManagerV2 將事務留在 idle in transaction 狀態的 bug (#39935)

  • 修復 alembic 自動生成和重新命名不匹配的約束 (#39032)

  • 將 existing_nullable 新增到遷移的降級側 (#39374)

  • 修復如果使用者缺少許可權,則標記例項狀態按鈕保持停用的問題 (#37451). (#38732)

  • 在迷你排程程式中使用 SKIP LOCKED 代替 NOWAIT (#39745)

  • 從 FAB 檢視中刪除 DAG Run Add 選項 (#39881)

  • 在 API 規範中新增 max_consecutive_failed_dag_runs (#39830)

  • 修復 example_branch_operator 在 python 3.12 中失敗的問題 (#39783)

  • 當任務嘗試重試且沒有可用的遠端日誌時,也獲取已提供的日誌 (#39496)

  • 更改資料集 URI 驗證,以在 Airflow 2.9 中引發警告而不是錯誤 (#39670)

  • 可見 DAG RUN 不指向相同的 dag run id (#38365)

  • 重構 SafeDogStatsdLogger 以使用 get_validator 來啟用模式匹配 (#39370)

  • 修復安全管理器 has_access 中的自定義操作 (#39421)

  • 修復使用錯誤的引數觸發 DAG 時出現的 HTTP 500 內部伺服器錯誤 (#39409)

  • 修復 Airflow Webserver 中停用了靜態檔案快取的問題 (#39345)

  • 修復 TaskHandlerWithCustomFormatter 現在只新增一次字首 (#38502)

  • 不要在 @apply_lineage 中提供已棄用的 execution_date (#39327)

  • 將缺失的 conn_id 新增到 ObjectStoragePath 的字串表示中 (#39313)

  • 修復 sql_alchemy_engine_args 配置示例 (#38971)

  • 將 Cache-Control “no-store” 新增到所有動態生成的內容 (#39550)

其他

  • 限制 yandex 提供程式以避免 mypy 錯誤 (#39990)

  • 警告迷你排程程式故障而不是除錯 (#39760)

  • 更改 provider_info_cache 裝飾器的型別定義 (#39750)

  • BaseOperator defer 的更好型別提示 (#39742)

  • TimeSensor 和 TimeSensorAsync 中更多的型別提示 (#39696)

  • 重新引發來自嚴格資料集 URI 檢查的異常 (#39719)

  • 修復 _log_state 輔助函式的堆疊級別 (#39596)

  • 解決遷移指令碼中的 SA 警告 (#39418)

  • 刪除 dag_run 表上未使用的索引 idx_last_scheduling_decision (#39275)

僅文件變更

  • 提供有關標記 DynamicTaskMapping 的額外提示 (#39977)

  • 提高配置參考中連結/變數/其他配置的可見性 (#39916)

  • 刪除 CronDataIntervalTimetable 的“傳統”定義 (#39780)

  • 更新 plugins.rst 示例以使用 pyproject.toml 代替 setup.py (#39665)

  • 修復 pg 設定文件中的小問題 (#39628)

  • 將 Matomo 新增到跟蹤使用者活動文件 (#39611)

  • 修復 Connection.get -> Connection. get_connection_from_secrets (#39560)

  • 新增 provider 依賴項的說明 (#39512)

  • 更新 docker-compose 命令 (#39504)

  • 更新關於重啟觸發器程序的說明 (#39436)

  • 使用無效的儲存桶連結更新 S3LogLink (#39424)

  • 更新 testing_packages.rst (#38996)

  • 新增多團隊圖表 (#38861)

Airflow 2.9.1 (2024-05-03)

重大變更

Stackdriver 日誌記錄 bugfix 需要 Google provider 10.17.0 或更高版本 (#38071)

如果您使用 Stackdriver 日誌記錄,則必須使用 Google provider 版本 10.17.0 或更高版本。 Airflow 2.9.1 現在將 gcp_log_name 傳遞給 StackdriverTaskHandler 而不是 name,這將在早期 provider 版本上失敗。

這修復了一個 bug,在該 bug 中,當 Airflow 配置日誌記錄時,[logging] remove_base_log_folder 中配置的日誌名稱被覆蓋,導致任務日誌轉到錯誤的目標。

Bug 修復

  • 使任務日誌訊息包含 run_id (#39280)

  • 複製導航欄的 menu_item href (#39282)

  • 修復觸發器 kwarg 加密遷移 (#39246, #39361, #39374)

  • firefox 中的 datetime-local 輸入新增解決方法 (#39261)

  • 向 Task Instance 檢視新增 Grid 按鈕 (#39223)

  • 嘗試獲取非執行任務的 Server 端日誌,當遠端或執行器日誌不可用時 (#39177)

  • 修復了選單過濾導致的選單消失的副作用 (#39229)

  • 為任務例項的 log_url 使用網格檢視 (#39183)

  • 改進任務過濾的 UX (使用者體驗) (#39119)

  • 改進 react dag 頁面中 rendered_template 的 ux (使用者體驗) (#39122)

  • 圖形檢視的改進 (#38940)

  • 在嘗試渲染圖形之前,檢查資料集(dataset)和任務(task)是否存在 (#39069)

  • 主機名是 "redacted" 而不是 "redact"; 當沒有上下文時移除它 (#39037)

  • check_authentication 中檢查是否設定了 AUTH_ROLE_PUBLIC (#39012)

  • 移動 map_index_template 的渲染,以便在失敗的任務中,只要在失敗點之前定義了它,就可以渲染 (#38902)

  • 取消棄用 暫時取消棄用 BaseXCom.get_one 方法 (#38991)

  • CreateTableAs 自定義 SA Clause 新增 inherit_cache 屬性 (#38985)

  • 不要在迷你排程器中等待 DagRun 鎖 (#38914)

  • 修復沒有 DAG Run 的日曆檢視 (#38964)

  • 更改了圖中外部任務的背景顏色 (#38969)

  • 修復 dag run 選擇 (#38941)

  • 修復 SAWarning ‘Coercing Subquery object into a select() for use in IN()’ (#38926)

  • 修復 AirflowSecurityManagerV2 中的隱式 cartesian 乘積 (#38913)

  • 修復了舊版日誌檢視中的連結無法點選的問題 (#38882)

  • 修復 dag run 連結引數 (#38873)

  • 在 WorkflowTrigger 中使用非同步資料庫呼叫 (#38689)

  • 修復審計日誌事件過濾器 (#38719)

  • 在類方法中使用 methodtools.lru_cache 而不是 functools.lru_cache (#37757)

  • 只有在提供 -I / --ignore-first-depends-on-past 時,才在 airflow dags backfill 中引發已棄用警告 (#38676)

其他

  • TriggerDagRunOperator 棄用 execution_date,建議使用 logical_date (#39285)

  • 強制在 @deprecated 裝飾器上使用 Airflow 棄用警告類別 (#39205)

  • 新增關於在 Windows 下執行/匯入 Airflow 的警告 (#39196)

  • 更新來自身份驗證管理器的 is_authorized_custom_view 以處理自定義操作 (#39167)

  • 在 Trove 分類器中新增 Python 3.12 支援 (#39004)

  • minischeduler 跳過使用除錯級別 (#38976)

  • /airflow/www 中,將 undici5.28.3 升級到 5.28.4 (#38751)

僅文件更改

  • 修復文件中支援的 k8s 版本 (#39172)

  • 動態任務對映 PythonOperator op_kwargs (#39242)

  • 新增指向 userrole 命令的連結 (#39224)

  • 在文件中將 k8s 1.29 新增到支援的版本 (#39168)

  • 資料感知排程文件編輯 (#38687)

  • 更新 DagBag 類文件字串以包含所有引數 (#38814)

  • 更正 taskflow 示例 (#39015)

  • 從渲染欄位示例中刪除裝飾器 (#38827)

Airflow 2.9.0 (2024-04-08)

重大變更

以下 Listener API 方法被認為是穩定的,可以用於生產系統(在較舊的 Airflow 版本中是實驗性功能)(#36376):

生命週期事件

  • on_starting

  • before_stopping

DagRun 狀態更改事件

  • on_dag_run_running

  • on_dag_run_success

  • on_dag_run_failed

TaskInstance 狀態更改事件

  • on_task_instance_running

  • on_task_instance_success

  • on_task_instance_failed

已刪除對 Airflow Meta Database 的 Microsoft SQL-Server 的支援 (#36514)

經過 討論投票 過程後,Airflow 的 PMC 成員和提交者已達成決議,不再維護 MsSQL 作為受支援的資料庫後端。

從 Airflow 2.9.0 開始,已刪除對 Airflow 資料庫後端的 MsSQL 的支援。

在升級到 Airflow 2.9.0 *之前*,可以幫助遷移資料庫的遷移指令碼可在 Github 上的 airflow-mssql-migration 倉庫 中找到。 請注意,遷移指令碼不提供支援和保證。

這不會影響現有的提供程式包(operators 和 hooks),DAG 仍然可以訪問和處理來自 MsSQL 的資料。

現在輸入時會驗證資料集 URI (#37005)

資料集必須使用符合 AIP-60 中規定的規則的 URI,並且在解析 DAG 檔案時,該值將自動標準化。 有關規則的更詳細說明,請參閱 關於資料集的文件

如果你的資料集識別符號看起來像 URI,但以不太主流的方式使用(例如依賴於 URI 的身份驗證部分或具有區分大小寫的協議名稱),則可能需要更改它們。

BaseAuthManager 中的方法 get_permitted_menu_items 已重新命名為 filter_permitted_menu_items (#37627)

將 REST API 操作新增到審計日誌事件 (#37734)

REST API 事件的審計日誌 event 名稱將以 api.ui. 開頭,具體取決於它來自 Airflow UI 還是外部。

正式支援 Python 3.12 (#38025)

不過,有一些注意事項

  • Pendulum2 不支援 Python 3.12。 對於 Python 3.12,你需要使用 Pendulum 3

  • 對於 Python 3.12,安裝了 Pandas 時支援的最低 SQLAlchemy 版本是 1.4.36,於 2022 年 4 月釋出。 Airflow 2.9.0 將所有 Python 版本的 SQLAlchemy 的最低支援版本提高到 1.4.36

並非所有提供程式都支援 Python 3.12。 在 Airflow 2.9.0 的初始版本中,以下提供程式未釋出對 Python 3.12 的支援

防止將大型字串物件儲存在渲染的模板欄位中 (#38094)

現在,可以儲存在渲染的模板欄位中的資料長度受到限制。 該限制設定為 4096 個字元。 如果資料超過此限制,將被截斷。 你可以透過在 Airflow 配置中設定 [core]max_template_field_length 配置選項來更改此限制。

將 xcom 表列 value 型別更改為 MySQL 後端的 longblob (#38401)

Xcom 表列 value 型別已從 blob 更改為 longblob。 這將允許你在 Xcom 中儲存相對較大的資料,但是如果你在 Xcom 中儲存了大量大型資料,則處理可能需要大量時間。

要從修訂版本 b4078ac230a1 降級,請確保你的 Xcom 值不大於 65,535 位元組。 否則,你需要清理這些行或執行 airflow db clean xcom 來清理 Xcom 表。

對 taskflow 上下文變數中的 key 引數預設值進行更嚴格的驗證 (#38015)

對於任務流實現,當上下文變數存在預設值時,可能會生成無效的引數順序。現在不再接受(並且已驗證)使用非 None 的預設值定義任務流函式。如果之前您這樣做過,您很可能會看到一個損壞的 DAG,以及一個類似 Error message: Context key parameter my_param can't have a default other than None 的錯誤訊息。

新特性

  • 允許使用者使用其本國字元編寫 dag_id 和 task_id,為 DAG/任務新增顯示名稱 (v2) (#38446)

  • 防止將大型物件儲存在 RTIF 中 (#38094)

  • 當結束日期不存在時,使用當前時間計算持續時間。 (#38375)

  • 在任務和 DAG 執行持續時間圖表中新增平均持續時間標記線。 (#38214, #38434)

  • 新增手動建立資料集事件的按鈕 (#38305)

  • 新增 Matomo 作為 analytics_tool 的一個選項。 (#38221)

  • 實驗性功能:支援自定義 weight_rule 實現來計算 TI 的 priority_weight (#38222)

  • 新增在 DAG 連續失敗 X 次後自動將其關閉的功能 (#36935)

  • 向下一個執行資料集模態框新增資料集條件 (#38123)

  • 向 UI 新增任務日誌分組 (#38021)

  • 向網格 DAG 詳細資訊新增 dataset_expression (#38121)

  • 引入支援多個執行器配置的機制 (#37635)

  • 為任務執行日誌中的 ANSI 字元新增顏色格式 (#37985)

  • 將 dataset_expression 作為 DagModel 和 DAGDetailSchema 的一部分新增 (#37826)

  • 允許更長的 rendered_map_index (#37798)

  • 為 DatasetOrTimeSchedule 繼承 DatasetTriggeredTimetable 的 run_ordering (#37775)

  • 實現 AIP-60 資料集 URI 格式 (#37005)

  • 為資料集條件邏輯引入邏輯運算子 (#37101)

  • 為資料集事件新增 post 端點 (#37570)

  • 在 UI 中顯示對映任務的自定義例項名稱 (#36797)

  • 向 get_event_logs API 新增 excluded/included events (#37641)

  • 向 DAG 圖形新增資料集 (#37604)

  • 在網格檢視中的任務/執行詳細資訊上方顯示資料集事件 (#37603)

  • 引入新的配置變數來控制 DAG 處理器是否輸出到 stdout (#37439)

  • 使 Datasets hashable (#37465)

  • 為資料集觸發新增條件邏輯 (#37016)

  • 在 react 中實現任務持續時間頁面。 (#35863)

  • 新增 queuedEvent 端點以獲取/刪除 DatasetDagRunQueue (#37176)

  • 支援 BaseOperator 中的多個 XCom 輸出 (#37297)

  • AIP-58: 為 xcom 新增物件儲存後端 (#37058)

  • 引入 DatasetOrTimeSchedule (#36710)

  • BaseOperator 新增 on_skipped_callback (#36374)

  • 允許覆蓋懸停的導航欄顏色 (#36631)

  • 建立帶有標記的新指標 (#36528)

  • 為 AFS 和 common.io 新增對 openlineage 的支援 (#36410)

  • 引入 @task.bash TaskFlow 裝飾器 (#30176, #37875)

改進

  • 為資料庫清理提供更人性化的“show tables”輸出 (#38654)

  • 透過合併 alive_triggerer_ids 和 get_sorted_triggers 查詢來改進觸發器分配_unassigned (#38664)

  • 向審計日誌新增排除/包含事件過濾器 (#38506)

  • 在除 MySQL 之外的所有方言的單個查詢中清理未使用的觸發器 (#38663)

  • 更新對生產等敏感環境中配置更改的確認邏輯 (#38299)

  • 改進資料集圖表 UX (#38476)

  • 僅顯示上次執行之後最新的資料集事件時間戳 (#38340)

  • 新增按鈕以清除 DAG 執行中僅失敗的任務。 (#38217)

  • 刪除所有舊的 DAG 頁面並重定向到網格檢視 (#37988)

  • 在使用 sentry.add_tagging() 之前檢查任務屬性 (#37143)

  • Mysql 更改 MySQL 後端的 xcom value col 型別 (#38401)

  • ExternalPythonOperator 使用來自 sys.version_info 的版本 (#38377)

  • 將過於寬泛的異常替換到 Core 中 (#38344)

  • 為 DAG 的批次暫停和恢復新增 CLI 支援 (#38265)

  • 在 TaskInstancePydantic 和 DagRunPydantic 上實現方法 (#38295, #38302, #38303, #38297)

  • 使過濾器欄可摺疊並新增全屏切換 (#38296)

  • 加密所有觸發器屬性 (#38233, #38358, #38743)

  • 升級 react-table 包。與審計日誌表一起使用 (#38092)

  • 顯示 DAG 頁面過濾器是否處於活動狀態 (#38080)

  • 向對映例項新增嘗試次數 (#38097)

  • 向作業心跳新增重試 (#37541)

  • 向審計日誌新增 REST API 事件 (#37734)

  • 使當前工作目錄作為 BashOperator 中的模板化欄位 (#37968)

  • 向 react 新增日曆檢視 (#37909)

  • 向日志表新增 run_id 列 (#37731)

  • 向網格任務例項工具提示新增 tryNumber (#37911)

  • Session 未在 _do_render_template_fields 中使用 (#37856)

  • 改進 MappedOperator 屬性型別 (#37870)

  • 從 TaskInstancePydantic 方法中刪除 provide_session 裝飾器 (#37853)

  • 確保用於 TaskInstancePydantic 和 TaskInstance 的 “airflow.task” 日誌記錄器 (#37857)

  • 更好的內部 API 呼叫錯誤訊息 (#37852)

  • 增加 DAG 網格檢視的工具提示大小 (#37782) (#37805)

  • 使用命名日誌記錄器而不是根日誌記錄器 (#37801)

  • 在 React 中新增執行持續時間 (#37735)

  • 避免不推薦使用的日誌記錄 (#37792)

  • 改進 DateTimeTrigger 型別 (#37694)

  • 確保所有唯一的 run_ids 都呈現任務持續時間欄 (#37717)

  • 向 React 新增 DAG 審計日誌 (#37682)

  • 為自動暫停新增日誌事件 (#38243)

  • 為模板化基礎運算子欄位的異常提供更好的訊息 (#37668)

  • 清理新增到審計日誌的 Web 伺服器端點 (#37580)

  • 按 dag_id 過濾資料集圖 (#37464)

  • 使用繼承自 BaseException 的新異常型別用於 SIGTERMs (#37613)

  • 重構資料集類繼承 (#37590)

  • 簡化包版本檢查 (#37585)

  • 按關聯的 dag_ids 過濾資料集(GET /datasets)(#37512)

  • 啟用“airflow tasks test”來執行可延遲運算子 (#37542)

  • 使資料集列表/圖表寬度可調整 (#37425)

  • 加速確定 ExternalPythonOperator 中安裝的 Airflow 版本 (#37409)

  • 從 REST API 新增更多工詳細資訊 (#37394)

  • 為 DAG 執行操作新增確認對話方塊 (#35393)

  • 向 STATE_COLORS 添加了關閉顏色 (#37295)

  • 刪除舊的 DAG 詳細資訊頁面並重定向到網格 (#37232)

  • 按 API 中的地圖索引排序 XCom 條目 (#37086)

  • 在 DAG 執行建立 API 端點中新增 data_interval_start 和 data_interval_end (#36630)

  • 透過防止 HTML 注入,使任務日誌中的連結成為超連結 (#36829)

  • 改進 ExternalTaskSensor 非同步實現 (#36916)

  • 使 Datasets Pathlike (#36947)

  • 簡化孤立任務的查詢 (#36566)

  • 在 FileSensor 中新增 deferrable 引數 (#36840)

  • 執行觸發器頁面:可配置的最近配置數量 (#36878)

  • nowait 和 skip_locked 合併到 with_row_locks 中 (#36889)

  • 在 REST API 中獲取 dag/dagRun 時返回指定的欄位 (#36641)

  • 僅當為 DagFileProcessorManager 啟用除錯時才迭代這些專案 (#36761)

  • 為指標允許和阻止列表新增模糊/正則表示式模式匹配 (#36250)

  • 允許 CLI DAG 列表中的自定義列 (#35250)

  • 可以更改預設的 cron 時間表 (#34851)

  • 對 Airflow IO 程式碼的一些改進 (#36259)

  • 改進 TaskInstance 型別提示 (#36487)

  • 從身份驗證管理器介面中刪除 Connexion 的依賴關係 (#36209)

  • 重構 ExternalDagLink 以不建立臨時的 TaskInstances (#36135)

Bug 修復

  • 當 gunicorn worker 啟動時載入 providers 配置 (#38795)

  • 修復網格標題渲染 (#38720)

  • 為對映的依賴項新增任務例項依賴項 (#37498)

  • 提高 remove_task_decorator 函式的穩定性 (#38649)

  • 將 API 上更多的欄位標記為僅轉儲 (#38616)

  • 修復事件日誌端點上的 total_entries 計數 (#38625)

  • 向日志塊底部新增填充。 (#38610)

  • 正確序列化巢狀的 attrs 類 (#38591)

  • 修復下一個執行 ID 資訊中的 tz (#38482)

  • 在網格檢視中顯示廢棄的任務 (#38511)

  • 一致地應用任務例項 mutation hook (#38440)

  • 覆蓋 chakra 樣式以將 dropdowns 保留在過濾器欄中 (#38456)

  • 以秒為單位儲存持續時間,並進行縮放以處理系列中某個值具有比之前的持續時間更大的單位的情況。 (#38374)

  • 不允許上下文引數中使用 None 以外的預設值,並改進錯誤訊息 (#38015)

  • 使 postgresql 預設引擎引數符合 SA 2.0 (#38362)

  • 向觸發器中的 while 迴圈中的 yield 新增 return 語句 (#38389)

  • 確保在裝飾器上下文管理器中呼叫 __exit__ (#38383)

  • 使方法 BaseAuthManager.is_authorized_custom_view 成為抽象方法 (#37915)

  • 向上限計劃的日曆事件計算 (#38310)

  • 修復守護程式模式下的排程程式不會在指定位置建立 PID (#38117)

  • 正確序列化 TaskInstancePydantic 和 DagRunPydantic (#37855)

  • 修復圖形任務狀態邊框顏色 (#38084)

  • 添加回在安全管理器中刪除的方法 (#37997)

  • 不要將 worker serve-logs 中的“403”記錄為“未知錯誤”。 (#37933)

  • 修復 /get_logs_with_metadata 端點中的執行資料驗證錯誤 (#37756)

  • 修復任務持續時間選擇 (#37630)

  • 避免在 SQLAlchemy v2 中將 encoding 傳遞給 SQL 引擎 (#37545)

  • 修復最新 DAG 執行語句中的“隱式強制 SELECT 物件轉換為標量子查詢” (#37505)

  • 使用 max_execution_date 查詢構建器清理型別 (#36958)

  • 在單個 DAG 情況下最佳化 max_execution_date 查詢 (#33242)

  • 修復 get_dagmodel 為 None 時的 list dags 命令 (#36739)

  • 在資料集偵聽器之前,立即載入 consuming_dags 屬性 (#36247)

雜項

  • 從 UI 中刪除引數的顯示 (#38660)

  • 將 scheduled_duration 指標的日誌級別從警告更新為除錯 (#38180)

  • 使用 importlib_metadata 與 Python 3.10/3.12 stdlib 相容 (#38366)

  • 重構 BaseOperatorMeta 的 __new__ 魔術方法以避免錯誤地混合經典運算子和裝飾運算子 (#37937)

  • 使用 sys.version_info 來確定 Python Major.Minor (#38372)

  • 新增缺少的已棄用的 Fab 身份驗證管理器 (#38376)

  • 從 Airflow 包中刪除未使用的迴圈變數 (#38308)

  • 在 UI 中新增最大連續失敗 DAG 執行的資訊 (#38229)

  • 提升 blinker 的最低版本,並在需要的地方新增 (#38140)

  • 在 /airflow/www 中將 follow-redirects 從 1.15.4 升級到 1.15.6 (#38156)

  • 將 Cryptography 升級到 > 39.0.0 (#38112)

  • 新增 Python 3.12 支援 (#36755, #38025, #36595)

  • 避免在測試之外使用 assert (#37718)

  • 更新 ObjectStoragePath 以支援 universal_pathlib>=v0.2.2 (#37930)

  • 解決 G004:日誌語句使用 f-string (#37873)

  • 更新構建和安裝依賴項。 (#37910)

  • 在 /airflow/www 中將 sanitize-html 從 2.11.0 升級到 2.12.1 (#37833)

  • 更新到最新的安裝程式版本。 (#37754)

  • 棄用 airflow 設定/local_settings 中的 smtp 配置 (#37711)

  • 將 PY* 常量棄用到 airflow 模組中 (#37575)

  • 刪除對已棄用的 flask._request_ctx_stack 的使用 (#37522)

  • 刪除 airflow.__init__.py 中多餘的 login 屬性 (#37565)

  • 升級到 FAB 4.3.11 (#37233)

  • 刪除 SCHEDULED_DEPS,自 2.0.0 以來已不再使用 (#37140)

  • 在核心程式碼中將 datetime.datetime.utcnow 替換為 airflow.utils.timezone.utcnow (#35448)

  • 提升 aiohttp 的最低版本以避免 CVE-2024-23829 和 CVE-2024-23334 (#37110)

  • 將與 FAB 身份驗證管理器相關的配置移動到 FAB 提供程式 (#36232)

  • 從 Airflow 核心中刪除 MSSQL 支援 (#36514)

  • 從身份驗證管理器中刪除 is_authorized_cluster_activity (#36175)

  • 建立 FAB 提供程式並將 FAB 身份驗證管理器移動到其中 (#35926)

僅文件更改

  • 改進時間表文件 (#38505)

  • 按字母順序重新排列 OpenAPI 規範標籤 (#38717)

  • 更新文件中的 UI 螢幕截圖 (#38680, #38403, #38438, #38435)

  • 刪除該部分,因為它在資料集表示式 PR 中不再正確 (#38370)

  • 重構 DatasetOrTimeSchedule 時間表文件 (#37771)

  • 將執行器文件遷移到相應的提供程式 (#37728)

  • 新增指令以呈現 URI 方案列表 (#37700)

  • 新增包含提供程式棄用的文件頁面 (#37075)

  • 新增對安全策略的交叉引用 (#37004)

  • 改進 AIRFLOW__WEBSERVER__BASE_URL 文件 (#37003)

  • 使用(希望)更清晰的 start_date 描述更新 faq.rst (#36846)

  • 更新有關 operators 的公共介面文件 (#36767)

  • exception 新增到模板參考列表 (#36656)

  • 將身份驗證管理器介面新增為公共介面 (#36312)

  • 在 Airflow 文件中引用 fab 提供程式文件 (#36310)

  • 建立身份驗證管理器文件 (#36211)

  • 更新許可權文件 (#36120)

  • 改進 _covers_every_hour 的文件字串 (#36081)

  • 新增任務例項、dag 和生命週期監聽器是非實驗性的說明 (#36376)

Airflow 2.8.4 (2024-03-25)

重大更改

沒有重大更改。

Bug 修復

  • 修復 FixedTimezone 的錯誤序列化 (#38139)

  • 修復日誌任務處理程式的過度許可權更改 (#38164)

  • 修復任務例項列表連結 (#38096)

  • 修復排程程式心跳引數未被使用的錯誤 (#37992)

  • 新增填充以防止網格水平滾動重疊任務 (#37942)

  • 修復 ObjectStoragePath 中的雜湊快取 (#37769)

其他

  • 限制 importlib_resources,因為它會破壞 pytest_rewrites (#38095, #38139)

  • pandas 限制為 <2.2 (#37748)

  • 升級 croniter 以修復 2 月 29 日 cron 表示式的問題 (#38198)

僅文件更改

  • 告訴使用者如果他們的掃描器在影像中發現問題該怎麼辦 (#37652)

  • 新增關於使用 PyCharm 在 Docker Compose 中除錯的部分 (#37940)

  • 更新可延期文件以闡明觸發器恢復 operator 時的 kwargs (#38122)

Airflow 2.8.3 (2024-03-11)

重大更改

現在,在安裝 Airflow 時,SMTP 提供程式已預先安裝。 (#37713)

Bug 修復

  • 在身份驗證管理器中新增“MENU”許可權 (#37881)

  • 修復 external_executor_id 被覆蓋的問題 (#37784)

  • 使更多 MappedOperator 成員可修改 (#37828)

  • 在 dag 測試命令中設定解析上下文 dag_id (#37606)

其他

  • 從安全管理器中刪除無用的方法 (#37889)

  • 提高 TriggerRuleDep 的程式碼覆蓋率 (#37680)

  • 安裝 Airflow 時,SMTP 提供程式現在已預先安裝 (#37713)

  • 提升 openapi 驗證器的最低版本 (#37691)

  • 正確包含 airflow_pre_installed_providers.txt 檔案 (#37679)

僅文件更改

  • 闡明 workers 和 scheduler 之間缺乏同步 (#37913)

  • 簡化一些圍繞 airflow_local_settings 的文件 (#37835)

  • 新增關於本地設定配置的部分 (#37829)

  • 修復 BranchDayOfWeekOperator 的文件 (#37813)

  • 設計上不支援寫入金鑰儲存 (#37814)

  • ERD 生成文件改進 (#37808)

  • 更新不正確的配置值 (#37706)

  • 更新安全模型以闡明 Connection Editing 使用者的能力 (#37688)

  • 修復示例 dags 中的 ImportError (#37571)

Airflow 2.8.2 (2024-02-26)

重大更改

allowed_deserialization_classes 標誌現在遵循 glob 模式 (#36147)。

例如,如果想要將類 airflow.tests.custom_class 新增到 allowed_deserialization_classes 列表,可以透過編寫完整的類名 (airflow.tests.custom_class) 或像 glob 搜尋中使用的模式 (例如,airflow.*, airflow.tests.*) 來完成。

如果您當前使用自定義 regexp 路徑,請確保將其重寫為 glob 模式。

或者,如果您仍然希望將其作為 regexp 模式匹配,請將其新增到新的列表 allowed_deserialization_classes_regexp 下。

為了提高安全性,audit_logs 許可權已更新 (#37501)。

這是在一種策略下完成的,即我們不希望像 Viewer、Ops 和其他非 Admin 使用者訪問 audit_logs。 此更改背後的意圖是限制許可權較少的使用者檢視使用者詳細資訊,例如審計日誌中的名字、電子郵件等,而他們未被允許這樣做。

此更改的影響是,具有非管理員許可權的現有使用者將無法檢視或訪問 audit_logs,無論是從“瀏覽”選項卡還是從 DAG 執行。

AirflowTimeoutError 不再透過 Exception 預設 except (#35653)。

現在 AirflowTimeoutError 繼承 BaseException 而不是 AirflowException->``Exception``。 參見 https://docs.python.club.tw/3/library/exceptions.html#exception-hierarchy

這可以防止程式碼捕獲 Exception 意外地捕獲 AirflowTimeoutError 並繼續執行。 AirflowTimeoutError 是取消任務的明確意圖,不應在嘗試處理錯誤並返回一些預設值的過程中被捕獲。

仍然可以透過顯式 except``ing ``AirflowTimeoutErrorBaseException 來捕獲 AirflowTimeoutError。 不建議這樣做,因為它可能允許程式碼在發出此類取消請求後繼續執行。 建議之前依賴於在每次捕獲 Exception 後執行嚴格清理的程式碼使用 finally 塊或上下文管理器。 僅執行清理,然後自動重新引發異常。 請參閱關於捕獲 KeyboardInterrupt 的類似注意事項,網址為 https://docs.python.club.tw/3/library/exceptions.html#KeyboardInterrupt

Bug 修復

  • 按 last_runtime 排序 dag 處理統計資訊 (#37302)

  • 允許透過 URL 引數預先填充觸發器表單值 (#37497)

  • 用於獲取 dag 網格檢視的基本日期必須包含選定的 run_id (#34887)

  • 檢查 ImportError 的許可權 (#37468)

  • IMPORT_ERROR 從 DAG 相關許可權移動到檢視相關許可權 (#37292)

  • AirflowTaskTimeout 更改為繼承 BaseException (#35653)

  • 還原“修復了當 max_active_runs 達到其上限時,未來的 DagRun 很少被競爭條件觸發的問題。 (#31414)” (#37596)

  • 將邊距更改為內邊距,以便可以選擇第一個任務 (#37527)

  • 修復 namedtuple 的 Airflow 序列化 (#37168)

  • 修復點選 url 不安全標籤的錯誤 (#37395)

  • Treeview 函式設定確定性和新的 getter (#37162)

  • 修復日誌檔案處理程式的父資料夾的許可權 (#37310)

  • 修復指定 access_entity 時 DAG 的許可權檢查 (#37290)

  • 修復 dateTimeAttrFormat 常量的值 (#37285)

  • 解決觸發器關閉時的處理程式關閉競爭條件 (#37206)

  • 修復各種檢視的狀態圖示對齊 (#36804)

  • 刪除多餘的 @Sentry.enrich_errors (#37002)

  • 使用 execution_date= 引數作為網格檢視的基本日期的備份 (#37018)

  • 處理任務中引發的 SystemExit。 (#36986)

  • 從除管理員之外的所有使用者撤銷 audit_log 許可權 (#37501)

  • 修復 allowed_deserialization_classes 的中斷正則表示式 (#36147)

  • 修復影響 DAG 結束日期的錯誤 (#36144)

  • 根據任務名稱長度調整節點寬度 (#37254)

  • 修復:如果任何 python_callable 函式與 DAG 在同一原始檔中定義,則 PythonVirtualenvOperator 崩潰 (#37165)

  • 修復摺疊網格寬度,將選定的條與甘特圖對齊 (#37205)

  • 調整圖節點佈局 (#37207)

  • 恢復初始化配置預設值的順序 (#37155)

  • 在 TaskInstance 檢視中顯示“實際”嘗試次數 (#34635)

  • 當啟用 show_trigger_form_if_no_params 時,修復使用引數觸發 DAG 成為強制性的 Bug (#37063)

  • Secret masker 忽略包含特殊字元的密碼 (#36692)

  • 修復具有 UPSTREAM_FAILED 任務的 DagRuns 卡在回填中的問題。(#36954)

  • 停用 dryrun 自動獲取 (#36941)

  • 修復 DAG 執行配置上的複製按鈕 (#36855)

  • 修復了在 run_id 中用 + 替換空格引入的 Bug (#36877)

  • 修復瞭如果使用者未登入,Webserver 始終重定向到主頁的問題 (#36833)

  • REST API 設定 POST 到 /variables 端點的描述 (#36820)

  • 清理 conn_id 以禁止潛在的指令碼執行 (#32867)

  • 修復了任務 ID 複製按鈕複製錯誤 ID 的問題 (#34904)

  • 修復 fab provider 中的安全管理器繼承問題 (#36538)

  • 避免使用 pendulum.from_timestamp (#37160)

其他

  • 安裝最新的 docker CLI,而不是特定的版本 (#37651)

  • /airflow/www 中的 undici5.26.3 升級到 5.28.3 (#37493)

  • providers/pyproject.toml 中新增 Python 3.12 的排除項 (#37404)

  • 從核心依賴項中移除 markdown (#37396)

  • 移除未使用的 pageSize 方法。(#37319)

  • 新增 more-itertools 作為 common-sql 的依賴項 (#37359)

  • 替換其他的 Python 3.113.12 棄用 (#37478)

  • airflow_pre_installed_providers.txt 包含到 sdist 發行版中 (#37388)

  • 將 Pydantic 變為可選依賴項 (#37320)

  • 限制 universal-pathlib to < 0.2.0 (#37311)

  • 允許針對用於測試的 SQLite 記憶體資料庫執行 airflow (#37144)

  • 新增 queue_when 的描述 (#36997)

  • 更新環境變數 sql_alchemy_connect_argsconfig.yml (#36526)

  • Alembic 的最小版本升級到 1.13.1 (#36928)

  • 限制 flask-session<0.6 (#36895)

僅文件更改

  • 修復升級文件以反映可用的真實 CLI 標誌 (#37231)

  • 修復基礎文件中的一個 Bug (#37440)

  • 為已棄用的頁面新增重定向 (#37384)

  • 修復 otel 配置描述 (#37229)

  • 使用 prereqs 部分更新 Objectstore 教程 (#36983)

  • 新增關於避免使用通用 package/module 名稱的更精確的描述 (#36927)

  • 將 airflow 版本替換新增到 Docker Compose Howto (#37177)

  • 將關於 DAG 作者功能的說明新增到安全模型 (#37141)

  • 將 cron 基礎知識的文件移動到 Authoring and Scheduling 部分 (#37049)

  • 連結到升級文件中的發行說明 (#36923)

  • 自動阻止運算子的 __init__ 中的模板欄位邏輯檢查 (#33786)

Airflow 2.8.1 (2024-01-19)

重大變更

核心依賴項 pendulum 包的目標版本設定為 3 (#36281)。

對 pendulum 2.1.2 的支援將暫時保留一段時間,大概直到 Airflow 的下一個功能版本。建議儘快升級使用者程式碼以使用 pendulum 3。

Pendulum 3 引入了一些細微的不相容性,您可能在程式碼中依賴它們 - 例如,日期預設渲染中缺少渲染日期表示中的 T,這不符合 ISO8601 標準。如果您依賴於日期的預設渲染,您可能需要調整您的程式碼以使用 isoformat() 方法以 ISO8601 格式渲染日期。

Airflow 打包規範遵循現代 Python 打包標準 (#36537)。

我們標準化了 Airflow 依賴配置,透過使用 pyproject.toml 來遵循 Python 打包的最新發展。Airflow 現在符合這些已接受的 PEP:

此外,我們還實現了來自草案的多個許可證檔案支援,該草案尚未被接受(但受 hatchling 支援)PEP:* PEP 639 透過更好的包元資料提高許可證清晰度

如果使用者使用的是現代 Python 打包和開發工具,這對使用者幾乎沒有明顯的影響,一般來說,從 PyPI 安裝 Airflow 時,它的行為應該和以前一樣,並且使用 pip install -e ".[devel]" 以開發目的安裝它應該容易得多。

從使用者角度來看,差異是

  • Airflow 的 extras 現在獲得的 extras 規範化為 -(遵循 PEP-685)而不是 _.(就像以前在某些 extras 中一樣)。當您使用此類 extras 安裝 airflow(例如 dbt.coreall_dbs)時,您應該使用 - 而不是 _.

在大多數現代工具中,這將以向後相容的方式工作,但在某些舊版本的工具中,您可能需要將 _. 替換為 -。您也可能會收到警告,提示您安裝的 extra 不存在 - 但通常此警告是無害的,並且無論如何都會安裝 extra。但是,建議在您的所有 Airflow extras 的依賴規範中更改為使用 -

  • 釋出的 airflow 包不包含 develdevel-*docdocs-gen extras。只有當您以 --editable 模式從原始碼安裝 Airflow 時,這些 extras 才可用。這是因為這些 extras 僅用於開發和文件構建目的,在為生產使用安裝 Airflow 時不需要。無論如何,這些依賴項對於釋出的包具有未指定的和不同的行為,並且您不應該在釋出的包中使用它們。

  • 當使用約束安裝 Airflow 時,allall-* extras 並非總是能正確工作,因為它們也被認為是僅用於開發的依賴項。透過此更改,這些依賴項現在可以正確處理約束,並且在使用約束時它們將透過約束正確安裝,從而拉取正確的 providers 和依賴項集。

Graphviz 依賴項現在是可選的,而不是必需的 (#36647)。

作為 Airflow 的必需依賴項,graphviz 依賴項一直存在問題 - 尤其是對於基於 ARM 的安裝。Graphviz 包需要二進位制 graphviz 庫 - 這已經是一個限制,但它們還需要安裝 graphviz Python 繫結才能構建和安裝。這對於舊的 Linux 安裝不起作用,但更重要的是 - 當您嘗試為 ARM M1 MacBooks 安裝 Python 3.8、3.9 的 Graphviz 庫時,由於 M1 的 Python 繫結編譯只能用於 Python 3.10+,因此包安裝失敗。

從技術上講,這不是一個重大更改 - 渲染 DAG 的 CLI 仍然存在,如果您已經安裝了 graphviz,它將繼續像以前一樣工作。當它不起作用的唯一問題是您沒有安裝 graphviz 時,它會引發一個錯誤並通知您需要它。

對於大多數使用者來說,仍然會安裝 Graphviz

  • Airflow 映象仍然會包含 graphviz 庫,因為它作為 extra 新增在那裡

  • 如果已經安裝了以前版本的 Airflow,那麼 graphviz 庫已經安裝在那裡,Airflow 將繼續像以前一樣工作

唯一的更改是從頭開始全新安裝新版本的 Airflow,為了啟用 DAG 渲染選項,需要將 graphviz 指定為 extra 或單獨安裝。

Bug 修復

  • 修復 airflow-scheduler 因異常退出程式碼為 0 的問題 (#36800)

  • 修復當已刪除的任務是 taskinstance 列表中最後一個任務時的回撥異常 (#36693)

  • 當設定 AUTH_ROLE_PUBLIC=admin 時,允許匿名使用者編輯/顯示資源 (#36750)

  • 當 SQLite URL 使用相對路徑時,提供更好的錯誤訊息 (#36774)

  • 強制將整數型別的 run_ids 作為字串傳遞,需要顯式字串轉換 (#36756)

  • 為空的 op 子型別新增日誌查詢異常 (#35536)

  • 移除任務例項上未使用的索引 (#36737)

  • 修復 Python 3.10+ 中 _infer_multiple_outputstyping.Union 的子類檢查 (#36728)

  • 確保即使在使用 TypedDict 時也能正確推斷 multiple_outputs (#36652)

  • 在舊版安全管理器中添加回 FAB 常量 (#36719)

  • 修復使用 Dagrun.update_state 時出現的 AttributeError (#36712)

  • 如果 catchup=False,則不允許 EventsTimetable 排程過去的事件 (#36134)

  • 支援加密觸發器引數 (#36492)

  • 修復 _process_executor_eventstis_query 的型別提示 (#36655)

  • 當用戶沒有訪問頁面的許可權時,重定向到索引頁 (#36623)

  • 避免在 call_regular_interval 中使用 dict 作為預設值 (#36608)

  • 移除在 UI 中將任務例項設定為執行狀態的選項 (#36518)

  • 修復使用動態任務對映時未顯示詳細資訊選項卡的問題 (#36522)

  • 當執行 dag test 時,如果 DagRun 失敗,則引發錯誤 (#36517)

  • 透過批次重新整理 TIs 重構 _manage_executor_state (#36502)

  • 新增 Flask 配置:MAX_CONTENT_LENGTH (#36401)

  • 修復巢狀組中 teardown 的 get_leaves 計算 (#36456)

  • 停止將時區未知的 datetime 序列化為具有 UTC 時區的時區已知的 datetime (#36379)

  • 使 kubernetes 裝飾器型別註釋與運算子一致 (#36405)

  • 修復 Webserver 為匿名使用者向 api/dag/*/dagrun 發出的 POST 請求返回 500 錯誤 (#36275)

  • 修復 get_variable 端點所需的訪問許可權 (#36396)

  • 修復 DAG.is_fixed_time_schedule 中的 datetime 引用 (#36370)

  • 修復 BashOperator 引發的 AirflowSkipException 訊息 (#36354)

  • 允許 PythonVirtualenvOperator.skip_on_exit_code 為零 (#36361)

  • 增加 trigger.html 中 execution_date 輸入的寬度 (#36278)

  • 修復暫停 DAG 的日誌記錄 (#36182)

  • 當 enable_xcom_pickling 為 False 時,停止反序列化 pickle (#36255)

  • 在訪問 DAG 程式碼之前檢查 DAG 讀取許可權 (#36257)

  • 始終啟用將任務標記為失敗/成功 (#36254)

  • 建立最新的日誌目錄符號連結作為相對連結 (#36019)

  • 修復基於 Python 的裝飾器的模板 (#36103)

其他

  • 將併發標籤重新命名為最大活動任務數 (#36691)

  • 恢復檔案任務處理程式中的函式範圍 httpx 匯入以提高效能 (#36753)

  • 新增對 Pendulum 3 的支援 (#36281)

  • 標準化 Airflow 構建過程並切換到 hatchling 構建後端 (#36537)

  • 移除 CVE-2023-47248pyarrow-hotfix (#36697)

  • 使 graphviz 依賴項成為可選 (#36647)

  • 宣佈 Airflow 2.9.0 中 MSSQL 支援結束,新增遷移指令碼提示 (#36509)

  • 將所有 provider 和 airflow 的最小 pandas 依賴項設定為 1.2.5 (#36698)

  • /airflow/www 中將 follow-redirects 從 1.15.3 升級到 1.15.4 (#36700)

  • 提供 logger_name 引數給 base hook,以便覆蓋 logger 名稱 (#36674)

  • 修復執行型別圖示與執行型別文字的對齊 (#36616)

  • 遵循 FSHook 中的 BaseHook 連線欄位方法簽名 (#36444)

  • 移除冗餘的 docker 裝飾器型別註釋 (#36406)

  • 簡化工作日時間表的型別 (#36296)

  • 使用 batch_is_authorized_dag 檢查使用者是否具有讀取 DAG 的許可權 (#36279)

  • 替換已棄用的 get_accessible_dag_ids 並在 get_dag_warnings 中使用 get_readable_dags (#36256)

僅文件更改

  • 指標標籤文件 (#36627)

  • 在文件中使用 logical_date 代替已棄用的 execution_date (#36654)

  • 新增關於 Airflow 即時升級的部分 (#36637)

  • 用演示頂級程式碼的實際練習替換 numpy 示例 (#35097)

  • 改進並新增架構圖的更完整描述 (#36513)

  • 改進 Web 伺服器出現錯誤時顯示的錯誤訊息 (#36570)

  • 使用有關 DAG 暫停的資訊更新 dags.rst (#36540)

  • 升級到 Debian Bookworm 後更新安裝先決條件 (#36521)

  • 新增有關使用者應如何進行資料庫監控的描述 (#36483)

  • 將基於對映的任務組示例新增到 dynamic-task-mapping.rst (#36480)

  • 向替換文件新增更多詳細資訊 (#36485)

  • 在描述優先順序加權方法時使用卡片 (#36411)

  • 更新 metrics.rst 以獲得引數 dagrun.schedule_delay (#36404)

  • 更新 Python 運算子文件中的警告,以反映情感 (#36340)

  • 改進 audit_logs.rst (#36213)

  • 從託管 Postgres 後端的列表中刪除 Redshift 提及 (#36217)

Airflow 2.8.0 (2023-12-18)

重大變更

預設情況下停用 DAG 文件和 DAG 引數描述中的原始 HTML 程式碼 (#35460)

為了確保 DAG 作者不會透過 DAG 描述或觸發 UI 表單注入惡意 javascript,添加了一個新引數 webserver.allow_raw_html_descriptions,預設值為 False。如果您信任 DAG 作者的程式碼並希望允許在 DAG 描述和引數中使用原始 HTML,則可以透過將配置值設定為 True 來恢復以前的行為。

為了確保 Airflow 預設是安全的,觸發 UI 中的原始 HTML 支援已被 markdown 支援取代,透過 description_md 屬性。如果您一直在使用 description_html,請遷移到 description_mdcustom_html_form 現在已棄用。

新特性

  • AIP-58: 新增 Airflow 物件儲存 (AFS) (AIP-58)

  • 將 XCom 選項卡新增到 Grid (#35719)

  • 新增 “literal” 包裝器以停用欄位模板 (#35017)

  • 新增任務上下文日誌記錄功能,以允許將訊息轉發到任務日誌 (#32646, #32693, #35857)

  • 為資料集新增監聽器鉤子 (#34418, #36247)

  • 允許覆蓋導航欄文字顏色 (#35505)

  • 為 deltalake 表新增輕量級序列化 (#35462)

  • 新增對 iceberg 表序列化的支援 (#35456)

  • prev_end_date_success 方法訪問 (#34528)

  • 新增任務引數以設定自定義記錄器名稱 (#34964)

  • 新增 pyspark 裝飾器 (#35247)

  • 將 trigger 新增為 db clean 命令的有效選項 (#34908)

  • 為外部和 venv python 分支運算子新增裝飾器 (#35043)

  • 允許 PythonVenvOperator 使用其他 index url (#33017)

  • 新增 Python 虛擬環境運算子快取 (#33355)

  • 為容器化執行器日誌記錄引入通用匯出 (#34903)

  • 新增清除 列表 任務 例項 檢視中下游 tis 的能力 (#34529)

  • 屬性 clear_number 用於跟蹤正在清除的 DAG 執行 (#34126)

  • 新增 BranchPythonVirtualenvOperator (#33356)

  • 允許 PythonVenvOperator 使用其他 index url (#33017)

  • 向 provider 新增 CLI 通知命令 (#33116)

  • 當日志選項卡中超過 10 個重試時,使用下拉選單代替按鈕 (#36025)

改進

  • 在網格檢視中將 multiselect 新增到執行狀態 (#35403)

  • 修復 ImportError 的情況下 Connection.get_hook 中的警告訊息 (#36005)

  • 將 processor_subdir 新增到 import_error 表以處理多個 dag 處理器 (#35956)

  • 在核心執行器中合併 change_state 呼叫以失敗或成功 (#35901)

  • 放寬 schedule=None 時對 start_date 的強制性要求 (#35356)

  • 使用 ExitStack 管理 dag.test 中 secrets_backend_list 的突變 (#34620)

  • 提高 taskinstance 的 ActionModal 中任務的可見性 (#35810)

  • 基於 AIRFLOW_CONFIG 路徑建立目錄 (#35818)

  • 實現 JSON-string 連線表示生成器 (#35723)

  • BaseOperatorLink 移動到單獨的模組 (#35032)

  • 在 set_context 之後設定 mark_end_on_close (#35761)

  • 將外部日誌連結移動到 react 日誌頁面的頂部 (#35668)

  • execute_interactive 中將終端模式更改為 cbreak 並處理 SIGINT (#35602)

  • 使原始 HTML 描述可配置 (#35460)

  • 允許電子郵件欄位被模板化 (#35546)

  • 在觸發 UI 表單中隱藏邏輯日期和執行 ID (#35284)

  • 改進了 TaskFlow 中新增依賴項的說明 (#35406)

  • 向列表匯入錯誤新增可選的退出程式碼 (#35378)

  • 限制 DB 上的查詢結果,而不是 synchronize_log_template 函式中的客戶端 (#35366)

  • 允許在使用變數 CLI 時傳入描述 (#34791)

  • 允許手動觸發的 dag 的必填欄位中存在可選的預設值 (#31301)

  • 允許 airflow kerberos 在不同模式下執行 (#35146)

  • 重構命令以統一守護程式上下文處理 (#34945)

  • 將額外的欄位新增到外掛端點 (#34913)

  • 向池檢視新增描述 (#34862)

  • 將 cli 的 Connection export 和 Variable export 命令列印邏輯移動到單獨的函式 (#34647)

  • 從 get_kerberos_principle 中提取並重用 get_kerberos_principle 函式 (#34936)

  • 更改 BaseOperatorLink.operators 的型別註釋 (#35003)

  • 最佳化並遷移到用於 TaskReschedule 的 SA2-compatible 語法 (#33720)

  • 合併 SlaMissModelView 中的許可權名稱 (#34949)

  • 新增除錯日誌,說明正在執行的內容到 EventScheduler (#34808)

  • 將日誌讀取器流迴圈睡眠持續時間增加到 1 秒 (#34789)

  • 解決關於 update_forward_refs 的 pydantic 棄用警告 (#34657)

  • 統一對映的任務組查詢邏輯 (#34637)

  • 允許按屬性過濾事件日誌 (#34417)

  • 使連線登入名和密碼為 TEXT (#32815)

  • 禁止在程式碼庫中從 airflow 包匯入 Dataset (#34610)

  • 在示例和測試中使用 airflow.datasets.Dataset (#34605)

  • 增強任務狀態可見性 (#34486)

  • 簡化 DAG 觸發 UI (#34567)

  • 禁止從 airflow 匯入 AirflowException (#34512)

  • 為 airflow 資源配置引數新增描述 (#34438)

  • 簡化觸發器名稱表示式 (#34356)

  • 將 Pod*Exceptions 的定義移動到 pod_generator (#34346)

  • 將延遲任務新增到 cluster_activity 檢視的 Pools Slots (#34275)

  • 修復心跳失敗日誌訊息 (#34160)

  • 重新命名 dag 執行的變數 (#34049)

  • 在 OpenAPI 規範中闡明 new_state (#34056)

  • 從 docker compose 檔案中刪除頂層元素 version (#33831)

  • 刪除通用觸發器取消錯誤日誌 (#33874)

  • 使用 NOT EXISTS 子查詢代替 tuple_not_in_condition (#33527)

  • 允許上下文鍵引數不提供預設值 (#33430)

  • 分配未分配的觸發器時,按 - TI priority_weight 排序觸發器 (#32318)

  • 新增指標 triggerer_heartbeat (#33320)

  • 允許 airflow variables export 列印到 stdout (#33279)

  • 解決執行 backfill 時出現的死鎖問題 (#32991)

  • 為批次任務例項 API 端點新增 dag_run_ids 和 task_ids 過濾器 (#32705)

  • 觸發器的可配置健康檢查閾值 (#33089)

  • 重構 provider manager,將 Airflow 核心鉤子視為其他 provider 鉤子 (#33051)

  • 確保在取消對映時填充 DAG 級別的引用 (#33083)

  • 使 Web 伺服器 access_denied 警告可配置 (#33022)

  • 在觸發器表單 UI 中新增對不同資料型別陣列的支援 (#32734)

  • 新增一個機制,用於警告 executor 是否覆蓋了現有的 CLI 命令 (#33423)

Bug 修復

  • 計算下一個計劃時,考慮 UTC 偏移量的變化 (#35887)

  • 為檢視者角色新增對 Pools 的讀取許可權 (#35352)

  • 修復延遲任務 queued_dttm 大於 start_date 時,甘特圖的排隊持續時間 (#35984)

  • 避免在 rm 時找不到目錄而導致容器崩潰 (#36050)

  • 更新 reset_user_sessions 以便從 CLI 或 Web 工作 (#36056)

  • 修復刪除 DAG 後出現的 UI Grid 錯誤。 (#36028)

  • 更改觸發器 UI 以在 Web UI 中使用 HTTP POST (#36026)

  • 修復 airflow db shell 需要額外按鍵才能退出的問題 (#35982)

  • 將 dag grid overscroll 行為更改為 auto (#35717)

  • 使用 dag 測試內聯執行觸發器 (#34642)

  • 為 Firefox scrollbar 向 grid 新增 borderWidthRight (#35346)

  • 修復由於 secrets_masker 導致的無限遞迴問題 (#35048)

  • 修復 serialized_dag 表中的寫入 processor_subdir (#35661)

  • 為獨立的 dag 檔案處理器重新載入配置 (#35725)

  • 長自定義操作員名稱在圖檢視中溢位 (#35382)

  • 將 try_number 新增到 extra links 查詢 (#35317)

  • 防止將非 JSON 可序列化的值分配給 DagRun.conf 字典 (#35096)

  • DAG 詳細資訊中的數值錯誤地呈現為時間戳 (#35538)

  • 修復啟用 statsd 指標時,Scheduler 和 triggerer 在守護程序模式下崩潰的問題 (#35181)

  • 停用活動使用者後出現無限 UI 重定向迴圈 (#35486)

  • 修復 Partial Subset DAG 的 fetch_callback 錯誤 (#35256)

  • 修復 DeltaDataIntervalTimetable 的 DagRun 資料間隔 (#35391)

  • 修復 get_dag_by_pickle util 函式中的查詢 (#35339)

  • 修復當 reset_dag_run=True 時,TriggerDagRunOperator 無法觸發後續執行的問題 (#35429)

  • 修復 mappedoperator 中的 weight_rule 屬性型別 (#35257)

  • Bugfix/防止與快取的 venv 併發 (#35258)

  • 修復 dag 序列化 (#34042)

  • 透過將 request.referrer 替換為 get_redirect() 來修復 py/url 重定向 (#34237)

  • 修復變數匯入期間更新變數的問題 (#33932)

  • 在 Airflow 核心中使用來自 airflow.typing_compat 的 Literal (#33821)

  • 始終使用來自 typing_extensionsLiteral (#33794)

雜項

  • 將預設 MySQL 客戶端更改為 MariaDB (#36243)

  • 將 daskexecutor provider 標記為已刪除 (#35965)

  • 將 FAB 升級到 4.3.10 (#35991)

  • 將 daskexecutor provider 標記為已刪除 (#35965)

  • Connection.to_json_dict 重新命名為 Connection.to_dict (#35894)

  • 升級到 Pydantic v2 (#35551)

  • moto 版本升級到 >= 4.2.9 (#35687)

  • 使用 pyarrow-hotfix 來緩解 CVE-2023-47248 (#35650)

  • axios0.26.0 to 1.6.0 升級到 /airflow/www/ (#35624)

  • 使 docker 裝飾器的型別註解與操作員一致 (#35568)

  • 在樣式中為 navbar_text_colorrm 條件新增預設值 (#35553)

  • 避免在 dag_next_execution 中兩次初始化會話 (#35539)

  • 解決示例和 providers 中的型別問題 (#35494)

  • 啟用 TCH004TCH005 規則 (#35475)

  • 人性化有關檢索到的 DAG 的日誌輸出 (#35338)

  • 從 Black 切換到 Ruff 格式化程式 (#35287)

  • 升級到 Flask Application Builder 4.3.9 (#35085)

  • D401 支援 (#34932, #34933)

  • 使用 requires_access 檢查對 dag 的讀取許可權,而不是顯式檢查 (#34940)

  • 棄用從 airflow 延遲匯入 AirflowException (#34541)

  • 在對映內容用例中檢視 util 重構 (#34638)

  • postcss8.4.25 to 8.4.31 升級到 /airflow/www (#34770)

  • 將 Sqlalchemy 查詢重構為 2.0 樣式 (#34763, #34665, #32883, #35120)

  • 更改為 pandas 序列化器中 io 的延遲載入 (#34684)

  • 在示例中使用 airflow.models.dag.DAG (#34617)

  • 在核心中使用 airflow.exceptions.AirflowException (#34510)

  • 檢查在請求中傳遞的 dag_ids 是否一致 (#34366)

  • 重構以使程式碼更好 (#34278, #34113, #34110, #33838, #34260, #34409, #34377, #34350)

  • 暫停 qubole provider (#33889)

  • 為 Google ADS 生成 Python API 文件 (#33814)

  • 改進模組中的匯入 (#33812, #33811, #33810, #33806, #33807, #33805, #33804, #33803, #33801, #33799, #33800, #33797, #33798, #34406, #33808)

  • 將 Elasticsearch 升級到 8 (#33135)

僅文件更改

  • 在文件中新增對選項卡(和其他 UX 元件)的支援 (#36041)

  • 用 diagrams-generated 圖替換 Airflow 的架構圖 (#36035)

  • 新增描述 DAG 作者能力的安全模型的部分 (#36022)

  • 增強有關 zombie 任務的文件 (#35825)

  • 在文件中反映 DB 後端版本的刪除/新增支援 (#35785)

  • 有關強制性任務引數的更多詳細資訊 (#35740)

  • 在 .airflowignore 文件中指示 re2 regex 引擎的用法。 (#35663)

  • 更新 best-practices.rst (#35692)

  • 更新 dag-run.rst 以提及 Airflow 透過 croniter 對擴充套件 cron 語法的支援 (#35342)

  • 更新 webserver.rst 以包含受支援的 OAuth2 provider 的資訊 (#35237)

  • 將 dag_run 添加回文件 (#35142)

  • 修復 rst 程式碼塊格式 (#34708)

  • 向具體的 taskflow 示例新增型別提示 (#33417)

  • 為從 TaskFlow 任務訪問上下文變數新增具體示例 (#33296)

  • 修復安全文件中的連結 (#33329)

Airflow 2.7.3 (2023-11-06)

重大更改

沒有重大更改。

Bug 修復

  • 修復對映任務組中任務的過早評估 (#34337)

  • 在 rest API 中新增 TriggerRule 缺失值 (#35194)

  • 修復 dagrun 建立失敗時 Scheduler 崩潰迴圈的問題 (#35135)

  • 修復與 codemirror 和 extra 的連線測試 (#35122)

  • 修復自 v1.3.0 中 BC 以來的 cron-descriptor 的使用 (#34836)

  • 修復基於類的監聽器的 get_plugin_info。 (#35022)

  • dag_run 和 task_instance 端點的一些改進/修復 (#34942)

  • 修復 Web 伺服器主頁中的 dags 計數過濾器 (#34944)

  • 當 ~ 作為 dag_id 提供時,僅返回可讀 dags 的 TIs (#34939)

  • 修復守護程序模式下的觸發器執行緒崩潰 (#34931)

  • 修復錯誤的外掛架構 (#34858)

  • 在 TimeSensorAsync 中使用 DAG 時區 (#33406)

  • 如果任何任務處於 upstream_failed 狀態,則將具有 all_skipped 觸發規則的任務標記為 skipped (#34392)

  • 向只讀欄位新增只讀驗證 (#33413)

雜項/內部

  • 改進測試工具以分離 DB 和非 DB 測試 (#35160, #35333)

  • 將 pytest db_test 標記新增到我們的測試 (#35264)

  • 新增 pip 快取以加快構建速度 (#35026)

  • pendulum 依賴項限制在 <3.0 範圍內 (#35336)

  • sentry_sdk 限制為 1.33.0 (#35298)

  • 修復了測試中模擬 processor_agent 的一個細微錯誤 (#35221)

  • /airflow/www 中,將 @babel/traverse7.16.0 升級到 7.23.2 (#34988)

  • /airflow/www 中,將 undici5.19.1 升級到 5.26.3 (#34971)

  • SchedulerJobRunner 中刪除未使用的集合 (#34810)

  • 移除關於 max_tis per query > parallelism 的警告 (#34742)

  • 透過將某些模組移動到型別檢查塊中,改進 Airflow 核心中的模組匯入 (#33755)

  • 修復測試,以響應 Python 3.12 對 sentry-sdk 中 utcnow 的處理 (#34946)

  • 新增 connexion<3.0 上限 (#35218)

  • 將 Airflow 限制為 < 3.12 (#35123)

  • 更新 moto 版本 (#34938)

  • 將 WTForms 限制為低於 3.1.0 (#34943)

僅文件更改

  • 修復 Airflow 文件中的變數替換問題 (#34462)

  • conn.extras 中添加了預設值示例 (#35165)

  • 更新 datasets.rst,修復執行示例程式碼的問題 (#35035)

  • 從推薦的 MySQL 驅動程式中刪除 mysql-connector-python (#34287)

  • 修復任務依賴 set_downstream 示例中的語法錯誤 (#35075)

  • 更新文件以啟用測試連線 (#34905)

  • 更新 docs errors.rst - 提及 sentry “transport” 配置選項 (#34912)

  • 更新 dags.rst,將 SubDag 棄用說明放在 SubDag 章節標題之後 (#34925)

  • 新增關於在自定義 Secrets 後端中獲取變數和配置的資訊 (#34834)

  • 更詳細地記錄 BaseExecutor 介面,以幫助使用者編寫自定義執行器 (#34324)

  • 修復指向 airflow_local_settings.py 模板的損壞連結 (#34826)

  • 修復 params.rst 中 python_callable 函式賦值上下文 kwargs 示例 (#34759)

  • 在 TaskFlow 示例中新增缺失的 multiple_outputs=True 引數 (#34812)

  • 刪除 provider 部分名稱中多餘的 '>' (#34813)

  • 修復 extra link 文件中的匯入問題 (#34547)

Airflow 2.7.2 (2023-10-12)

重大更改

無重大更改

Bug 修復

  • 檢查配置端點中提供的較低值是否為敏感值 (#34712)

  • 新增對 ZoneInfo 和通用 UTC 的支援,以修復日期時間序列化問題 (#34683, #34804)

  • 修復 airflow db migrate 命令期間出現 AttributeError: ‘Select’ object has no attribute ‘count’ 的問題 (#34348)

  • 使修補任務例項的 dry run 成為可選操作 (#34568)

  • 修復非確定性的日期時間反序列化問題 (#34492)

  • 使用迭代迴圈來查詢對映的父級 (#34622)

  • 透過檢查父級 taskgroup 是否已對映來修復 is_parent_mapped 值 (#34587)

  • 避免頂層 airflow 匯入,以避免迴圈依賴 (#34586)

  • 向冗長的指標列表新增更多豁免 (#34531)

  • 修復 dag 警告端點許可權 (#34355)

  • 修復批處理端點中的任務例項訪問問題 (#34315)

  • 更正網格檢視中顯示的錯誤時間 (#34179)

  • 修復 www cluster_activity 檢視由於 standaloneDagProcessor 模板而無法載入的問題 (#34274)

  • 在 ‘Not syncing DAG-level permissions’ 中設定 loglevel=DEBUG (#34268)

  • 使引數驗證在 DAG 驗證和觸發方面保持一致 (#34248)

  • 確保在選擇任何選項卡時都顯示詳細資訊面板 (#34136)

  • 修復與 access_control={} 相關的問題 (#34114)

  • 修復 CLI 會話中找不到 ab_user 表的問題 (#34120)

  • 修復 FAB 相關的日誌格式插值問題 (#34139)

  • 修復 next_run_datasets_summary 端點中的查詢錯誤 (#34143)

  • 修復重複標籤的 TaskGroup 切換 (#34072)

  • 修復從 UI 清除 TI 所需的許可權 (#34123)

  • 在對映的 render_template_fields 中重用 _run_task_session (#33309)

  • 修復排程程式邏輯,透過忽略手動執行來規劃新的 DAG 執行 (#34027)

  • 為 Flask 操作新增、編輯和刪除操作新增缺失的審計日誌 (#34090)

  • 從叢集活動頁面隱藏不相關的 DAG 處理器 (#33611)

  • 移除微調器的無限動畫,旋轉 1.5 秒 (#34020)

  • 恢復使用 version_added 呈現提供程式配置的功能 (#34011)

僅文件更改

  • 闡明審計日誌許可權 (#34815)

  • 新增審計日誌使用者說明 (#34814)

  • 在 WSGI 中介軟體示例中從 FAB 匯入 AUTH_REMOTE_USER (#34721)

  • 新增關於未來在 DB 後端中刪除對 MsSQL 支援的資訊 (#34375)

  • 記錄如何使用系統的時區資料庫 (#34667)

  • 闡明文件中 landing time 的含義 (#34608)

  • 修復動態任務對映文件中的螢幕截圖 (#34566)

  • 修復公共介面文件中的類引用 (#34454)

  • 闡明 var.value.get 和 var.json.get 的用法 (#34411)

  • 排程預設值描述 (#34291)

  • triggered_dataset_event 的文件 (#34410)

  • 新增 DagRun 事件 (#34328)

  • 提供關於觸發表單引數型別的表格概述 (#34285)

  • 在核心文件中新增指向 Amazon Provider 配置的連結 (#34305)

  • 向安全模型新增“安全基礎設施”段落 (#34301)

  • 將連結更改為 SQLAlchemy 1.4 (#34288)

  • 在安全文件中新增 SBOM 條目 (#34261)

  • 為 XCom push 和 pull 新增更多示例程式碼 (#34016)

  • 將 state utils 新增到公共 Airflow 介面 (#34059)

  • 將 Markdown 樣式連結替換為 RST 樣式連結 (#33990)

  • 修復指向 “UPDATING.md” 檔案的損壞連結 (#33583)

其他/內部

  • 更新 min-sqlalchemy 版本以考慮使用的最新功能 (#34293)

  • 修復 SesssionExemptMixin 拼寫錯誤 (#34696)

  • 限制 astroid 版本 < 3 (#34658)

  • 如果 defer 沒有觸發器,則 dag 測試失敗 (#34619)

  • 修復連線匯出輸出 (#34640)

  • 建立新的 alembic 遷移時,不要執行 isort (#34636)

  • 棄用 PythonVirtualEnvOperator 中的數字型別 Python 版本 (#34359)

  • os.path.splitext 重構為 Path.* (#34352, #33669)

  • 將 = 替換為 is 以進行型別比較 (#33983)

  • 重構整數除法 (#34180)

  • 重構:簡化比較 (#34181)

  • 重構:簡化字串生成 (#34118)

  • 用 dict() 替換不必要的 dict 推導式 (#33858)

  • 將“not all”更改為“any”,以方便閱讀 (#34259)

  • 在程式碼中用 if…raise 替換 assert (#34250, #34249)

  • 將預設時區移動到 except 塊 (#34245)

  • 在核心中合併類似的 if 邏輯 (#33988)

  • 重構:整合 random 的匯入和使用 (#34108)

  • 整合 os.path.* 的匯入 (#34060)

  • 在 Airflow 核心中,用解包替換序列連線 (#33934)

  • 移除 repo 中不必要的 'continue' 跳轉 (#33849, #33845, #33846, #33848, #33839, #33844, #33836, #33842)

  • pyproject.toml 中刪除 [project] 部分 (#34014)

  • 如果可能,將 try 移到 Airflow 核心的迴圈之外 (#33975)

  • 在核心中查詢正值時,用 any 替換迴圈 (#33985)

  • 不要建立我們不需要的列表 (#33519)

  • 從核心中刪除無用的字串連線 (#33969)

  • 將 TCH001 和 TCH002 規則新增到 pre-commit 以檢測和移動型別檢查模組 (#33865)

  • 將 cancel_trigger_ids 新增到批次處理的 to_cancel 出隊操作中 (#33944)

  • 解析 stats datadog 標籤時,避免建立不必要的列表 (#33943)

  • 在核心中,當 key 未使用時,用 dict.values 替換 dict.items (#33940)

  • 用推導式替換 lambdas (#33745)

  • 透過將某些模組移動到型別檢查塊中,改進 Airflow 核心中的模組匯入 (#33755)

  • 重構:刪除未使用的狀態 - SHUTDOWN (#33746, #34063, #33893)

  • 重構:使用原地 .sort() (#33743)

  • 在 Airflow 核心中使用字面量 dict 而不是呼叫 dict() (#33762)

  • 刪除不必要的 map 並使用列表在 Airflow 核心中重寫它 (#33764)

  • 在 Airflow 核心中,用 def 方法替換 lambda (#33758)

  • 用 fab_security 管理器中的 isinstance 替換 type 函式 (#33760)

  • 在所有 Airflow 模組中,用雙引號替換單引號 (#33766)

  • 在單個呼叫中合併相同物件的多個 isinstance 呼叫 (#33767)

  • 在核心中使用具有多個上下文的單個語句,而不是巢狀語句 (#33769)

  • 重構:使用 f-strings (#33734, #33455)

  • 重構:使用 random.choices (#33631)

  • 使用 str.splitlines() 分割行 (#33592)

  • 重構:移除無用的 str() 呼叫 (#33629)

  • 重構:改進重複檢測和列表排序 (#33675)

  • 簡化對 len() 的條件 (#33454)

Airflow 2.7.1 (2023-09-07)

重大更改

CronTriggerTimetable 在嘗試跳過執行時現在不那麼激進了 (#33404)

當設定 catchup=False 時,如果排程程式未在觸發上一次執行後立即查詢時間表,則 CronTriggerTimetable 不再跳過執行。

在大多數情況下,這不應影響排程,但如果 DAG 被暫停-取消暫停以手動跳過執行,則可能會改變行為。以前,時間表(帶有 catchup=False)僅在 DAG 被取消暫停後才開始執行,但透過此更改,排程程式會嘗試稍微回溯一下,以排程涵蓋 DAG 暫停期間一部分的先前執行。這意味著您需要使 DAG 暫停更長時間(即,經過整個 cron 週期)才能真正跳過執行。

請注意,這也是各種其他基於 cron 的排程工具(例如 anacron)所表現出的行為。

conf.set() 變為大小寫不敏感,以匹配 conf.get() 的行為 (#33452)

此外,如果 conf.get() 與非字串引數一起使用,現在將中斷。

conf.set(section, key, value) 過去是區分大小寫的,即 conf.set("SECTION", "KEY", value)conf.set("section", "key", value) 被儲存為兩個不同的配置。 這與 conf.get(section, key) 的行為不一致,後者始終將 section 和 key 轉換為小寫。

因此,在 section 或 key 中使用大寫字元設定的配置選項無法訪問。 這就是為什麼我們現在也在 conf.set 中將 section 和 key 轉換為小寫。

我們還稍微更改了 conf.get() 的行為。 它過去允許 section 或 key 中不是字串的物件。 現在這樣做會導致異常。 例如,conf.get("section", 123) 需要替換為 conf.get("section", "123")

Bug 修復

  • 確保任務等待正在執行的間接設定 (#33903)

  • 尊重核心非同步感測器的 “soft_fail” (#33403)

  • 區分 0 和未設定為預設引數值 (#33965)

  • 如果未找到變數,則從 Variable PATCH API 引發 404 (#33885)

  • 修復 MappedTaskGroup 任務不尊重上游依賴關係 (#33732)

  • 如果需要查詢結果的第一個值,則新增 limit 1 (#33672)

  • 修復 UI DAG 計數,包括已刪除的 DAG (#33778)

  • 修復清理殭屍 RESTARTING 任務 (#33706)

  • SECURITY_MANAGER_CLASS 應該是對類的引用,而不是字串 (#33690)

  • 在安全管理器中添加回 get_url_for_login (#33660)

  • 修復 2.7.0 db 遷移作業錯誤 (#33652)

  • 在模板內設定上下文 (#33645)

  • 如果定義了 DAG 定義的 access_control,則將其視為權威 (#33632)

  • 在嘗試刪除存檔表之前繫結引擎 (#33622)

  • 如果沒有設定名字和姓氏,則添加回退 (#33617)

  • 在 TIS 持續時間計算中的 groupby 之前對資料進行排序 (#33535)

  • 在沒有 dagrun 時,停止向呈現的模板 UI 新增值 (#33516)

  • 在 webserver 檢視中解析日期時,將 strict 設定為 True (#33512)

  • 在自定義 SA 型別中使用 dialect.name (#33503)

  • end_date 小於 utcnow 時,不要返回正在進行的 dagrun (#33488)

  • 修復 formatDuration 方法中的一個 bug (#33486)

  • 使 conf.set 不區分大小寫 (#33452)

  • 允許時間表略微錯過追趕截止點 (#33404)

  • 當呼叫 poke 時,尊重 soft_fail 引數 (#33401)

  • 建立一個用於恢復任務的新方法,以便為運算子實現特定邏輯 (#33424)

  • 修復 DagFileProcessor 干擾其 processor_subdir 之外的 dag (#33357)

  • 刪除 Provider 檢視中不必要的 <br> 文字 (#33326)

  • 當 ExternalTaskSensor 在可延遲模式下執行時,尊重 soft_fail 引數 (#33196)

  • 修復 Param 類的預設值和序列化處理 (#33141)

  • 在新增之前檢查動態新增的索引是否在表模式中 (#32731)

  • 修復使用 expand_kwargs 方法時呈現對映引數的問題 (#32272)

  • 修復 Python 3.8 的 celery 和 opentelemetry 的依賴關係 (#33579)

其他/內部

  • 恢復 Pydantic 1 相容性 (#34081, #33998)

  • 對 PyPI 使用 README.md 的精簡版本 (#33637)

  • 升級到 Pydantic 2 (#33956)

  • 重新組織 Airflow 的 setup.py 中的 devel_only extra (#33907)

  • FAB 提升到 4.3.4 以修復過濾器問題 (#33931)

  • sqlalchemy 新增最低要求 to 1.4.24 (#33892)

  • 更新配置檔案中配置的 version_added 欄位 (#33509)

  • OrderedDict 替換為普通 dict (#33508)

  • 合併 itertools 的匯入和使用 (#33479)

  • 靜態檢查修復 (#33462)

  • 從 datetime 匯入 utc 並規範化其匯入 (#33450)

  • D401 支援 (#33352, #33339, #33337, #33336, #33335, #33333, #33338)

  • 修復一些缺失的型別提示 (#33334)

  • D205 支援 - Stragglers (#33301, #33298, #33297)

  • 重構:簡化程式碼 (#33160, #33270, #33268, #33267, #33266, #33264, #33292, #33453, #33476, #33567, #33568, #33480, #33753, #33520, #33623)

  • 修復有關 orm_mode 重新命名的 Pydantic 警告 (#33220)

  • 將 MySQL 8.1 新增到支援的版本。 (#33576)

  • 刪除版本 < 2 的 Pydantic 限制 (#33507)

僅文件更改

  • 新增文件解釋 template_ext(以及如何覆蓋它)(#33735)

  • 解釋使用者如何檢查 python 程式碼是否是頂級的 (#34006)

  • 澄清 DAG 作者也可以在 DAG 檔案處理器中執行程式碼 (#33920)

  • 修復 Modules Management 頁面中的斷開連結 (#33499)

  • 修復 secrets backend 文件 (#33471)

  • 修復 base_log_folder 的配置說明 (#33388)

Airflow 2.7.0 (2023-08-18)

重大更改

移除 Python 3.7 支援 (#30963)

從現在開始,Python 社群不再支援 Python 3.7。 因此,要使用 Airflow 2.7.0,您必須確保您的 Python 版本為 3.8、3.9、3.10 或 3.11。

舊的圖形檢視已移除 (#32958)

舊的圖形檢視已移除。 新的圖形檢視現在是預設檢視。

如果 DAG 中未定義任何引數,則在 Web UI 中跳過觸發 UI 表單 (#33351)

如果您使用 dag_run.conf 字典和 Web UI JSON 條目來執行您的 DAG,您應該:

“db init”、“db upgrade”命令和“[database] load_default_connections”配置選項已棄用 (#33136)。

相反,您應該使用“airflow db migrate”命令來建立或升級資料庫。 此命令不會建立預設連線。 為了建立預設連線,您需要在執行“airflow db migrate”之後顯式執行“airflow connections create-default-connections”。

對於 SMTP SSL 連線,上下文現在使用“default”上下文 (#33070)

“default”上下文是 Python 的 default_ssl_contest,而不是之前使用的“none”。 default_ssl_context 在安全性和相容性之間提供了平衡,但在某些情況下,當證書是舊的、自簽名的或配置錯誤時,它可能無法工作。 這可以透過在 Airflow 的“email”配置中設定“ssl_context”來配置。

將其設定為“none”會恢復 Airflow 2.6 及更早版本中使用的“none”設定,但不建議這樣做,因為出於安全原因,此設定會停用證書驗證並允許 MITM 攻擊。

停用預設允許在 UI、API 和 CLI 中測試連線 (#32052)

出於安全考慮,測試連線功能在 Airflow UI、API 和 CLI 中預設停用。 該功能的可用性可以透過 Airflow 配置 ( airflow.cfg ) 的 core 部分中的 test_connection 標誌來控制。 也可以透過環境變數 AIRFLOW__CORE__TEST_CONNECTION 來控制。

此配置引數接受以下值: 1. Disabled:停用測試連線功能,並停用 UI 中的“測試連線”按鈕。

這也是 Airflow 配置中設定的預設值。 2. Enabled:啟用測試連線功能,並激活 UI 中的“測試連線”按鈕。

3. Hidden:停用測試連線功能,並隱藏 UI 中的“測試連線”按鈕。

有關使用者功能的更多資訊,請參閱文件:https://airflow.apache.tw/docs/apache-airflow/stable/security/security_model.html#capabilities-of-authenticated-ui-users 強烈建議在確認只有高度信任的 UI/API 使用者才擁有“編輯連線”許可權後,啟用此功能。

xcomEntries API 預設停用對 deserialize 標誌的支援 (#32176)

出於安全考慮,/dags/*/dagRuns/*/taskInstances/*/xcomEntries/* API 端點現在停用 deserialize 選項,以反序列化 Web 伺服器中的任意 XCom 值。 為了向後相容,伺服器管理員可以將 [api] enable_xcom_deserialize_support 配置設定為 *True* 以啟用該標誌並恢復向後相容性。

但是,強烈建議不要啟用此功能,而是在客戶端執行反序列化。

更改預設 Celery 應用程式名稱 (#32526)

Celery 應用程式的預設名稱從 airflow.executors.celery_executor 更改為 airflow.providers.celery.executors.celery_executor

您應該同時更改配置和健康檢查命令以使用新名稱
  • 在配置中(celery 部分中的 celery_app_name 配置),使用 airflow.providers.celery.executors.celery_executor

  • 在您的健康檢查命令中使用 airflow.providers.celery.executors.celery_executor.app

scheduler.max_tis_per_query 的預設值從 512 更改為 16 (#32572)

預計此更改將使 Scheduler 響應更快。

scheduler.max_tis_per_query 需要低於 core.parallelism。 如果之前兩者都保留為其預設值,則 scheduler.max_tis_per_query 的有效預設值為 32(因為它被限制為 core.parallelism)。

為了儘可能保持與舊配置相似的行為,可以設定 scheduler.max_tis_per_query = 0,在這種情況下,它將始終使用 core.parallelism 的值。

一些執行器已移至相應的提供程式 (#32767)

為了使用這些執行器,您需要安裝這些提供程式

  • 對於 Celery 執行器,您需要安裝 apache-airflow-providers-celery 包 >= 3.3.0

  • 對於 Kubernetes 執行器,您需要安裝 apache-airflow-providers-cncf-kubernetes 包 >= 7.4.0

  • 對於 Dask 執行器,您需要在任何版本中安裝 apache-airflow-providers-daskexecutor

您也可以透過分別安裝帶有 [celery][cncf.kubernetes][daskexecutor] 附加功能的 airflow 來實現這一點。

將其映像基於 apache/airflow 參考映像(非 slim)的使用者應該不受影響 - 基本參考映像附帶所有三個已安裝的提供程式。

改進變更

僅限 PostgreSQL 的改進:在 taskinstance 表上新增索引 (#30762)

此索引似乎在具有數千萬此類行的設定中具有巨大的積極作用。

新功能

  • 將 OpenTelemetry 新增到 Airflow (AIP-49)

  • 觸發按鈕 - 實現 AIP-50 的第 2 部分 (#31583)

  • 從核心 Airflow 中刪除執行器耦合 (AIP-51)

  • 自動設定和拆卸任務 (AIP-52)

  • Airflow 中的 OpenLineage (AIP-53)

  • 實驗性:在 dag 解析時呼叫時,向變數和連線新增快取 (#30259)

  • 允許池考慮延遲任務 (#32709)

  • 允許為 SMTP 連線選擇 SSL 上下文 (#33070)

  • 新的 gantt 標籤 (#31806)

  • 從提供程式載入外掛 (#32692)

  • 新增 BranchExternalPythonOperator (#32787, #33360)

  • 新增在提供程式中儲存配置描述的選項 (#32629)

  • 引入心跳引數以允許 Per-LocalTaskJob 配置 (#32313)

  • 新增執行器發現和文件 (#32532)

  • 為作業狀態常量新增 JobState (#32549)

  • 新增停用 'deserialize' XCom API 標誌的配置 (#32176)

  • 透過自定義運算子名稱在 Web UI 中顯示任務例項 (#31852)

  • 新增 default_deferrable 配置 (#31712)

  • 引入 AirflowClusterPolicySkipDag 異常 (#32013)

  • 使用 reactflow 用於資料集圖 (#31775)

  • 新增一個選項,用於從資料庫載入 dag 以執行命令任務 (#32038)

  • 新增不需要匹配列表的 chain 版本 (#31927)

  • 在 UI 中使用 operator_name 代替 task_type (#31662)

  • airflow db check 新增 --retry--retry-delay (#31836)

  • 允許跳過任務狀態 task_instance_schema.py (#31421)

  • 為 celery result_backend 引擎選項新增一個新配置 (#30426)

  • UI 新增叢集活動頁面 (#31123, #32446)

  • 向常用操作新增鍵盤快捷鍵 (#30950)

  • 向 kubernetes 執行器日誌新增更多資訊 (#29929)

  • 新增對配置自定義 alembic 檔案的支援 (#31415)

  • 在 UI 上為 DAG 新增執行和失敗狀態選項卡 (#30429)

  • 為觸發表單新增多選、提案和標籤 (#31441)

  • 使 Web 伺服器配置可自定義 (#29926)

  • 將 DAGCode 在網格檢視中呈現為選項卡 (#31113)

  • 新增 rest 端點以獲取配置選項 (#31056)

  • 在 get config rest API 中新增 section 查詢引數 (#30936)

  • 建立指標以跟蹤 Scheduled->Queued->Running 任務狀態轉換時間 (#30612)

  • 將任務組標記為成功/失敗 (#30478)

  • 新增 CLI 命令以列出提供程式觸發器資訊 (#30822)

  • 為 DAG 新增 Fail Fast 功能 (#29406)

改進

  • 改進圖形巢狀邏輯 (#33421)

  • 觸發器的可配置健康檢查閾值 (#33089, #33084)

  • 為批次任務例項 API 端點新增 dag_run_ids 和 task_ids 過濾器 (#32705)

  • 確保在取消對映時填充 DAG 級別的引用 (#33083)

  • 在觸發器表單 UI 中新增對不同資料型別陣列的支援 (#32734)

  • 始終顯示 gantt 和程式碼選項卡 (#33029)

  • 將偵聽器成功掛鉤移動到 SQLAlchemy 提交後 (#32988)

  • db upgrade 重新命名為 db migrate 並新增 connections create-default-connections (#32810, #33136)

  • 刪除舊的 gantt 圖表並重定向到網格檢視 gantt 選項卡 (#32908)

  • 根據選定的任務調整圖形縮放 (#32792)

  • 在渲染模板後呼叫偵聽器 on_task_instance_running (#32716)

  • 在圖形檢視任務例項工具提示中顯示 execution_date。 (#32527)

  • 允許提供程式貢獻配置 (#32604, #32755, #32812)

  • 減少每個查詢的最大 TIs 的預設值,強制執行 <= 並行性 (#32572)

  • 將配置描述儲存在 Airflow 配置物件中 (#32669)

  • 使用 isdisjoint 代替 not intersection (#32616)

  • 加快任務組的葉子和根的計算速度 (#32592)

  • Kubernetes 執行器載入時間最佳化 (#30727)

  • 如果 dag 不可排程,則儲存 DAG 解析時間 (#30911)

  • 更新健康檢查端點以包括 dag_processor 狀態。 (#32382)

  • 停用預設設定,允許在 UI、API 和 CLI 中測試連線 (#32052, #33342)

  • 修復排程程式部分下的配置變數型別 (#32132)

  • 允許按字母順序對網格檢視進行排序 (#32179)

  • 將主機名新增到觸發器度量 [triggers.running] (#32050)

  • 改進 DAG ORM 清理程式碼 (#30614)

  • TriggerDagRunOperator: 將 wait_for_completion 新增到 template_fields (#31122)

  • 在新選項卡中開啟將我們帶離 Airflow UI 的連結 (#32088)

  • 僅當未選擇任務時才顯示程式碼選項卡 (#31744)

  • 新增 celery 和 dask 證書配置的描述 (#31822)

  • PythonVirtualenvOperator 終止日誌在警報中 (#31747)

  • 將所有 DAG 詳細資訊遷移到現有的網格檢視 dag 詳細資訊面板 (#31690)

  • 新增圖表以幫助視覺化計時器指標 (#30650)

  • Celery 執行器載入時間最佳化 (#31001)

  • 更新 airflow db 命令的程式碼樣式為 SQLAlchemy 2.0 樣式 (#31486)

  • 在 FIPS 環境中將 md5 的使用標記為“不用於安全” (#31171)

  • 將 pydantic 支援新增到 serde (#31565)

  • 在 DagRun 和 TaskInstance 中的 note 列中啟用搜索 (#31455)

  • 透過為 dag_run 新增新的索引想法來節省排程程式執行時間 (#30827)

  • 透過快取 dags 來節省排程程式執行時間 (#30704)

  • 支援按 Web UI 中的上次執行日期對 DAG 進行排序 (#31234)

  • Job 和 JobRunners 的更好型別 (#31240)

  • 新增按 created_date 排序邏輯以獲取觸發器 (#31151)

  • 移除訪問控制文件中的 DAGs.can_create,調整測試裝置 (#30862)

  • 將 Celery 日誌拆分為 stdout/stderr (#30485)

  • 將指標客戶端和 validators 解耦到它們自己的模組中 (#30802)

  • get_log api 中的分頁新增描述 (#30729)

  • 最佳化排程對映任務的效能 (#30372)

  • 新增 sentry 傳輸配置選項 (#30419)

  • 更好的反序列化錯誤訊息 (#30588)

Bug 修復

  • 重置密碼時移除使用者會話 (#33347)

  • Gantt 圖表: 如果與 dag 執行開始/結束日期不同,則使用最早/最舊的 ti 日期 (#33215)

  • 修復 Python virtualenv 運算子的 virtualenv 檢測 (#33223)

  • 當嘗試 chmod airflow.cfg 時,正確記錄問題 (#33118)

  • 將應用程式上下文傳遞給 webserver_config.py (#32759)

  • 跳過非執行任務嘗試的已提供日誌 (#32561)

  • 修復重新載入 gunicorn worker (#32102)

  • 修復當 max_active_runs 達到上限時,很少由競爭條件觸發的未來 DagRun。 (#31414)

  • 修復 BaseOperator get_task_instances 查詢 (#33054)

  • 修復在日誌中使用各種狀態列舉值的問題 (#33065)

  • 使用字串連線來預先新增 log_url 的基本 URL (#33063)

  • 使用運算子樣式屬性更新圖形節點 (#32822)

  • 使 Web 伺服器 access_denied 警告可配置 (#33022)

  • 僅當用戶可以編輯時才載入任務操作模式 (#32992)

  • OpenAPI 規範修復 alongside $ref (#32887) 的可為空性

  • 使 PythonOperator 子類的裝飾器擴充套件其裝飾器 (#32845)

  • 修復在 PythonVirtualenvOperator 中檢查是否安裝了 virtualenv (#32939)

  • 在 is_container() 中檢查 __iter__ 之前取消包裝 Proxy (#32850)

  • 透過使用任務處理程式的 base_log_folder 覆蓋基本日誌資料夾 (#32781)

  • 捕獲 run_job 中的任意異常以防止殭屍排程程式 (#32707)

  • 修復 depends_on_past 對動態任務的工作 (#32397)

  • 對 extra_links 進行排序,以便在 UI 中實現可預測的順序。 (#32762)

  • 修復字首組錯誤圖形 (#32764)

  • 修復 dagruns 的錯誤刪除邏輯 (#32684)

  • 修復 prune_dict 中的錯誤,即使在嚴格模式下也會刪除空字典和列表 (#32573)

  • 新增顯式瀏覽器列表並更正空白目標連結的 rel (#32633)

  • 當 multiple_outputs 為 True 時,處理返回的 None (#32625)

  • 修復當 ShortCircuitOperator 條件為假且沒有下游任務時的返回值 (#32623)

  • 修復 ShortCircuitOperator 條件為假時的返回值 (#32569)

  • 修復 dagRunTimeout 的呈現 (#32565)

  • 修復 /blocked 端點的許可權 (#32571)

  • 錯誤修復,防止在觸發 DAG 時強制取消暫停 (#32456)

  • 修復 cli.dags.trigger 命令輸出中的資料間隔 (#32548)

  • 從 airflow 連線表單中刪除 whitespaces (#32292)

  • 為感測器的適用引數新增 timedelta 支援 (#32515)

  • 修復 API 中 readonly 屬性的錯誤預設值 (#32510)

  • 將 xcom map_index 新增為 xcom 端點的過濾器 (#32453)

  • 修復使用自定義時間表時的 CLI 命令 (#32118)

  • 使用 WebEncoder 在 DagRun 的列表檢視中編碼 DagRun.conf (#32385)

  • 修復 skip_all_except 方法的邏輯 (#31153)

  • 確保動態任務組中的動態任務僅標記 (#32354)

  • 處理 webserver.expose_config 設定為非敏感而不是布林值的情況 (#32261)

  • 新增重試功能,用於處理由資料庫網路問題導致的程序終止 (#31998)

  • 為 sla_miss_callback 適配 Notifier (#31887)

  • 修復 XCOM 檢視 (#31807)

  • 修復 dag.html 初始載入時“按標籤過濾 dags”閃爍的問題 (#31578)

  • 修復擴充套件 resizer 不會擴充套件網格檢視的問題 (#31581)

  • 修復 MappedOperator-BaseOperator 屬性同步檢查 (#31520)

  • 始終將命名的 type_ arg 傳遞給 drop_constraint (#31306)

  • 修復遷移中的錯誤 drop_constraint 呼叫 (#31302)

  • 解決重新設計的網格檢視的問題 (#31232)

  • 支援 requirepass redis sentinel (#30352)

  • 修復呼叫 get /config 時 webserver 崩潰的問題 (#31057)

雜項/內部

  • 修改 pathspec 版本限制 (#33349)

  • 重構:簡化 dag_processing 中的程式碼 (#33161)

  • 目前將 Pydantic 限制為 < 2.0.0 (#33235)

  • 重構:簡化模型中的程式碼 (#33181)

  • 將 elasticsearch 組新增到 pre-2.7 預設值 (#33166)

  • 重構:簡化 airflow/cli 中的字典操作 (#33159)

  • 刪除冗餘的 dict.keys() 呼叫 (#33158)

  • 在 pre-commits 中將 ruff 升級到最新的 0.0.282 版本 (#33152)

  • 將 openlineage 配置移動到提供程式 (#33124)

  • 在 Airflow 執行器中用 TaskInstanceState 替換 State (#32627)

  • 擺脫 Python 2 數字遺留問題 (#33050)

  • 刪除舊的 dag 程式碼 (#33058)

  • 刪除舊的任務例項模態框 (#33060)

  • 刪除舊的圖形檢視 (#32958)

  • 將 CeleryExecutor 移動到 celery 提供程式 (#32526, #32628)

  • 將所有 k8S 類移動到 cncf.kubernetes 提供程式 (#32767, #32891)

  • 重構存在檢查 SQL 以輔助 (#32790)

  • 將 Dask 執行器提取到新的 daskexecutor 提供程式 (#32772)

  • 刪除 atlas 配置定義 (#32776)

  • 新增 Redis 任務處理程式 (#31855)

  • 將 webserver 的寫入配置移動到主 (webserver limited) (#32766)

  • 改進在 Airflow API 端點中獲取查詢計數 (#32630)

  • 刪除點選上限 (#32634)

  • 新增 D400 pydocstyle 檢查 - 僅核心 Airflow (#31297)

  • D205 支援 (#31742, #32575, #32213, #32212, #32591, #32449, #32450)

  • 將 word-wrap 從 1.2.3 升級到 1.2.4/airflow/www 中 (#32680)

  • 強型別化所有單狀態列舉值 (#32537)

  • 更多強型別化狀態轉換 (#32521)

  • utils/db.py 中的 SQL 查詢改進 (#32518)

  • 將 semver 從 6.3.0 升級到 6.3.1/airflow/www 中 (#32506)

  • 將 jsonschema 版本提升到 4.18.0 (#32445)

  • stylelint13.13.1 升級到 15.10.1/airflow/www 中 (#32435)

  • 將 tough-cookie 從 4.0.0 升級到 4.1.3/airflow/www 中 (#32443)

  • 升級 flask-appbuilder (#32054)

  • 支援 Pydantic 2 (#32366)

  • 限制點選直到我們修復 mypy 問題 (#32413)

  • 一些小的清理 (#31890)

  • 用強型別化 enums 替換 State 用法 (#31735)

  • 將 ruff 升級到 0.272 (#31966)

  • 序列化沒有名稱的可呼叫物件時,提供更好的錯誤訊息 (#31778)

  • 稍微改進 views 模組 (#31661)

  • 刪除 asynctest (#31664)

  • 將 sqlalchemy 查詢重構為 2.0 樣式 (#31569, #31772, #32350, #32339, #32474, #32645)

  • 刪除 Python 3.7 支援 (#30963)

  • 為預安裝的提供程式帶回 min-airflow-version (#31469)

  • Docstring 改進 (#31375)

  • 改進 SchedulerJobRunner 中的型別 (#31285)

  • 將 ruff 升級到 0.0.262 (#30809)

  • 升級到 MyPy 1.2.0 (#30687)

僅文件更改

  • 在安全模型中闡明 UI 使用者型別 (#33021)

  • 在 templates-ref.rst 中新增指向 DAGRun / DAG / Task 的連結 (#33013)

  • 新增有關如何測試 DAG 匯入錯誤的文件 (#32811)

  • 清理我們的新安全頁面 (#32951)

  • 清理 Extras 參考頁面 (#32954)

  • 更新 Dag 觸發 API 和命令文件 (#32696)

  • 將棄用資訊新增到 Airflow 模組和類 docstring (#32635)

  • 格式化安裝文件以提高可讀性 (#32502)

  • 修復觸發器 HA 文件 (#32454)

  • 將型別註釋新增到程式碼示例 (#32422)

  • 記錄 cron 和 delta 時間表 (#32392)

  • 更新 index.rst 文件以更正語法 (#32315)

  • 修復 python.py 中的一個小拼寫錯誤 (#31474)

  • 分離並闡明提供程式的策略 (#30657)

  • 修復文件:向 pip install 新增“apache”字首 (#30681)

Airflow 2.6.3 (2023-07-10)

重大更改

run_id 的預設允許模式已更改為 ^[A-Za-z0-9_.~:+-]+$ (#32293)。

以前,run_id 字串上沒有驗證。現在有一個驗證正則表示式,可以透過在 scheduler 部分中配置 allowed_run_id_pattern 來設定。

Bug 修復

  • 使用線性時間正則表示式 (#32303)

  • 修復觸發器活動檢查併為觸發器心跳速率新增新的 conf (#32123)

  • 捕獲觸發器初始化失敗的異常 (#31999)

  • 從連線編輯表單中的 extra 隱藏敏感值 (#32309)

  • 清理 DagRun.run_id 並允許靈活性 (#32293)

  • 新增觸發器取消日誌 (#31757)

  • 修復任務檢視中顯示的嘗試次數 (#32361)

  • 重試事務以處理偶爾的呈現欄位死鎖 (#32341)

  • 修復匯入失敗時 LazyDictWithCache 的行為 (#32248)

  • 從 Job 中刪除 executor_class - 修復自定義執行器的回填 (#32219)

  • 修復有問題的單例實現 (#32218)

  • 使用 mapIndex 顯示每個對映任務的額外連結。 (#32154)

  • 確保如果非同步執行緒失敗,則主觸發器執行緒退出 (#32092)

  • 使用 re2 匹配不受信任的正則表示式 (#32060)

  • 在呈現欄位檢視中呈現列表項 (#32042)

  • 修復序列化 DAG 中 dag_dependencies 的雜湊處理 (#32037)

  • 如果在 multiple_outputs 任務中 XComArg 解析失敗,則返回 None (#32027)

  • 在 URL 的查詢引數和 kwargs 中檢查 DAG ID (#32014)

  • 當找不到對映索引時,在 rendered-templates 中顯示錯誤訊息而不是失敗 (#32011)

  • 修復噹噹前執行日期沒有任務組 TIs 時的 ExternalTaskSensor (#32009)

  • 修復觸發器模板中的數字引數 HTML 型別 (#31980, #31946)

  • 修復遮蔽巢狀變數欄位 (#31964)

  • 修復對映任務中的 operator_extra_links 屬性序列化 (#31904)

  • 解碼舊式巢狀 Xcom 值 (#31866)

  • 在 webserver base_url 中新增尾部斜槓的檢查 (#31833)

  • 修復主機包含 scheme 時的連線 URI 解析 (#31465)

  • 修復使用 xcom_pullinlets 時的資料庫會話關閉 (#31128)

  • 修復在測試 DAG 期間任務失敗時,DAG 的 on_failure_callback 未被呼叫 (#30965)

  • 修復使用 ExternalPythonOperator 和除錯日誌級別時的 airflow 模組版本檢查 (#30367)

其他/內部

  • 修復型別存根中的 task.sensor 註釋 (#31954)

  • Pydantic 限制為 < 2.0.0,直到我們解決 2.0.0 不相容問題 (#32312)

  • 修復 Pydantic 2 對模型定義的挑剔 (#32307)

僅文件更改

  • 新增關於標籤建立和清理的說明 (#32406)

  • 對文件的細微更新 (#32369, #32315, #32310, #31794)

  • 闡明 Listener API 行為 (#32269)

  • 為詢問 requirements 的使用者新增資訊 (#32262)

  • 在模板參考中新增 DAGRun / DAG / Task 的連結 (#32245)

  • 添加註釋以警告潛在的錯誤修復 (#32230)

  • 新增一個註釋,說明我們需要重新啟動 triggerer 才能反映任何觸發器的更改 (#32140)

  • 新增指向教程文件的缺失超連結 (#32105)

  • 新增可延遲和不可延遲運算子之間的區別 (#31840)

  • 添加註釋以解釋特殊“trigger end”日誌訊息的必要性 (#31812)

  • 外掛更新的文件更新 (#31781)

  • 修復安全文件中的 SemVer 連結 (#32320)

  • 更新 Airflow 的安全模型 (#32098)

  • 更新從 Airflow 核心到重組文件的引用 (#32282)

  • 分離出高階日誌記錄配置 (#32131)

  • 在顯眼位置為 Airflow 新增 符號 (#31977)

Airflow 2.6.2 (2023-06-17)

重大變更

沒有重大更改。

Bug 修復

  • 將 TaskInstance 級聯更新到 TaskMap 表 (#31445)

  • 修復 Kubernetes 執行器檢測已刪除的 Pod (#31274)

  • 為 mssql 的遷移方法使用關鍵字引數 (#31309)

  • 控制從 airflow.cfg 中的 extra 配置驅動程式配置的許可性 (#31754)

  • 修復 openapi/v1.yaml 中的損壞連結 (#31619)

  • 使用不同的值測試連線時,隱藏舊的警報框 (#31606)

  • 將 TriggererStatus 新增到 OpenAPI 規範 (#31579)

  • 解決當詳細資訊摺疊時,網格不會展開的問題 (#31561)

  • 修復標籤的排序 (#31553)

  • 當跳過下游任務時,將缺少的 map_index 新增到 xcom 鍵 (#31541)

  • 修復 airflow users delete CLI 命令 (#31539)

  • 在 Airflow /health 端點中包含 triggerer 健康狀態 (#31529)

  • 刪除已為此任務註冊的依賴項警告 (#31502)

  • 使用 kube_client 而不是預設的 CoreV1Api 來刪除 Pod (#31477)

  • 確保基本感測器中的最小退避時間至少為 1 (#31412)

  • 修復動態任務對映的 max_active_tis_per_dagrun (#31406)

  • 修復在 DAG 中預匯入模組時發生的錯誤處理 (#31401)

  • 修復下拉列表預設值並調整教程以使用 42 作為預設值進行證明 (#31400)

  • 修復在清除執行時,任務從正常狀態變為對映狀態時發生的崩潰 (#31352)

  • 使 BaseJobRunner 成為作業類的泛型 (#31287)

  • 修復 url_for_asset 回退和 DAG 審計日誌上的 404 錯誤 (#31233)

  • 不要顯示未定義的執行日期 (#31196)

  • 在日誌載入時新增微調器活動 (#31165)

  • 將 rediss 包含到支援的 URL 方案列表中 (#31028)

  • 透過跳過“不可排程”的 DAG 來最佳化排程器 (#30706)

  • 在搜尋排隊的 dag_runs 期間節省排程器執行時間 (#30699)

  • 修復 ExternalTaskSensor 以便與任務組一起正常工作 (#30742)

  • 修復當清除 access_control 時,DAG.access_control 無法同步 (#30340)

  • 修復最新 Python 3.8 和 3.9 的 get_safe_url 測試失敗 (#31766)

  • 修復 POST user 端點的型別 (#31767)

  • 修復巢狀組預設引數的錯誤更新 (#31776)

  • 修復覆蓋巢狀任務組中的 default_args (#31608)

  • [secrets] backend_kwargs 標記為敏感配置 (#31788)

  • 執行器事件並不總是在此處“退出” (#30859)

  • 驗證連線 ID (#31140)

其他/內部

  • 新增 Python 3.11 支援 (#27264)

  • 用標準 csv 庫替換 unicodecsv (#31693)

  • 將 unicodecsv 帶回作為 Airflow 的依賴項 (#31814)

  • 從 get_flat_relative_ids 中刪除 found_descendents 引數 (#31559)

  • 修復外部任務觸發器中的型別 (#31490)

  • 更好地表達下一個和上一個執行 DAG 列 (#31467)

  • 跳過使用 :meta private: 的自動文件 (#31380)

  • 為 sql_alchemy_connect_args conf 新增一個示例 (#31332)

  • 將 dask 上限繫結轉換為排除 (#31329)

  • 將 FAB 升級到 4.3.1 (#31203)

  • 在 airflow dags list-jobs CLI 中為 –state 標誌新增 metavar 和 choices,以建議有效的狀態引數。 (#31308)

  • 僅使用一行用於 tmp dir 日誌 (#31170)

  • 重述 setup.py 中的註釋 (#31312)

  • 在日誌記錄中新增所有者 fullname (#30185)

  • 使連線 ID 驗證在整個介面中保持一致 (#31282)

  • 使用單一的事實來源來獲取敏感配置項 (#31820)

僅文件更改

  • 為 _read_remote_logs 新增文件字串和簽名 (#31623)

  • 刪除有關 triggerer 僅為 3.7+ 的註釋 (#31483)

  • 修復版本支援資訊 (#31468)

  • 將缺少的 BashOperator 匯入新增到文件示例 (#31436)

  • 修復由不正確的初始引數引起的 task.branch 錯誤 (#31265)

  • 更新回撥文件(錯誤和上下文) (#31116)

  • 為具有非 TaskFlow 運算子的動態任務對映新增一個示例 (#29762)

  • 一些文件修復 - 連結、語法和措辭 (#31719)

  • 在更多的地方新增關於將 airflow 新增到 pip install 的描述 (#31448)

  • 修復 docker 構建文件中的表格格式 (#31472)

  • 更新約束安裝的文件 (#31882)

Airflow 2.6.1 (2023-05-16)

重大變更

澄清外部健康檢查機制和使用 Job 類 (#31277)。

過去,SchedulerJob 和其他 *Job 類已知用於執行 Airflow 元件的外部健康檢查。 然而,這些是 Airflow DB ORM 相關的類。 Airflow 的 DB 模型和資料庫結構被認為是內部實現細節,遵循 公共介面)。 因此,它們不應用於外部健康檢查。 相反,您應該為此目的使用 airflow jobs check CLI 命令(在 Airflow 2.1 中引入)。

Bug 修復

  • 修復 SchedulerJob 的健康檢查閾值的計算 (#31277)

  • 修復 k8s 執行器 pod 尾隨的 timestamp 解析失敗 (#31175)

  • 確保 DAG 處理器作業行在 job_type 列中填充了值 (#31182)

  • 修復 api_client_retry_configuration 的節名稱引用 (#31174)

  • 確保 KPO 正確執行 pod mutation hooks (#31173)

  • 從 OpenLineage 外掛中刪除令人擔憂的關於編輯的日誌訊息 (#31149)

  • interleave_timestamp_parser 配置移動到日誌記錄部分 (#31102)

  • 如果未找到本地或遠端日誌,請確保我們檢查 worker 是否提供日誌 (#31101)

  • 修復 taskinstance 檔案中的 MappedTaskGroup 匯入 (#31100)

  • 格式化 DagBag.dagbag_report() 輸出 (#31095)

  • 在任務詳細資訊檢視上遮蔽任務屬性 (#31125)

  • 修復迭代 None 值時的模板錯誤,並修復引數文件 (#31078)

  • 修復 apache-hive extra,使其安裝正確的軟體包 (#31068)

  • 修復在預匯入 Airflow 模組時,DAG 資料夾中 zip 檔案的問題 (#31061)

  • 將 TaskInstanceKey 移動到單獨的檔案以修復迴圈匯入 (#31033, #31204)

  • 修復刪除具有註釋的 DagRuns 和 TaskInstances (#30987)

  • 修復 airflow providers get 命令輸出 (#30978)

  • 修復 OpenAPI 規範中的 Pool 架構 (#30973)

  • 新增對包含 pandas.DataFrame 的模板欄位的動態任務的支援 (#30943)

  • 如果存在,則顯式使用傳遞給“partial”的任務組 (#30933)

  • 修復 list DAG rest api 中的 order_by 請求 (#30926)

  • 在居中任務邏輯中包含節點高度/寬度 (#30924)

  • 從 dag trigger 命令中刪除 print (#30921)

  • 改進新圖形中的任務組 UI (#30918)

  • 修復網格檢視中的對映狀態 (#30916)

  • 修復顯示圖形的問題 (#30765)

  • 修復 try_number 不同步時的回填 KeyError (#30653)

  • 重新啟用 TaskInstance UI 中的清除和設定狀態 (#30415)

  • 防止 DagRun 的 statestart_date 在清除正在執行的 DagRun 中的任務時被重置 (#30125)

其他/內部

  • 上限繫結 dask,直到他們解決其測試套件中的副作用 (#31259)

  • 在表格中顯示受清除影響的任務例項 (#30633)

  • 修復 API 文件中缺少的模型 (#31021)

僅文件更改

  • 改進 dag_processing.processes 指標的描述 (#30891)

  • 改進快速入門說明 (#30820)

  • 向 FAQ 新增有關缺少任務日誌的部分 (#30717)

  • 在 docker compose 中掛載 config 目錄 (#30662)

  • 更新 might_contain_dagmetrics_allow_listversion_added 配置欄位 (#30969)

Airflow 2.6.0 (2023-04-30)

重大變更

檔案任務處理程式日誌目錄和檔案的預設許可權已更改為“所有者 + 組”可寫 (#29506)。

預設設定處理需要模擬並且兩個使用者(airflow 和被模擬的使用者)都將同一組設定為主組的情況。之前,預設設定也是其他使用者可寫的,如果使用者希望使用其他使用者可寫的設定,可以透過配置 file_task_handler_new_folder_permissionsfile_task_handler_new_file_permissionslogging 部分中進行配置。

SLA 回撥不再將檔案新增到 dag 處理器管理器的佇列中 (#30076)

這可以防止 SLA 回撥使 dag 處理器管理器永久處於繁忙狀態。這意味著減少了 CPU 使用率,並修復了 SLA 阻止系統檢視對現有 dag 檔案更改的問題。添加了額外的指標來幫助跟蹤佇列狀態。

BaseTrigger 中的 cleanup() 方法現在定義為非同步(遵循 async/await 模式)(#30152)。

對於任何覆蓋 cleanup() 方法並使用同步程式碼的自定義觸發器實現,這可能是一個重大更改,但實際上在 cleanup 中使用同步操作是錯誤的,因為該方法是在 Triggerer 的主迴圈中執行的,並且引入了不必要的延遲,影響了其他觸發器。此更改不太可能影響任何現有的觸發器實現。

儀表 scheduler.tasks.running 不再存在 (#30374)

該儀表從未正常工作,其值始終為 0。要獲得此指標的準確值非常複雜,因此決定刪除此儀表比修復它但不能保證其值的正確性更有意義。

將任務停留在佇列中的處理整合到新的 task_queued_timeout 配置下 (#30375)

用於處理停留在佇列狀態的任務的邏輯已被整合,並且所有負責使停留在佇列中的任務超時的配置已被棄用併合併到 [scheduler] task_queued_timeout 中。已被棄用的配置是 [kubernetes] worker_pods_pending_timeout[celery] stalled_task_timeout[celery] task_adoption_timeout。如果設定了這些配置中的任何一個,將遵守最長的超時時間。例如,如果 [celery] stalled_task_timeout 是 1200,並且 [scheduler] task_queued_timeout 是 600,則 Airflow 會將 [scheduler] task_queued_timeout 設定為 1200。

改進變更

僅在配置檢視中顯示正在執行的配置 (#28892)

配置檢視現在僅顯示正在執行的配置。以前,預設配置顯示在頂部,但不清楚此預設配置是否被覆蓋。隨後,未記錄的端點 /configuration?raw=true 已被棄用,將在 Airflow 3.0 中刪除。HTTP 響應現在返回一個額外的 Deprecation 標頭。REST API 上的 /config 端點是以程式設計方式獲取 Airflow 配置的標準方法。

ExternalTaskSensor 的顯式跳過狀態列表 (#29933)

ExternalTaskSensor 現在有一個顯式的 skipped_states 列表

其他變更

處理下一個執行計算中指數退避的 OverflowError (#28172)

預設情況下,最大重試任務延遲設定為 24 小時(86400 秒)。您可以透過 core.max_task_retry_delay 引數全域性更改它。

將 Hive 宏移動到提供程式 (#28538)

Hive 宏(hive.max_partitionhive.closest_ds_partition)僅在安裝了 Hive Provider 時可用。使用這些宏時,請安裝 Hive Provider > 5.1.0。

更新了應用程式以支援配置 FIPS v2 的快取雜湊方法 (#30675)

在 Python 3.9+ 中執行 Airflow 時,進行了各種更新以實現 FIPS 合規性。這包括一個新的 Web 伺服器選項 caching_hash_method,用於更改預設的 flask 快取方法。

新特性

  • AIP-50 使用靈活使用者表單概念觸發 DAG UI 擴充套件 (#27063,#29376)

  • 當 PythonVirtualenvOperator 任務返回提供的退出程式碼時跳過該任務 (#30690)

  • 將 skip_exit_code 重新命名為 skip_on_exit_code 並允許提供多個程式碼 (#30692)

  • 還將 skip_on_exit_code 新增到 ExternalPythonOperator (#30738)

  • 為動態任務對映新增 max_active_tis_per_dagrun (#29094)

  • 為 pandas dataframe 新增序列化器 (#30390)

  • 可延期的 TriggerDagRunOperator (#30292)

  • 新增透過 CLI 獲取 DAG 詳細資訊的命令 (#30432)

  • 新增 ContinuousTimetable 並支援 @continuous schedule_interval (#29909)

  • 允許自定義規則來檢查檔案是否具有 dag (#30104)

  • 新增一個新的 Airflow conf 以指定 Kubernetes 客戶端的 SSL ca 證書 (#30048)

  • Bash sensor 具有顯式的重試程式碼 (#30080)

  • 將過濾器任務上游/下游新增到網格檢視 (#29885)

  • 新增透過 Airflow CLI 測試連線 (#29892)

  • 支援在使用遠端日誌記錄時刪除本地日誌檔案 (#29772)

  • Blocklist 用於停用特定的指標標籤或指標名稱 (#29881)

  • 在網格檢視中新增一個新的圖表 (#29413)

  • 新增資料庫 check_migrations 配置 (#29714)

  • cli.dags.trigger 新增輸出格式引數 (#29224)

  • 使 json 和 yaml 在模板中可用 (#28930)

  • 為現有的 Statsd 指標釋出事件啟用標記的指標名稱 | influxdb-statsd 支援 (#29093)

  • db export-archived 命令新增引數 –yes。 (#29485)

  • 使策略函式可插拔 (#28558)

  • 新增 airflow db drop-archived 命令 (#29309)

  • 啟用單獨的觸發器日誌記錄 (#27758)

  • 在圖形檢視中實現新的過濾選項 (#29226)

  • 為 ExternalTask 新增觸發器 (#29313)

  • 新增將清除的記錄匯出到 CSV 檔案的命令 (#29058)

  • 新增 FileTrigger (#29265)

  • 使用元資料標籤發出 DataDog statsd 指標 (#28961)

  • 為資料集新增一些 statsd 指標 (#28907)

  • connections import CLI 命令新增 –overwrite 選項 (#28738)

  • 向 DAG 新增通用的“notifier”概念 (#28569)

  • 新增一個新的 conf 以在跳過任務之前等待 past_deps (#27710)

  • 新增 K8s 上的 Flink Operator (#28512)

  • 允許使用者透過配置停用 SwaggerUI (#28354)

  • 在圖中顯示對映的任務組 (#28392)

  • Log FileTaskHandler 以與 KubernetesExecutor 的 multi_namespace_mode 配合使用 (#28436)

  • 新增一個新的配置,用於調整遮蔽的機密,以便更輕鬆地防止日誌中的機密洩露 (#28239)

  • 使用 cli 列出特定的配置部分及其值 (#28334)

  • KubernetesExecutor multi_namespace_mode 可以使用名稱空間列表,而無需群集角色 (#28047)

  • 自動儲存並允許恢復最近的 DAG 執行配置 (#27805)

  • 將 exclude_microseconds 新增到 cli (#27640)

改進

  • 在 KubernetesExecutor 中將大多數 pod_id 用法重新命名為 pod_name (#29147)

  • 更新僅輪詢感測器的無效用法的錯誤訊息 (#30821)

  • 更新排程程式關鍵部分邊緣情況下的日誌級別 (#30694)

  • AIP-51 從核心 Airflow 中刪除執行程式耦合 (AIP-51)

  • 在 BashOperator 的跳過邏輯中新增多個退出程式碼處理 (#30739)

  • 更新了應用以支援為 FIPS v2 配置快取雜湊方法 (#30675)

  • 在 dag 解析之前預載入 airflow 匯入以節省時間 (#30495)

  • 改進網格檢視中的任務和執行操作 UX (#30373)

  • 使用 group_id 的快取屬性加速 TaskGroups (#30284)

  • 使用會話中提供的引擎 (#29804)

  • 執行程式的型別相關匯入最佳化 (#30361)

  • 向程式碼庫新增更多型別提示 (#30503)

  • 始終在安全管理器中使用 self.appbuilder.get_session (#30233)

  • 將 SQLAlchemy select() 更新為新樣式 (#30515)

  • 從模型中重構出 xcom 常量 (#30180)

  • 將異常類名稱新增到 DAG 解析錯誤訊息 (#30105)

  • 將 statsd_allow_list 和 statsd_block_list 重新命名為 metrics_*_list (#30174)

  • 改進元組和集合的序列化 (#29019)

  • 使觸發器中的 cleanup 方法成為非同步方法 (#30152)

  • 延遲載入序列化模組 (#30094)

  • SLA 回撥不再將檔案新增到 dag_processing 管理器佇列 (#30076)

  • 將 task.trigger 規則新增到 grid_data (#30130)

  • 透過避免 ORM 來加速日誌模板同步 (#30119)

  • 將 cli_parser.py 分成兩個模組 (#29962)

  • ExternalTaskSensor 的顯式跳過狀態列表 (#29933)

  • 將任務狀態懸停突出顯示新增到新圖形 (#30100)

  • 在 url 引數中儲存網格選項卡 (#29904)

  • 使用自定義 Connexion 解析器來延遲載入 (#29992)

  • 延遲 Kubernetes 在秘密掩碼器中的匯入 (#29993)

  • 延遲 ConnectionModelView 初始化,直到訪問它 (#29946)

  • Scheduler,使過時的 DAG 停用閾值可配置,而不是使用 dag 處理超時 (#29446)

  • 改進網格檢視高度計算 (#29563)

  • 避免在 conf 驗證期間匯入執行程式 (#29569)

  • 使 FileTaskHandler 的許可權可組寫入且可配置 (#29506)

  • 在 Airflow CLI 命令的幫助輸出中新增顏色 #28789 (#29116)

  • 為 get_dags 端點新增引數,僅列出未暫停的 DAG (#28713)

  • 為 DAG 執行和任務例項端點暴露 updated_at 過濾器 (#28636)

  • 增加使用者識別符號列的長度 (#29061)

  • 更新甘特圖 UI 以顯示任務的排隊狀態 (#28686)

  • 在 log.dttm 上新增索引 (#28944)

  • 僅在配置檢視中顯示正在執行的配置 (#28892)

  • 動態限制下拉選單大小 (#28736)

  • 為連線編輯/新增 UI 的 extra 欄位新增 JSON linter。在連線編輯介面,現有的 extra 資料將以縮排格式顯示 (#28583)

  • 在 k8s exec 中使用標籤而不是 Pod 名稱來讀取 Pod 日誌 (#28546)

  • 使用時間而不是嘗試次數來進行排隊和執行的重新檢查 (#28586)

  • CustomTTYColoredFormatter 應該繼承 TimezoneAware formatter (#28439)

  • 改進 Airflow CLI tasks.run 命令中對 past depends 的處理 (#28113)

  • 支援在 on_*_callback/sla_miss_callbacks 中使用回撥列表 (#28469)

  • 更好的資料庫清理表名驗證 (#28246)

  • 在 config.yml 中,配置模板使用物件而不是陣列 (#28417)

  • 為任務註釋新增 Markdown 渲染 (#28245)

  • 在網格檢視中顯示對映的任務組 (#28208)

  • 在配置節中新增 renamedprevious_name (#28324)

  • 加速大多數 Users/Role CLI 命令 (#28259)

  • 加速 Airflow 角色列表命令 (#28244)

  • 重構序列化 (#28067, #30819, #30823)

  • 允許 k8s executor / KPO 使用更長的 Pod 名稱 (#27736)

  • 更新健康檢查端點以包含 triggerer 狀態 (#27755)

Bug 修復

  • 修復 cli 應用的 static_folder (#30952)

  • 初始化 cli appbuilder 的外掛 (#30934)

  • 修復 DAG 檔案處理器心跳,僅在必要時執行 (#30899)

  • 修復 KubernetesExecutor 將狀態傳送到排程器的問題 (#30872)

  • 僅當所有對映的上游任務都完成時才計數 (#30641)

  • ExternalTaskSensor: 將 external_task_group_id 新增到 template_fields (#30401)

  • 改進任務例項詳細資訊的 URL 檢測 (#30779)

  • 為 DAG 匯入錯誤橫幅使用 Material Icons (#30771)

  • 修復各種網格/圖形檢視 UI bug (#30752)

  • 新增一個摺疊網格按鈕 (#30711)

  • 修復 d3 依賴 (#30702)

  • 簡化邏輯以解決卡在排隊中的任務,儘管 stalled_task_timeout 已到期 (#30375)

  • 清除任務例項時,嘗試從資料庫獲取關聯的 DAG (#29065)

  • 修復當提供 DAG 預設引數時,對映的任務部分引數 (#29913)

  • 停用從 zip 檔案中刪除的 DAG (#30608)

  • 透過檢索最新的 resource_version,從 too old resource version exception 中恢復 (#30425)

  • 修復重新整理 DAG 時可能出現的競爭條件 (#30392)

  • 為 OpenAPI 請求正文使用自定義驗證器 (#30596)

  • 修復帶有可延期引數的 TriggerDagRunOperator (#30406)

  • 加速 DAG 執行刪除 (#30330)

  • 不要使用模板文字來構造 HTML 元素 (#30447)

  • 修復 example_sensor_decorator DAG 中的棄用警告 (#30513)

  • 避免在 triggerer 作業日誌中記錄敏感資訊 (#30110)

  • 為基本感測器新增一個新引數,以捕獲 poke 方法中的異常 (#30293)

  • 修復帶有非 JSON 可序列化值的 DAG 執行配置編碼 (#28777)

  • 添加了修復程式,使 Airflow 可以在 Windows Dask-Workers 上使用 (#30249)

  • 強制 DAG 最後修改時間為 UTC (#30243)

  • 修復示例 DAG 中的 EmptySkipOperator (#30269)

  • 使 Web 伺服器啟動尊重 update_fab_perms (#30246)

  • 更改日誌資料夾許可權時忽略錯誤 (#30123)

  • 停用按註釋對 DagRuns 進行排序 (#30043)

  • 修復從已完成的 KubernetesExecutor worker pod 讀取日誌的問題 (#28817)

  • 比較檔案模式時,遮蔽非訪問位 (#29886)

  • 從 UI 中刪除執行任務操作 (#29706)

  • 修復舊版日誌檢視的日誌尾部問題 (#29496)

  • 修復 DebugExecutor 如何處理感測器 (#28528)

  • 確保在記錄 Pod 名稱之前呼叫 pod_mutation_hook (#28534)

  • 處理 next_run_calculation 中指數退避時的 OverflowError (#28172)

其他/內部

  • 使 Eager Upgrade 的其他依賴項成為可選 (#30811)

  • 升級到 pip 23.1.1 (#30808)

  • 從 Eager Upgrade 中刪除 protobuf 限制 (#30182)

  • 從 Eager Upgrade 中刪除 protobuf 限制 (#30182)

  • 棄用 BashOperator 中的 skip_exit_code (#30734)

  • 刪除 gauge scheduler.tasks.running (#30374)

  • 將 json5 升級到 1.0.2,將 eslint-plugin-import 升級到 2.27.5,位於 /airflow/www 中 (#30568)

  • 為 PythonOperator 新增測試 (#30362)

  • 將 asgiref 新增為核心依賴項 (#30527)

  • 發現安全模式切換註釋說明 (#30459)

  • 升級 moment-timezone 包以修復 Tehran 時區 (#30455)

  • 將 loader-utils 從 2.0.0 升級到 2.0.4,位於 /airflow/www 中 (#30319)

  • 將 babel-loader 從 8.1.0 升級到 9.1.0,位於 /airflow/www 中 (#30316)

  • DagBag: 在異常訊息中使用 dag.fileloc 而不是 dag.full_filepath (#30610)

  • 更改序列化資訊的日誌級別 (#30239)

  • 小的 DagRun 輔助方法清理 (#30092)

  • 改進 stats.py 中的型別提示 (#30024)

  • importlib-metadata backport 限制為 < 5.0.0 (#29924)

  • 使 cncf 提供程式檔名與 AIP-21 對齊 (#29905)

  • 將 FAB 升級到 4.3.0 (#29766)

  • 清除測試中的 ExecutorLoader 快取 (#29849)

  • 在 UI 中延遲載入任務例項日誌 (#29827)

  • 為超過 API 呼叫次數的最大頁面限制新增警告日誌 (#29788)

  • 積極地快取程序中的入口點 (#29625)

  • 不要使用 importlib.metadata 獲取版本以提高速度 (#29723)

  • 將 Mypy 升級到 1.0 (#29468)

  • db export-cleaned 重新命名為 db export-archived (#29450)

  • listener:透過直接呼叫替換 SQLAlchemy 事件監聽來簡化 API (#29289)

  • Bash 環境變數沒有多行日誌條目 (#28881)

  • 切換到 ruff 以進行更快的靜態檢查 (#28893)

  • 刪除 TI 日誌中的水平線 (#28876)

  • 使 allowed_deserialization_classes 更直觀 (#28829)

  • 在 k8s executor pod 中將日誌傳播到 stdout (#28440, #30860)

  • 修復程式碼可讀性,向 json_client 新增文件字串 (#28619)

  • AIP-51 - 其他相容性檢查 (#28375)

  • 修復 LocalKubernetesExecutor 的 is_local (#28288)

  • 將 Hive 宏移動到 provider (#28538)

  • 重新執行不穩定的 PinotDB 整合測試 (#28562)

  • 新增 pre-commit hook 以檢查會話預設值 (#28007)

  • 重構 web UI 的 get_mapped_group_summaries (#28374)

  • 新增對 k8s 1.26 的支援 (#28320)

  • 用 time-machine 替換 freezegun (#28193)

  • 完成 airflow/kubernetes/* 的 D400 (#28212)

  • 完成多個資料夾的 D400 (#27969)

  • 刪除 k8s 1.21 和 1.22 支援 (#28168)

  • 從 k8s 排程器類中刪除未使用的 task_queue 屬性 (#28049)

  • 完成多個資料夾的 D400 (#27767, #27768)

僅文件更改

  • 新增關於如何避免意外 Airflow 升級/降級的說明 (#30813)

  • 新增關於如何編寫任務日誌的明確資訊 (#30732)

  • 更好地解釋如何從任務中記錄日誌 (#30746)

  • 為 Dataset 使用正確的匯入路徑 (#30617)

  • 建立 audit_logs.rst (#30405)

  • 為感測器新增 taskflow API 示例 (#30344)

  • 新增關於時區感知 DAG 的說明 (#30467)

  • 清晰化引數文件 (#30345)

  • 修復任務持續時間指標的單位 (#30273)

  • 更新 dag-run.rst 以處理 cli 命令的死連結 (#30254)

  • 新增編寫高效 Python 程式碼部分到降低 DAG 複雜性 (#30158)

  • 允許使用 *_lookup_pattern 引數指定後端中正在查詢的連線、變數或配置 (#29580)

  • 為通知功能擴充套件新增文件 (#29191)

  • 闡明執行器介面是公共的,但例項不是 (#29200)

  • 向 Airflow 文件新增公共介面描述 (#28300)

  • 為任務組對映新增文件 (#28001)

  • 對指標文件進行了一些修復 (#30290)

Airflow 2.5.3 (2023-04-01)

重大變更

沒有重大更改。

Bug 修復

  • 修復獨立 dag-processor 的 DagProcessorJob 整合 (#30278)

  • 修復 gunicorn 掛起時的正確終止 (#30188)

  • 修復 XCom.get_one 完全一個異常文字 (#30183)

  • 更正 VARCHAR 大小為 250 (#30178)

  • 當任務收到 SIGTERM 時,恢復 on_failure_callback 的修復 (#30165)

  • 將只讀屬性移動到 DagState 以修復生成的文件 (#30149)

  • 確保 dag.partial_subset 不會改變任務組屬性 (#30129)

  • 修復 airflow dags next-execution cli 命令的不一致返回值 (#30117)

  • 修復 www/utils.dag_run_link 重定向 (#30098)

  • 當對映的任務計數為 0 時,修復 TriggerRuleDep (#30084)

  • Dag processor manager,將 retry_db_transaction 新增到 _fetch_callbacks (#30079)

  • 修復 mysql 資料庫的 db clean 命令 (#29999)

  • 避免在 mini scheduler 中考慮 EmptyOperator (#29979)

  • 修復了一些長期存在的圖形檢視介面問題 (#29971, #30355, #30360)

  • 修復了 DAG 文件切換圖示的初始角度 (#29970)

  • 修復了 DAG 介面中的標籤選擇 (#29944)

  • 將 airflow/example_dags/sql/sample.sql 包含到 MANIFEST.in 中 (#29883)

  • 修復了 /taskinstance/list 檢視中的損壞的過濾器 (#29850)

  • 允許使用通用引數字典 (#29782)

  • 修復了 patch variable 路由中的 update_mask (#29711)

  • 如果 instance_name_has_markup = True,則從 app_name 中刪除標記 (#28894)

其他/內部

  • 恢復 “也限制 Python 3.9 上的 importlib (#30069)” (#30209)

  • 將 custom_operator_name 新增到 @task.sensor 任務 (#30131)

  • 在 /airflow/www 中將 webpack 從 5.73.0 升級到 5.76.0 (#30112)

  • 格式化配置 (#30103)

  • 刪除 astroid 的上限限制 (#30033)

  • 刪除意外合併的供應商守護程序補丁程式碼 (#29895)

  • 修復 airflow tasks test 命令中關於缺少 data_interval 的警告 (#27106)

僅文件更改

  • 新增關於頂級程式碼的更多資訊 (#30040)

  • 更新 workday 示例 (#30026)

  • 修復 DAG 文件中的一些拼寫錯誤 (#30015)

  • 更新 set-up-database.rst (#29991)

  • 修復 Kubernetes 文件中的一些拼寫錯誤 (#29936)

  • 修復一些標點符號和語法 (#29342)

Airflow 2.5.2 (2023-03-15)

重大更改

作為 API 引數或引數傳遞的日期時間欄位應符合 RFC3339 標準 (#29395)

在 API 呼叫的情況下,作為日期時間欄位一部分傳遞的“+”可能未進行 URL 編碼,並且此類日期時間欄位可以透過驗證。 此類日期時間引數現在應進行 URL 編碼(如 %2B)。

對於引數,我們仍然允許符合 IS8601 標準的日期時間(例如,可以使用的“ ”代替 T 分隔日期和時間,並且未指定時區),但我們會發出棄用警告。

[webserver] expose_hostname 的預設值已更改為 False (#29547)

[webserver] expose_hostname 的預設值已設定為 False,而不是 True。 這意味著管理員必須選擇啟用才能將 Web 伺服器主機名公開給終端使用者。

Bug 修復

  • 修復 API 和引數模式中日期時間欄位的驗證 (#29395)

  • 修復大型日誌的網格日誌 (#29390)

  • 修復任務收到 SIGTERM 時的 on_failure_callback (#29743)

  • 更新 python-daemon 的最低版本以修復 containerd 檔案限制 (#29916)

  • 如果 dag 未啟用,則 POST /dagRuns API 應返回 404 (#29860)

  • 切換頁面時,DAG 列表排序丟失 (#29756)

  • 修復當清除先前執行的普通任務(現在是對映任務)時,排程程式崩潰的問題 (#29645)

  • 將帶有時區的 moment 轉換為 UTC,而不是引發異常 (#29606)

  • 透過新增其他返回型別來修復 clear dag run openapi 規範響應 (#29600)

  • 不要在任務例項詳細資訊頁面中顯示空的呈現屬性 (#29545)

  • 從 get-value 命令中刪除 section 檢查 (#29541)

  • 不要為未經身份驗證的使用者在 UI 回溯中顯示版本/節點 (#29501)

  • 使 prev_logical_date 變數具有偏移感知能力 (#29454)

  • 修復對映運算子中巢狀欄位的呈現 (#29451)

  • 資料集,next_run_datasets,刪除不必要的時間戳過濾器 (#29441)

  • Edgemodifier 在 TaskGroup 邊緣情況下使用標籤進行重構 (#29410)

  • 修復 Rest API 更新使用者輸出 (#29409)

  • 確保已刪除序列化 DAG (#29407)

  • 如果顯式設定,則在 TaskFlow API 中持久化 DAG 和任務文件值 (#29399)

  • 使用所有引數重定向到原始頁面 (#29212)

  • 修復僅在手動 DAG 執行情況下的任務持續時間檢視 (#22015) (#29195)

  • 刪除 poke 方法以回退到父實現 (#29146)

  • PR:引入修復以在 Windows 系統上執行任務 (#29107)

  • 修復關於舊配置的遷移中的警告 (#29092)

  • 超時時發出 dagrun 失敗持續時間 (#29076)

  • 處理叢集策略本身的錯誤 (#29056)

  • 修復 REST API 的 Kerberos 身份驗證。 (#29054)

  • 修復透過異常上的 V1EnvVar 洩漏敏感欄位的問題 (#29016)

  • 在傳遞之前,清理 url_for 引數 (#29039)

  • 修復帶有註釋的 dag 執行觸發器。 (#29228)

  • 透過 API 觸發 DAG 執行時,將操作日誌寫入資料庫 (#28998)

  • 解析 pickled XCom 迭代器中的所有變數 (#28982)

  • 允許在 airflow connections add 中使用沒有 authority 和 host 塊的 URI (#28922)

  • 在使用 KubernetesExecutor 時更有選擇性地採用 pod (#28899)

  • KubenetesExecutor 即使成功也會發送狀態 (#28871)

  • 註釋我們不刪除的 KubernetesExecutor pod (#28844)

  • 限制流式日誌讀取 (#28818)

  • 引入 dag 處理器作業 (#28799)

  • 修復 #28391 從 UI 手動觸發任務對於 k8s 執行程式失敗的問題 (#28394)

  • 當外部 dag 不為 none 並且 task_id 和 task_ids 為 none 時,記錄 poke 資訊 (#28097)

  • 修復檢查 DAG 的編輯許可權中的不一致問題 (#20346)

其他/內部

  • 新增對不可模板化欄位的檢查 (#29821)

  • 刪除 continue for not in (#29791)

  • 移動網格檢視中的額外連結位置 (#29703)

  • undici5.9.1 升級到 5.19.1 (#29583)

  • 將 expose_hostname 預設值更改為 false (#29547)

  • 更改 airflow 建立的 config/password 檔案的許可權 (#29495)

  • 使用較新的 setuptools v67.2.0 (#29465)

  • 增加網格檢視元素的最大高度 (#29367)

  • 闡明 worker 控制配置的描述 (#29247)

  • ua-parser-js0.7.31 升級到 0.7.33,位於 /airflow/www 中 (#29172)

  • 刪除 pytest 的上限限制 (#29086)

  • 連結到 graph/gantt 檢視時,檢查 run_id url 引數 (#29066)

  • 闡明圖形檢視動態任務標籤 (#29042)

  • 修復資料集的匯入錯誤 (#29007)

  • 更新 PythonSensor 如何從 python_callable 返回值 (#28932)

  • 新增 dep 上下文描述以獲得更好的日誌訊息 (#28875)

  • swagger-ui-dist3.52.0 升級到 4.1.3,位於 /airflow/www 中 (#28824)

  • importlib-metadata 向後移植限制為 < 5.0.0 (#29924, #30069)

僅文件更改

  • 更新 pipeline.rst - 修復 merge_data() 任務中的查詢 (#29158)

  • 更正 timetable.rst 中 Workday 時間表的引數名稱 (#29896)

  • 更新 Connection how-to 文件中 env var 連結的 ref 錨點 (#29816)

  • 更好地描述 api 中的限制 (#29773)

  • dag_processing.last_duration 的描述 (#29740)

  • 更新有關 template_fields 型別和子類的文件 (#29725)

  • 修復 TaskFlow 概念中資料集入口/出口註釋的格式 (#29678)

  • 特定用例:透過 compose 中的 requirements.txt 新增軟體包 (#29598)

  • 檢測“docker-compose”是否存在 (#29544)

  • 將著陸時間條目新增到 UI 文件 (#29511)

  • 改進示例 docker-compose 中的執行狀況檢查並闡明用法 (#29408)

  • 從 TriggerDagRunOperator 文件字串中刪除 notes 引數 (#29298)

  • 在 Timetables 文件中使用 schedule 引數而不是 timetable (#29255)

  • 將觸發器程序新增到 Airflow Docker 文件 (#29203)

  • 更新 set-up-database.rst (#29104)

  • Params 文件的幾個改進 (#29062)

  • 電子郵件配置文件中更明確的環境變數示例 (#28845)

  • 添加了偵聽器外掛示例 (#27905)

Airflow 2.5.1 (2023-01-20)

重大更改

透過環境變數觸發 gevent monkeypatching (#28283)

如果您正在使用 gevent 進行 Web 伺服器部署,並且使用本地設定來 monkeypatch gevent,您可能希望將本地設定修補替換為在 Web 伺服器中將 _AIRFLOW_PATCH_GEVENT 環境變數設定為 1。 這確保儘早完成 gevent 修補。

Bug 修復

  • 修復非敏感環境變數的遮蔽 (#28802)

  • 從 connexion 中刪除 swagger-ui 額外元件,並透過 npm 包安裝 swagger-ui-dist (#28788)

  • 修復設定 AUTH_ROLE_PUBLIC 時的 UIAlert should_show (#28781)

  • 僅在採用 pod 時修補單個標籤 (#28776)

  • 更新 CSRF 令牌以隨會話過期 (#28730)

  • 修復對映任務例項的 “airflow tasks render” cli 命令 (#28698)

  • 允許 ExternalTaskSensor 的 external_task_ids 使用 XComArgs (#28692)

  • 行鎖定 TIs 以在對映任務擴充套件期間刪除 (#28689)

  • 處理執行程式清理中的 ConnectionReset 異常 (#28685)

  • 修復 gunicorn 的 access_log 的輸出重定向的描述 (#28672)

  • 將 join 添加回在 #28198 中刪除的殭屍查詢 (#28544)

  • 修復 CronTriggerTimeTable dags 的日曆檢視 (#28411)

  • 執行 DAG 後,employees 表為空。(#28353)

  • 修復在 DAG 解析過程中查詢殭屍程序時出現的 DetachedInstanceError。(#28198)

  • 將頭部塊巢狀在 divs 中,以修復 dag.html 上的 dagid 複製錯誤。(#28643)

  • 修復 UI 箭頭方向。(#28624)

  • 在觸發規則依賴項中保護尚未展開的 ti。(#28592)

  • 將 TI setNote 端點移動到 OpenAPI 中的 TaskInstance 下。(#28566)

  • CronTriggerTimetable 中考慮之前的執行。(#28532)

  • 確保檔案任務處理程式中的日誌目錄正確。(#28477)

  • 修復執行器配置中錯誤的 pickled pods。(#28454)

  • 在觸發 DAG 執行 API 中新增 ensure_ascii=False。(#28451)

  • 在 MappedOperator 上新增 setters 到 on_*_callbacks。(#28313)

  • 修復 deferred 和 up_for_reschedule 任務的 ti._try_number。(#26993)

  • callModal 從 dag.js 中分離出來。(#28410)

  • 手動執行不能看起來像計劃執行。(#28397)

  • 當沒有 start_date 時,不要顯示任務/執行持續時間。(#28395)

  • 在任務日誌中保持手動滾動位置。(#28386)

  • 正確選擇對映任務的“previous”任務。(#28379)

  • 透過環境變數觸發 gevent monkeypatching (#28283)

  • 修復 db 清理警告。(#28243)

  • 使引數 'offset' 和 'length' 成為非必需引數。(#28234)

  • 使即時日誌讀取適用於“其他” k8s 執行器。(#28213)

  • LazyXComAccess 新增自定義 pickling hooks。(#28191)

  • 修復下一個執行資料集錯誤。(#28165)

  • 確保 @dag 裝飾器的警告在 DAG 檔案中報告。(#28153)

  • 當使用 airflow dags tests 命令時不發出警告。(#28138)

  • 確保當檔案被刪除時,dagbag_size 指標會減小。(#28135)

  • 改進執行/任務網格檢視操作。(#28130)

  • 使 BaseJob.most_recent_job 優先選擇“running” jobs。(#28119)

  • 當代碼未呼叫舊鍵時,不要發出 FutureWarning。(#28109)

  • 在 compose 中將 airflow.api.auth.backend.session 新增到後端會話。(#28094)

  • 解決關於在移動專案上呼叫 conf.get 的錯誤警告。(#28075)

  • 返回將被更改的任務列表。(#28066)

  • 在解析 DAG 時,優雅地處理錯誤的 zip 檔案。(#28011)

  • 防止從本地路徑重複載入 providers。(#27988)

  • 修復連結多個空對映任務時出現的死鎖。(#27964)

  • 修復:TaskInstance 上的 current_state 方法不按 map_index 過濾。(#27898)

  • 如果資料庫未初始化,則不要記錄 CLI 操作。(#27851)

  • 確保我們可以擺脫錯誤的排程器狀態。(#27834)

  • dagrun,next_dagruns_to_examine,新增 MySQL 索引提示。(#27821)

  • 處理 DAG 驗證發生時 DAG 消失的情況。(#27720)

  • 修復:繼續檢查 sla。(#26968)

  • 允許在沒有 conn type 時生成連線 URI。(#26765)

其他/內部

  • 在 eventlet 修復後,移除 dnspython 的限制。(#29004)

  • dnspython 限制為 < 2.3.0,直到 eventlet 不相容問題解決。(#28962)

  • 在示例 DAG 索引中新增自動版本替換。(#28090)

  • 清理外掛示例並進行整理。(#28537)

  • SQLAlchemy 限制為低於 2.0。(#28725)

  • /airflow/www 中的 json51.0.1 升級到 1.0.2。(#28715)

  • 修復一些關於將感測器與 taskflow 結合使用的文件。(#28708)

  • 將 Architecture 和 OperatingSystem 類更改為 Enums。(#28627)

  • 新增文件字串並對 email util 進行小的改進。(#28634)

  • 修復 Connection.get_extra 型別。(#28594)

  • navbar,限制下拉選單大小,並新增捲軸。(#28561)

  • 從正確的源位置發出 conf.get* 的警告。(#28543)

  • 將我們的 MyPY 外掛移動到 dev 資料夾。(#28498)

  • purge_inactive_dag_warnings 新增重試。(#28481)

  • 在 ARM 上重新啟用 Plyvel,因為它現在可以乾淨地構建。(#28443)

  • 為 LocalTaskJob 和 workers 新增 SIGUSR2 處理程式以幫助除錯。(#28309)

  • test_task_command 轉換為 Pytest 並在其中 unquarantine 測試。(#28247)

  • 使無效字元異常更具可讀性。(#28181)

  • /airflow/www 中的 decode-uri-component 從 0.2.0 升級到 0.2.2。(#28080)

  • 對於未啟動的執行器,使用斷言代替異常。(#28019)

  • 簡化資料集 subgraph 邏輯。(#27987)

  • map_index 排序 TIs。(#27904)

  • 有關 LocalTaskJob 中 Segmentation Fault 的更多資訊。(#27381)

僅文件更改

  • 在叢集策略文件中提及對映的運算子。(#28885)

  • 稍微改進動態 DAG 生成前言的描述。(#28650)

  • 重組文件。(#27235)

  • 更新關於低優先順序任務的排程程式文件。(#28831)

  • 闡明版本化的約束在釋出時是固定的。(#28762)

  • 闡明關於 docker compose 的資訊。(#28729)

  • 為動態任務對映新增一個示例 dag。(#28325)

  • 使用 docker compose v2 命令。(#28605)

  • 將 AIRFLOW_PROJ_DIR 新增到 docker-compose 示例。(#28517)

  • 刪除過時的可選 Provider Feature 過時文件。(#28506)

  • 新增 [core] mp_start_method config 的文件。(#27993)

  • LocalTaskJob 返回程式碼計數器的文件。(#27972)

  • 注意支援哪些 Python 版本。(#27798)

Airflow 2.5.0 (2022-12-02)

重大更改

airflow dags test 不再執行回填作業。(#26400)

為了使 airflow dags test 作為測試和除錯工具更有用,我們不再執行回填作業,而是執行“本地任務執行器”。使用者仍然可以使用 airflow dags backfill 命令回填他們的 DAG。

Airflow 配置節 kubernetes 重新命名為 kubernetes_executor。(#26873)

KubernetesPodOperator 不再考慮任何核心 kubernetes 配置引數,因此本節現在僅適用於 kubernetes 執行器。重新命名它減少了潛在的混淆。

一旦 ExternalTaskSensor 的任何依賴任務失敗,現在就會丟擲 AirflowException。(#27190)

當設定了 failed_states,使用了 execute_date_fn,並且部分(但不是全部)依賴任務失敗時,ExternalTaskSensor 不再無限期地掛起。相反,一旦任何依賴任務失敗,就會丟擲 AirflowException。除了超時之外,任何處理此失敗的程式碼都應移動到快取 AirflowException BaseClass,而不僅僅是 AirflowSensorTimeout 子類。

Airflow 配置選項 scheduler.deactivate_stale_dags_interval 已重新命名為 scheduler.parsing_cleanup_interval。(#27828)。

舊選項將繼續工作,但會發出棄用警告,並且將在 Airflow 3 中完全刪除。

新功能

  • TaskRunner:通知元件啟動和完成。(#27855)

  • 將 DagRun 狀態更改新增到 Listener 外掛系統。(#27113)

  • 原始任務返回程式碼的指標。(#27155)

  • 新增邏輯,使 XComArg 可以拉取特定的 map indexes。(#27771)

  • 清除 TaskGroup (#26658, #28003)

  • 新增關鍵部分查詢持續時間指標。(#27700)

  • 新增:#23880 :: AirflowModelViews(Variables/Connection) 的審計日誌 (#24079, #27994, #27923)

  • 新增 postgres 15 支援。(#27444)

  • 在執行時擴充套件對映組中的任務。(#27491)

  • 重置提交,清理子模組。(#27560)

  • scheduler_job,為排程器迴圈計時器新增指標。(#27605)

  • 允許在 taskflow 中使用資料集。(#27540)

  • 將 expanded_ti_count 新增到 ti 上下文。(#27680)

  • 向任務例項和 dag 執行新增使用者評論。(#26457, #27849, #27867)

  • 啟用將 DagRun JSON 複製到剪貼簿。(#27639)

  • 為 SLAs 實施額外的控制。(#27557)

  • 在 DAG 檢視中新增 dag 解析時間。(#27573)

  • 在 BaseSensor 中為 exponential_backoff 新增 max_wait。(#27597)

  • 在解析時擴充套件對映組中的任務。(#27158)

  • 在回填中新增停用重試標誌。(#23829)

  • 新增感測器裝飾器。(#22562)

  • Api endpoint update ti (#26165)

  • 按最近更新事件過濾資料集。(#26942)

  • 支援 Is /not Null 過濾器,用於 webui 上值為 None 的情況。(#26584)

  • 向資料集列表新增搜尋。(#26893)

  • 在對映的運算子中分離並處理 ‘params’。(#26100)

  • 新增用於 TaskGroup 對映的 authoring API (#26844)

  • 新增 one_done 觸發規則 (#26146)

  • 建立一個更高效的 airflow dag 測試命令,並具有更好的本地日誌記錄 (#26400)

  • 支援新增/刪除角色許可權的命令 (#26338)

  • 在 Web UI 中自動 tail 檔案日誌 (#26169)

  • 在 API 中將 triggerer 資訊新增到任務例項 (#26249)

  • 用於反序列化自定義 XCom 後端值的標誌 (#26343)

改進

  • 允許深度優先執行 (#27827)

  • UI: 如果資料更改,則更新偏移高度 (#27865)

  • 改進 TriggerRuleDep 型別和可讀性 (#27810)

  • 使需要會話的檢視僅使用關鍵字引數 (#27790)

  • 使用顯式 task_ids 和 map_indexes 最佳化 TI.xcom_pull() (#27699)

  • 允許 k8s executor 使用的 pod id 中包含連字元 (#27737)

  • 最佳化任務例項過濾 (#27102)

  • 使用上下文管理器來簡化日誌服務管理 (#27756)

  • 修復格式化遺留問題 (#27750)

  • 改進任務死鎖訊息 (#27734)

  • 改進“sensor 超時”訊息 (#27733)

  • 將 urlparse 替換為 urlsplit (#27389)

  • 使 TaskGroup 語義與 AbstractOperator 對齊 (#27723)

  • 在 dag 處理的每個迴圈中向解析佇列新增新檔案 (#27060)

  • 使 Kubernetes Executor 和 Scheduler 在 PMH 執行期間對錯誤具有彈性 (#27611)

  • 將資料集依賴項分離到單獨的圖中 (#27356)

  • 使用 log.exception,它比 log.error 更經濟 (#27517)

  • 將驗證 branch_task_ids 移動到 SkipMixin (#27434)

  • 強制 LazyXComAccess 在推送到 XCom 時轉換為列表 (#27251)

  • 更新 cluster-policies.rst 文件 (#27362)

  • 如果連線型別已在 provider 中註冊,則新增警告 (#27520)

  • 使用 –verbose 選項在命令中啟用除錯日誌記錄 (#27447)

  • 為 Python Operators 新增經典示例 (#27403)

  • .first() 更改為 .scalar() (#27323)

  • 改進 reset_dag_run 描述 (#26755)

  • 新增關於 sensors 的示例和 howtos (#27333)

  • 使網格檢視寬度可調整 (#27273)

  • 在名稱之前按類別對外掛自定義菜單鏈接進行排序 (#27152)

  • 簡化 DagRun.verify_integrity (#26894)

  • 將對映的任務組資訊新增到序列化 (#27027)

  • 更正網格檢視中 Run config 使用的 JSON 樣式 (#27119)

  • UI 行為不需要 extra__conn_type__ 字首 (#26995)

  • 改進資料集更新摘要 (#26878)

  • 將 kubernetes config section 重新命名為 kubernetes_executor (#26873)

  • 解碼資料集搜尋的引數 (#26941)

  • 刪除 DAGRun 詳細資訊頁面,完全依賴網格 (#26837)

  • 修復使用 hostname_callable 時的 scheduler crashloopbackoff (#24999)

  • 減少 KubernetesExecutor 中的日誌冗餘 (#26582)

  • 不要無緣無故地迭代兩次 tis 列表 (#26740)

  • PodGenerator.deserialize_model_file 的更清晰程式碼 (#26641)

  • 除非您有 V1Pod,否則不要匯入 kubernetes (#26496)

  • 將 updated_at 列新增到 DagRun 和 Ti 表 (#26252)

  • 將自定義 XCom 後端的反序列化移動到 2.4.0 (#26392)

  • 避免在需要一個專案時計算所有元素 (#26377)

  • 透過 isort 自動新增 __future__.annotations (#26383)

  • 在序列化 expand_kwargs 時處理列表 (#26369)

  • 將 PEP-563(延遲評估註解)應用於核心 airflow (#26290)

  • 新增更多工作日 operator 和 sensor 示例 #26071 (#26098)

  • 使 TaskGroup 語義與 AbstractOperator 對齊 (#27723)

Bug 修復

  • 優雅地處理整個配置部分被重新命名的情況 (#28008)

  • 在反序列化期間新增匯入的允許列表 (#27887)

  • 軟刪除 DAG 計劃或任務出口中不再引用的資料集 (#27828)

  • 當 URL 中沒有有效的 tags 時,重定向到主頁檢視 (#25715)

  • 重新整理 dags 檢視中的下一次執行資料集資訊 (#27839)

  • 使 MappedTaskGroup 依賴於其擴充套件輸入 (#27876)

  • 使暫停的 DAG 的 DagRun 狀態更新更快 (#27725)

  • 不要在任務執行命令上顯式地將 include_examples 設定為 False (#27813)

  • 修復選單邊框顏色 (#27789)

  • 修復回填排隊的任務被重置為計劃狀態的問題 (#23720)

  • 修復從父 dag 清除子 dag 對映任務的問題 (#27501)

  • 處理任務回撥中 V1Pod 的 json 編碼 (#27609)

  • 修復 ExternalTaskSensor 無法檢查 zipped dag 的問題 (#27056)

  • 避免在 TriggerDagRunOperator 中重新獲取 DAG 執行 (#27635)

  • 在檢索元資料時繼續執行 (#27665)

  • 外部任務 sensor 失敗修復 (#27190)

  • 在 pop 操作時新增預設的 None (#27537)

  • 在觸發 dag 檢視中顯示來自序列化 dag 的引數值 (#27482, #27944)

  • 將 TriggerDagRun conf 檢查移動到 execute (#27035)

  • 解決觸發器分配競爭條件 (#27072)

  • 更新 google_analytics.html (#27226)

  • 修復 web ui dags 列表頁面中的一些 bug (自動重新整理 & 跳轉搜尋空狀態) (#27141)

  • 修復 docker-compose.yaml 的 broken URL (#26721)

  • 修復 xcom arg.py .zip bug (#26636)

  • 修復 404 taskInstance 錯誤並將其拆分為兩個表 (#26575)

  • 修復瀏覽器警告的不當執行緒使用 (#26551)

  • template rendering issue fix (#26390)

  • 如果有任何匯入錯誤,則清除 autoregistered DAG (#26398)

  • 修復 from airflow import version 的延遲匯入 (#26239)

  • 允許在觸發的 dag runs 模態框中滾動 (#27965)

其他/內部

  • 刪除 is_mapped 屬性 (#27881)

  • 簡化 FAB 表重置 (#27869)

  • 修復 Base Sensor 中的舊式型別 (#27871)

  • 切換(返回)到延遲匯入 (#27730)

  • 完成了多個資料夾的 D400 (#27748)

  • 簡化 notes 手風琴測試 (#27757)

  • 完成了 airflow/callbacks/* airflow/cli/* 的 D400 (#27721)

  • 完成了 airflow/api_connexion/* directory 的 D400 (#27718)

  • 完成了 airflow/listener/* directory 的 D400 (#27731)

  • 完成了 airflow/lineage/* directory 的 D400 (#27732)

  • 更新 API & Python Client 版本 (#27642)

  • 完成了 airflow/api/* 目錄的 D400 & D401 (#27716)

  • 完成了多個資料夾的 D400 (#27722)

  • /airflow/www 中的 minimatch3.0.4 升級到 3.0.8 (#27688)

  • /airflow/www 中的 loader-utils 從 1.4.1 升級到 1.4.2 (#27697)

  • 暫時停用巢狀任務對映 (#27681)

  • 增加 alembic 最低版本 (#27629)

  • 刪除未使用的 code.html (#27585)

  • 在所有地方啟用 python 字串規範化 (#27588)

  • 升級依賴以避免回溯 (#27531)

  • 稍微加強並闡明 issue 分類的重要性 (#27262)

  • 刪除重複的型別提示 (#27508)

  • BaseTrigger.run 新增存根“yield” (#27416)

  • 刪除 dask 的上限限制 (#27415)

  • 將 Dask 限制在 2022.10.1 以下 (#27383)

  • 更新舊式型別 (#26872)

  • 啟用 docs 的字串規範化 (#27269)

  • 稍微加快 up/downgrade 測試 (#26939)

  • 棄用在 PodManager 中使用核心 get_kube_client (#26848)

  • memray 檔案新增到 gitignore / dockerignore (#27001)

  • 提升 sphinx 和 sphinx-autoapi (#26743)

  • 簡化 RTIF.delete_old_records() (#26667)

  • 將最後的 react 檔案遷移到 typescript (#26112)

  • 解決 pyupgrade 邊緣情況 (#26384)

僅文件更改

  • 將 dag_file_processor_timeouts 指標記錄為已棄用 (#27067)

  • 刪除對 PostgreSQL 10 的支援 (#27594)

  • 更新 index.rst (#27529)

  • 新增關於將 lazy XCom proxy 推送到 XCom 的註釋 (#27250)

  • 修復 BaseOperator 連結 (#27441)

  • [docs] 最佳實踐新增使用帶有模板的變數的示例 (#27316)

  • 使用外掛的自定義檢視的文件 (#27244)

  • 更新概述頁面上的圖表檢視和網格檢視 (#26909)

  • 文件修復 (#26819)

  • 使標記標題字串級別保持一致 (#26696)

  • 新增 dag 測試函式的文件 (#26713)

  • 修復 docker-compose.yaml 的 broken URL (#26726)

  • 新增關於時間表中使用頂級程式碼的註釋 (#26649)

  • 修復 example_datasets dag 名稱 (#26495)

  • 更新文件:現在可以在任務對映中實現 zip 類似的效果 (#26435)

  • 從經典 operator 使用更改為 docs 中的任務裝飾器 (#25711)

Airflow 2.4.3 (2022-11-14)

重大變更

使 DagProcessor 中使用的 RotatingFilehandler 非快取 (#27223)

如果您想在使用 CONFIG_PROCESSOR_MANAGER_LOGGER=True 時減少快取記憶體,並且您之前建立了本地設定,則可以更新 processor_manager_handler 以使用 airflow.utils.log.non_caching_file_handler.NonCachingRotatingFileHandler 處理程式,而不是 logging.RotatingFileHandler

Bug 修復

  • 修復某些任務日誌處理程式中的雙重日誌記錄 (#27591)

  • 用 Airflow 的函式替換 FAB url 過濾函式 (#27576)

  • 修復對映任務的 mini scheduler 擴充套件 (#27506)

  • SLAMiss 是可空的,並且在拉取任務例項時並非總是返回 (#27423)

  • 修復搜尋 DAG 時 _ 的行為 (#27448)

  • 修復從 BaseExecutor 獲取 dag/task id 的問題 (#27550)

  • 修復 DDRQ 上的 SQLAlchemy 主鍵黑屏錯誤 (#27538)

  • 修復 webserver 啟動期間的 IntegrityError (#27297)

  • 為使用者名稱新增不區分大小寫的約束 (#27266)

  • 修復 python 外部模板鍵 (#27256)

  • 減少多餘的任務日誌請求 (#27233)

  • 使 DagProcessor 中使用的 RotatingFilehandler 不快取 (#27223)

  • 監聽器:在 SQLAlchemy TaskInstance 物件上設定任務 (#27167)

  • 修復 dags 列表頁面自動重新整理 & 跳轉搜尋空狀態 (#27141)

  • executor.job_id 設定為 backfill 的 BackfillJob.id (#27020)

其他/內部

  • 將 loader-utils 從 1.4.0 升級到 1.4.1 in /airflow/www (#27552)

  • 降低 k8s TCP_KEEPALIVE 等警告的日誌級別 (#26981)

僅文件更改

  • 在 docker compose 文件中使用正確的 executable (#27529)

  • 修復 DAG Runs 描述中的措辭 (#27470)

  • 記錄 KubernetesExecutor 覆蓋容器引數 (#27450)

  • 修復 BaseOperator 連結 (#27441)

  • 將計時器單位從毫秒更正為秒。 (#27360)

  • 在觸發規則示例中新增遺漏的 import (#27309)

  • 更新 SLA 措辭以反映其相對於 Dag Run 啟動時間。 (#27111)

  • kerberos 環境變數新增到文件 (#27028)

Airflow 2.4.2 (2022-10-23)

重大變更

[webserver] expose_stacktrace 的預設值更改為 False (#27059)

[webserver] expose_stacktrace 的預設值已設定為 False,而不是 True。 這意味著管理員必須選擇啟用才能向終端使用者公開堆疊跟蹤。

錯誤修復

  • 使堆疊跟蹤成為可選 (#27059)

  • 為 FAB 表新增缺失的 AUTOINC/SERIAL (#26885)

  • 為 405(不允許的方法)錯誤新增單獨的錯誤處理程式 (#26880)

  • 不要重新修補已由當前 worker 控制的 pods (#26778)

  • 處理任務持續時間圖表中的對映任務 (#26722)

  • 修復任務持續時間累積圖表 (#26717)

  • 避免 dag 重定向上的 500 錯誤 (#27064)

  • 在 webserver 上過濾資料集依賴資料 (#27046)

  • 刪除 airflow dags reserialize 中重複的 dags 集合 (#27030)

  • 修復圖表檢視的自動重新整理 (#26926)

  • 不要用無效的 json 覆蓋連線 extra (#27142)

  • 修復下一個執行資料集模態連結 (#26897)

  • 將 dag 審計日誌按日期排序從升序更改為降序 (#26895)

  • 提升 jinja2 的最低版本 (#26866)

  • 將缺失的顏色新增到 state_color_mapping jinja 全域性變數 (#26822)

  • 修復在 airflow tasks test 中執行偵錯程式 (#26806)

  • 修復使用 xcomarg 依賴項時的警告 (#26801)

  • 降低已刪除狀態在顯示任務摘要中的優先順序 (#26789)

  • 確保解析期間運算子的日誌訊息能夠記錄 (#26779)

  • 在 REST API 中的 TaskState 列舉中新增重新啟動狀態 (#26776)

  • 允許從 data.detail 中檢索錯誤訊息 (#26762)

  • 簡化 origin 字串清理 (#27143)

  • 從 StandardTaskRunner 中刪除 DAG 解析 (#26750)

  • 修復持續時間檢視上的非隱藏累積圖表 (#26716)

  • 刪除 TaskFail 重複項檢查 (#26714)

  • 修復當 dags_folder 與處理器不同時 airflow tasks run –local 的問題 (#26509)

  • 修復來自 d3-color 的 yarn 警告 (#27139)

  • 修復幾個配置的版本 (#26491)

  • 恢復 “No grid auto-refresh for backfill dag runs (#25042)” (#26463)

  • 在 Airflow 排程 DAG 執行 DB 死鎖時重試 (#26347)

其他/內部

  • 圍繞任務對映程式碼的清理 (#26879)

  • 將面向使用者的字串移動到模板 (#26815)

  • 向資料集圖新增圖示圖例 (#26781)

  • 升級 sphinxsphinx-autoapi (#26743)

  • 簡化 RTIF.delete_old_records() (#26667)

  • 將 FAB 升級到 4.1.4 (#26393)

僅文件更改

  • 修復了任務組示例中的三引號 (#26829)

  • 文件修復 (#26819)

  • 使標記標題字串級別保持一致 (#26696)

  • 新增關於時間表中使用頂級程式碼的註釋 (#26649)

  • 修復 docker-compose.yaml 的 broken URL (#26726)

Airflow 2.4.1 (2022-09-30)

重大變更

沒有重大更改。

錯誤修復

  • 渲染模板時,在上下文中取消對映任務 (#26702)

  • 修復 ConfirmDialog 的滾動溢位 (#26681)

  • 解決關於 Table.exists() 的棄用警告 (#26616)

  • 修復 XComArg zip 錯誤 (#26636)

  • 排序執行以處理 NULL 時使用 COALESCE (#26626)

  • 檢查使用者是否處於活動狀態 (#26635)

  • 公共管理員沒有缺失使用者警告 (#26611)

  • 允許 MapXComArg 在序列化後解析 (#26591)

  • 解決 dags 檢視上關於 DISTINCT ON 查詢的警告 (#26608)

  • 當 secret backend kwargs 無效時記錄警告 (#26580)

  • 修復網格檢視日誌嘗試次數 (#26556)

  • templates_dict 傳遞給任務裝飾器的模板渲染問題 (#26390)

  • 修復在回填期間 Deferrable 卡在 scheduled 狀態的問題 (#26205)

  • 在 db init 中抑制 SQLALCHEMY_TRACK_MODIFICATIONS 警告 (#26617)

  • 在 Flask app 上正確設定 json_provider_class,以便它使用我們的編碼器 (#26554)

  • 修復 WSGI 根應用程式 (#26549)

  • 修復重新執行具有已刪除上游的對映任務時的死鎖 (#26518)

  • ExecutorConfigType 應該是 cacheable (#26498)

  • 修復從 Celery workers 檢索的日誌的路徑的正確連線 (#26493)

  • DAG Deps 擴充套件 base_template (#26439)

  • 不要從排程程式更新回填執行 (#26342)

僅文件更改

  • 闡明所有者連結文件 (#26515)

  • 修復資料集概念文件中的無效 RST (#26434)

  • 記錄 expose_confignon-sensitive-only 選項 (#26507)

  • 修復 example_datasets dag 名稱 (#26495)

  • 現在可以在任務對映中實現類似 Zip 的效果 (#26435)

  • 在文件中使用任務裝飾器而不是經典運算子 (#25711)

Airflow 2.4.0 (2022-09-19)

重大變更

資料感知排程和 Dataset 概念已新增到 Airflow

Airflow 的此版本新增了 Dataset 概念,以及一種新的排程 dags 的方式:資料感知排程。

這允許由於任務“生成”資料集而自動建立 DAG 執行。 在某些方面,這可以被認為是 TriggerDagRunOperator 的逆運算,即生成 DAG 不控制建立哪些 DAG,而是消耗 DAG 可以“偵聽”更改。

資料集由 URI 標識

from airflow import Dataset

# The URI doesn't have to be absolute
dataset = Dataset(uri="my-dataset")
# Or you can use a scheme to show where it lives.
dataset2 = Dataset(uri="s3://bucket/prefix")

要建立一個在 Dataset 更新時執行的 DAG,請使用新的 schedule 引數(見下文)並傳遞一個或多個 Dataset 的列表

with DAG(dag_id='dataset-consumer', schedule=[dataset]):
    ...

要將任務標記為生成資料集,請將資料集傳遞給 outlets 屬性

@task(outlets=[dataset])
def my_task(): ...


# Or for classic operators
BashOperator(task_id="update-ds", bash_command=..., outlets=[dataset])

如果在不同的檔案中具有生產者和消費者,則無需使用相同的 Dataset 物件,兩個使用相同 URI 建立的 Dataset() 相等。

資料集代表資料集的抽象概念,並且(目前)沒有任何直接的讀取或寫入能力 - 在此版本中,我們添加了將要構建的基礎功能。

有關 Datasets 的更多資訊,請參見 Datasets 文件

擴充套件的動態任務對映支援

動態任務對映現在包括對 expand_kwargszipmap 的支援。

有關動態任務對映的更多資訊,請參閱動態任務對映

在上下文管理器中使用的 DAGS 不再需要分配給模組變數 (#23592)

以前,您必須將 DAG 分配給模組級變數,Airflow 才能識別它。例如,這樣:

with DAG(dag_id="example") as dag:
    ...


@dag
def dag_maker(): ...


dag2 = dag_maker()

可以變成這樣:

with DAG(dag_id="example"):
    ...


@dag
def dag_maker(): ...


dag_maker()

如果由於任何原因要停用此行為,請在 DAG 上設定 auto_register=False

# This dag will not be picked up by Airflow as it's not assigned to a variable
with DAG(dag_id="example", auto_register=False):
    ...

棄用 schedule_intervaltimetable 引數 (#25410)

我們添加了新的 DAG 引數 schedule,它可以接受 cron 表示式、timedelta 物件、timetable 物件或資料集物件列表。引數 schedule_intervaltimetable 已被棄用。

如果您之前使用過 @daily cron 預設,您的 DAG 可能是這樣的:

with DAG(
    dag_id="my_example",
    start_date=datetime(2021, 1, 1),
    schedule_interval="@daily",
):
    ...

今後,您應該改用 schedule 引數:

with DAG(
    dag_id="my_example",
    start_date=datetime(2021, 1, 1),
    schedule="@daily",
):
    ...

如果您使用自定義時間表也是如此。以前,您會使用 timetable 引數:

with DAG(
    dag_id="my_example",
    start_date=datetime(2021, 1, 1),
    timetable=EventsTimetable(event_dates=[pendulum.datetime(2022, 4, 5)]),
):
    ...

現在您應該使用 schedule 引數:

with DAG(
    dag_id="my_example",
    start_date=datetime(2021, 1, 1),
    schedule=EventsTimetable(event_dates=[pendulum.datetime(2022, 4, 5)]),
):
    ...

移除實驗性的智慧感測器 (#25507)

智慧感測器在 2.0 中新增,在 2.2 中為了支援可延遲運算子而被棄用,現在已被移除。

airflow.contrib 包和已棄用的模組是動態生成的 (#26153, #26179, #26167)

airflow.contrib 包和 Airflow 1.10 中 airflow.hooksairflow.operatorsairflow.sensors 包中已棄用的模組現在是動態生成的模組。雖然使用者可以繼續使用已棄用的 contrib 類,但靜態程式碼檢查工具不再能看到它們,並且會被報告為缺失。建議使用者遷移到未棄用的類。

DBApiHookSQLSensor 已移動 (#24836)

DBApiHookSQLSensor 已移動到 apache-airflow-providers-common-sql provider。

網格檢視中的 DAG 執行排序邏輯已更改 (#25090)

網格檢視中 DAG 執行的排序方式已更改,使其更“自然”。新的邏輯通常按資料間隔排序,但可以透過將 DAG 設定為使用自定義時間表來應用自定義排序。

新特性

  • 新增資料感知排程 (AIP-48)

  • 新增 @task.short_circuit TaskFlow 裝飾器 (#25752)

  • 使 execution_date_or_run_idtasks test 命令中變為可選 (#26114)

  • 自動註冊在上下文管理器中使用的 DAG (#23592, #26398)

  • 新增將 DAG 解析器日誌傳送到 stdout 的選項。 (#25754)

  • 支援多個 DagProcessors 解析來自不同位置的檔案。 (#25935)

  • 實現 ExternalPythonOperator (#25780)

  • 使 execution_date 對於命令 dags test 變為可選 (#26111)

  • 針對字面列表實現 expand_kwargs() (#25925)

  • 新增觸發規則工具提示 (#26043)

  • 為 airflow dags test 新增 CLI 的 conf 引數 (#25900)

  • 在池檢視中包含計劃的插槽 (#26006)

  • output 屬性新增到 MappedOperator (#25604)

  • 向 CLI 新增角色刪除命令 (#25854)

  • 新增 Airflow 特定的警告類 (#25799)

  • 新增對 ExternalTaskSensorTaskGroup 的支援 (#24902)

  • 新增 @task.kubernetes taskflow 裝飾器 (#25663)

  • 新增一種在沒有副作用的情況下匯入 Airflow 的方法 (#25832)

  • 讓時間表控制生成的 run_ids。 (#25795)

  • 允許在網格檢視中進行每個時間表的排序覆蓋 (#25633)

  • 對映例項的網格日誌 (#25610, #25621, #25611)

  • 合併為一個 schedule 引數 (#25410)

  • 回填命令中的 DAG 正則表示式標誌 (#23870)

  • 在 Dags 檢視 UI 中新增對所有者連結的支援 (#25280)

  • 能夠透過 REST API 清除特定 DAG 執行的任務例項 (#23516)

  • 可以使用單獨的 markdown 檔案來記錄 DAG (#25509)

  • 將解析上下文新增到 DAG 解析 (#25161)

  • 實現 CronTriggerTimetable (#23662)

  • 新增在 UI 配置頁面中遮蔽敏感資料的選項 (#25346)

  • 從 ORM 建立新資料庫 (#24156)

  • 實現 XComArg.zip(*xcom_args) (#25176)

  • 引入 sla_miss 指標 (#23402)

  • 實現 map() 語義 (#25085)

  • 將覆蓋方法新增到 TaskGroupDecorator (#25160)

  • 實現 expand_kwargs() (#24989)

  • 新增用於關閉 SQL 查詢日誌記錄的引數 (#24570)

  • 新增 DagWarning 模型,並檢查缺失的池 (#23317)

  • 將任務日誌新增到網格詳細資訊面板 (#24249)

  • 在排程程式中添加了小型健康檢查伺服器和端點 (#23905)

  • ExternalTaskMarker 運算子新增內建的外部連結 (#23964)

  • 新增預設任務重試延遲配置 (#23861)

  • 新增清除 DagRun 端點。 (#23451)

  • 新增對 cron 間隔時間表中字串形式時區的支援 (#23279)

  • 向 dags 主頁新增自動重新整理 (#22900, #24770)

改進

  • 新增更多工作日 operator 和 sensor 示例 #26071 (#26098)

  • 將 subdir 引數新增到 dags reserialize 命令 (#26170)

  • 更新殭屍訊息以更具描述性 (#26141)

  • 僅在計劃 DAG 時傳送 SlaCallbackRequest (#26089)

  • 更多地推廣 Operator.output (#25617)

  • 將 API 檔案升級到 typescript (#25098)

  • 減少對映任務中 hacky 雙重渲染預防 (#25924)

  • 改進審計日誌 (#25856)

  • 刪除對映的操作員驗證程式碼 (#25870)

  • 更多 DAG(schedule=...) 改進 (#25648)

  • 減少序列化 JSON 中的 operator_name 重複 (#25819)

  • 使網格檢視組/對映摘要 UI 更加一致 (#25723)

  • 刪除 task_group_to_grid 中的無用語句 (#25654)

  • 將可選資料間隔新增到 CronTriggerTimetable (#25503)

  • 刪除 /grid 端點中未使用的程式碼 (#25481)

  • 新增和記錄描述欄位 (#25370)

  • 改進 Airflow 對操作員 Jinja 模板處理的日誌記錄 (#25452)

  • 更新核心示例 DAG 以使用 @task.branch 裝飾器 (#25242)

  • 更新 DAG audit_log 路由 (#25415)

  • 在命令中將 stdout 和 stderr 訪問模式更改為追加 (#25253)

  • 從網格檢視中刪除 getTasks (#25359)

  • 使用 ParamSpec 改進 taskflow 型別提示 (#25173)

  • 在網格詳細資訊窗格中使用表格 (#25258)

  • 顯式列出 @dag 引數 (#25044)

  • 更多 SchedulerJobTaskInstance 中的型別 (#24912)

  • 使用更具彈性的版本修補 getfqdn (#24981)

  • whitespaces 替換所有 NBSP 字元 (#24797)

  • airflow db upgrade 上重新序列化所有 DAG (#24518)

  • 重新制定 try_adopt_task_instances 方法的合同 (#23188)

  • 使 expand() 錯誤變得模糊,以免產生誤導 (#24018)

  • [webserver]analytics_tool 新增列舉驗證 (#24032)

  • 在審計日誌中新增 dttm 可搜尋欄位 (#23794)

  • 允許透過 execute_in_subprocess 傳遞更多引數 (#23286)

  • 使用 func.count 來計算行數 (#23657)

  • 刪除過時的序列化 dags (#22917)

  • AIP45 刪除 airflow run local 中的 dag 解析 (#21877)

  • 在 DagRun 更新端點中新增對排隊狀態的支援。 (#23481)

  • 向 dagrun 端點新增欄位 (#23440)

  • 當未設定 result_backend 時,將 sql_alchemy_conn 用於 celery 結果後端 (#24496)

Bug 修復

  • 在 ORM 和遷移檔案之間具有一致的型別 (#24044, #25869)

  • 禁止任何超過 100 個字元的 dag 標籤 (#25196)

  • 將 dag_id 新增到 AirflowDagCycleException 訊息 (#26204)

  • 正確構建 URL 以從系統中獨立檢索日誌 (#26337)

  • 對於工作節點日誌伺服器,僅在雙棧可用時才繫結到 IPV6 (#26222)

  • 修復 TaskInstance.taskhandle_failure 之前未定義 (#26040)

  • 撤消秘密後端配置快取 (#26223)

  • 修復錯誤的執行器配置序列化邏輯 (#26191)

  • 根據角色許可權顯示 DAGsDatasets 菜單鏈接 (#26183)

  • 允許透過函式文件字串設定 TaskGroup 工具提示 (#26028)

  • 修復具有大量任務的 DAG 的圖形檢視上的 RecursionError (#26175)

  • 修復回填時偶爾發生的死鎖 (#26161)

  • 修復在使用 --reset-dagruns True 進行回填期間未設定 DagRun.start_date 的問題 (#26135)

  • 在圖形中使用標籤而不是 ID 作為動態任務標籤 (#26108)

  • 當葉子 mapped_task 為 SKIPPED 時,不要使 DagRun 失敗 (#25995)

  • 將組字首新增到裝飾的對映任務 (#26081)

  • 修復使用重複的邏輯日期觸發時 UI 閃爍的問題 (#26094)

  • 修復使 TaskInstance 相關端點的專案可為空,以避免 API 錯誤 (#26076)

  • 修復 BranchDateTimeOperator 以實現 timezone-awreness-insensitive (#25944)

  • 修復舊版時間表計劃間隔引數 (#25999)

  • 修復 list-mapped-task-instance 的響應模式 (#25965)

  • 正確檢查缺失的對映 TIs 的存在性 (#25788)

  • 修復網格檢視上損壞的自動重新整理 (#25950)

  • 在網格 UI 中使用每個時間表的排序 (#25880)

  • 將 DAG 解析為迭代時重寫遞迴 (#25898)

  • iter_mapped_dependants 中查詢跨組任務 (#25793)

  • 如果對映上游失敗,則使任務失敗 (#25757)

  • 支援變數 get 端點中的 / (#25774)

  • 將 cfg default_wrap 值用於網格日誌 (#25731)

  • 觸發執行時新增原始請求引數 (#25729)

  • 運算子名稱與類分離 (#22834)

  • 修復由於對輸入時間對齊的假設而導致的資料間隔對齊不正確的問題 (#22658)

  • 如果 XComArg 無法解析,則返回 None (#25661)

  • 更正 airflow variables set 命令中的 json 引數幫助資訊 (#25726)

  • 新增 MySQL 索引提示以在 find_zombies 查詢中使用 ti_state (#25725)

  • 僅從渲染中排除實際展開的欄位 (#25599)

  • 網格,修復 axios 錯誤的 toast (#25703)

  • 修復 UI 重定向 (#26409)

  • dags list-runs 需要 dag_id 引數 (#26357)

  • 檢查 dags 自動重新整理的排隊狀態 (#25695)

  • 修復 dag_owner_attributes 表的升級程式碼 (#25579)

  • 將對映索引新增到任務日誌 API (#25568)

  • 確保清除具有錯誤的 dag 的殭屍任務 (#25550)

  • 使額外的連結在 UI 中工作 (#25500)

  • 同步外掛 API 模式和定義 (#25524)

  • 名字/姓氏可以為空 (#25476)

  • 重構 DAG 頁面以保持一致 (#25402)

  • 在取消對映之前檢查 expand_kwargs() 輸入型別 (#25355)

  • 在計算對映長度時按鍵過濾 XCOM (#24530)

  • 修復 ExternalTaskSensor 不適用於動態任務 (#25215)

  • 添加了異常捕獲以在模板檔案引發任何異常時傳送預設電子郵件 (#24943)

  • 使 MappedOperator 成員與 BaseOperator 同步 (#24034)

其他/內部

  • MetaData DB 新增自動生成的 ERD 模式 (#26217)

  • 將序列化函式標記為內部 (#26193)

  • 刪除剩餘的已棄用類,並將其替換為 PEP562 (#26167)

  • dag_edgestask_group_to_dict 移動到相應的 util 模組 (#26212)

  • 延遲匯入許多模組以提高匯入速度 (#24486, #26239)

  • 修復不正確的型別資訊 (#26077)

  • 將缺少的 contrib 類新增到已棄用的字典 (#26179)

  • 在 fork 後重新配置/連線 ORM 以執行 DAG 處理器 (#26216)

  • 從 lineage 處理中刪除 cattrs。 (#26134)

  • 刪除了已棄用的 contrib 檔案,並將其替換為 PEP-562 getattr (#26153)

  • 使 BaseSerialization.serialize 對其他類“公開”。 (#26142)

  • 更改模板以使用人類可讀的任務例項描述 (#25960)

  • /airflow/www 中將 moment-timezone0.5.34 升級到 0.5.35 (#26080)

  • 修復 Flask 棄用警告 (#25753)

  • CamelCase 新增到生成的 operations 型別 (#25887)

  • 修復遷移問題並收緊 CI 升級/降級測試 (#25869)

  • 修復 SkipMixin 中的型別註釋 (#25864)

  • 解決 setuptools 可編輯包路徑問題 (#25848)

  • 在 /airflow/www 中將 undici5.8.0 to 5.9.1 升級 (#25801)

  • 將 custom_operator_name attr 新增到 _BranchPythonDecoratedOperator (#25783)

  • 闡明 filename_template 棄用訊息 (#25749)

  • 使用 ParamSpec 替換 Callable 中的 ... (#25658)

  • 刪除已棄用的模組 (#25543)

  • 有關任務對映新增的文件 (#24489)

  • 刪除智慧感測器 (#25507)

  • 修復 elasticsearch 測試配置以避免有關已棄用模板的警告 (#25520)

  • 在 /airflow/ui 中將 terser4.8.0 to 4.8.1 升級 (#25178)

  • 從 rest API 文件生成 typescript 型別 (#25123)

  • 將 utils 檔案升級到 typescript (#25089)

  • 將剩餘的上下文檔案升級到 typescript。 (#25096)

  • 將檔案遷移到 ts (#25267)

  • 將網格 Table 元件升級到 ts. (#25074)

  • 如果對映的 ti 返回 None,則跳過針對它的對映 (#25047)

  • 重構 js 檔案結構 (#25003)

  • 將對映的 kwargs 自省移動到單獨的型別 (#24971)

  • 僅在型別檢查時斷言 mypy 的內容 (#24937)

  • /airflow/www 中將 moment2.29.3 to 2.29.4 升級 (#24885)

  • 從我們的程式碼庫中刪除“壞字元” (#24841)

  • BashOperator 中刪除 xcom_push 標誌 (#24824)

  • 將 Flask 鉤子註冊移動到檔案末尾 (#24776)

  • 將更多 javascript 檔案升級到 typescript (#24715)

  • 清理任務裝飾器型別提示和文件字串 (#24667)

  • 在 UI 中保留提供程式連線額外欄位的原始順序 (#24425)

  • charts.css 重新命名為 chart.css (#24531)

  • grid.css 重新命名為 chart.css (#24529)

  • 其他:透過 set_new_process_group 實用程式建立新的程序組 (#24371)

  • Airflow UI 修復原型汙染 (#24201)

  • 升級 moto 版本 (#24222)

  • 從 ref docs 中刪除未使用的 [github_enterprise] (#24033)

  • 清理日誌呼叫中的 f-strings (#23597)

  • 新增 JPype1 的限制 (#23847)

  • 簡化 json 響應 (#25518)

  • 新增最小 attrs 版本 (#26408)

僅文件更改

  • Celery Flower 新增 url 字首設定 (#25986)

  • 更新示例中已棄用的配置 (#26037)

  • 修復 taskflow 教程的錯誤連結 (#26007)

  • 將教程重組為一個部分 (#25890)

  • 修復動態任務對映的概念文件 (#26002)

  • 將程式碼示例從“經典”運算子更新到 taskflow (#25845, #25657)

  • 新增有關手動修復 MySQL 字元集問題的說明 (#25938)

  • 在文件中首選本地快速入門 (#25888)

  • 修復指向 Trigger Rules 的斷開連結 (#25840)

  • 改進 docker 文件 (#25735)

  • 正確連結到文件中的 Dag 解析上下文 (#25722)

  • 新增有關 task_instance_mutation_hook 用法的註釋 (#25607)

  • 注意 TaskFlow API 會自動在任務之間傳遞資料 (#25577)

  • 更新 DAG 執行以闡明 DAG 何時實際執行 (#25290)

  • 更新教程文件以包含運算子的定義 (#25012)

  • 重寫 Airflow 文件主頁 (#24795)

  • 修復 task-generated mapping 示例 (#23424)

  • 新增有關 2.2.0 中細微的邏輯日期更改的註釋 (#24413)

  • 在最佳實踐程式碼示例中新增缺少的匯入 (#25391)

Airflow 2.3.4 (2022-08-23)

重大更改

添加了新的配置 [logging]log_formatter_class,以修復 UI 上日誌的時區顯示 (#24811)

如果您在 [logging]logging_config_class 中使用了自定義的 Formatter 子類,請繼承 airflow.utils.log.timezone_aware.TimezoneAware,而不是 logging.Formatter。例如,在您的 custom_config.py

from airflow.utils.log.timezone_aware import TimezoneAware


# before
class YourCustomFormatter(logging.Formatter): ...


# after
class YourCustomFormatter(TimezoneAware): ...


AIRFLOW_FORMATTER = LOGGING_CONFIG["formatters"]["airflow"]
AIRFLOW_FORMATTER["class"] = "somewhere.your.custom_config.YourCustomFormatter"
# or use TimezoneAware class directly. If you don't have custom Formatter.
AIRFLOW_FORMATTER["class"] = "airflow.utils.log.timezone_aware.TimezoneAware"

Bug 修復

  • 停用 MappedOperator 上的 attrs 狀態管理 (#24772)

  • 在 pickle executor_config 之前,將 pod_override 序列化為 JSON (#24356)

  • 修復 pid 檢查 (#24636)

  • 在登入期間輪換會話 ID (#25771)

  • 修復具有 reschedule 模式的 mapped sensor (#25594)

  • 快取自定義 secrets 後端,以便重用同一個例項 (#25556)

  • 新增右邊距 (#25554)

  • 修復在清除後執行時縮減 mapped task 的 mapped length (#25531)

  • 修復存在懸掛表時的 airflow db reset (#25441)

  • 更改 disable_verify_ssl 的行為 (#25023)

  • 在 dag.add_task 方法中設定預設 task group (#25000)

  • 移除干擾的索引強制。 (#25404)

  • 移除無用的日誌行 (#25347)

  • 新增 mysql 索引提示以在關鍵部分查詢中使用 task_instance.state 上的索引 (#25673)

  • 可配置的 umask 用於所有守護程序化的程序。 (#25664)

  • 修復將 None 傳遞給模板過濾器時引發的錯誤 (#25593)

  • 允許萬用字元 CORS 來源 (#25553)

  • 修復 “This Session’s transaction has been rolled back” (#25532)

  • 修復 TaskCallbackRequest 中的序列化錯誤 (#25471)

  • 修復 - 透過絕對路徑解析 bash (#25331)

  • 新增 __repr__ 到 ParamsDict 類 (#25305)

  • 僅載入一次名稱的分佈 (#25296)

  • 在呼叫時將 TimeSensorAsync target_time 轉換為 utc (#25221)

  • expandGroup 之後呼叫 updateNodeLabels (#25217)

  • 停止 SLA 回撥搶佔其他回撥並 DOS'ing DagProcessorManager 佇列 (#25147)

  • 修復 invalidateQueries 呼叫 (#25097)

  • airflow/www/package.json: 新增 name、version 欄位。 (#25065)

  • 沒有用於回填 dag runs 的網格自動重新整理 (#25042)

  • 修復 dag 詳情頁面上的標籤連結 (#24918)

  • 修復具有多個排程器的殭屍任務處理 (#24906)

  • 將工作節點上的日誌伺服器繫結到 IPv6 地址 (#24755) (#24846)

  • %(asctime)s 新增 %z,以修復 UI 上日誌的時區 (#24811)

  • TriggerDagRunOperator.operator_extra_links 是 attr (#24676)

  • prohibit_commit 之外將 DAG 超時回調發送到處理器 (#24366)

  • 不要依賴當前的 ORM 結構來執行 db clean 命令 (#23574)

  • 清除 TIs 時清除下一個方法 (#23929)

  • 兩個型別修復 (#25690)

僅文件更改

  • 更新 set-up-database.rst (#24983)

  • 修復 mysql 設定文件中的語法 (#24893 (#24939)

  • 注意 DAG 策略如何與 default_args 一起使用 (#24804)

  • 更新 PythonVirtualenvOperator Howto (#24782)

  • 文件:為 Release Notes 新增指向 Github PR 的超連結 (#24532)

其他/內部

  • 使用預設遠端任務日誌處理程式時,刪除折舊警告 (#25764)

  • scheduler_job.py 中更清晰的方法名稱 (#23702)

  • Bump cattrs 版本 (#25689)

  • sql_engine_collation_for_ids 文件中包含對 external_executor_id 的遺漏提及 (#25197)

  • 重構 DR.task_instance_scheduling_decisions (#24774)

  • 對 operator extra links 進行排序 (#24992)

  • 擴充套件 resolve_xcom_backend 函式級別文件 (#24965)

  • 將 FAB 升級到 4.1.3 (#24884)

  • 鑑於 2.2 破壞了我們的測試,將 Flask 限制為 <2.3 (#25511)

  • 將 astroid 版本限制為 < 2.12 (#24982)

  • 將 javascript 編譯移動到主機 (#25169)

  • 為 ParamSpec 提升 typing-extensions 和 mypy (#25088)

Airflow 2.3.3 (2022-07-09)

重大變更

我們已將 Flask App Builder 升級到主要版本 4.* (#24399)

Flask App Builder 是 Airflow Webserver 的重要元件之一,因為它使用了許多對於執行 Webserver 並將其整合到企業環境(尤其是身份驗證)中至關重要的依賴項。

FAB 4.* 將許多依賴項升級到主要版本,從而將它們升級到已修復許多安全問題的版本。 執行了大量測試以向後相容的方式引入依賴項,但是依賴項本身在其內部實現中引入了重大更改,因此如果使用者出於自身目的使用這些庫,則某些更改可能會影響使用者。

您可能需要應用於 Oauth 配置的一個重要更改是新增 server_metadata_urljwks_uri,您可以在 此問題 中瞭解更多資訊。

這是與 FAB 4 一起提供的依賴項中的重大更改列表

Bug 修復

  • 修復 mini task scheduler 中的異常 (#24865)

  • 修復將標籤附加到 task group 的迴圈錯誤 (#24847)

  • 修復 sensorinstance 的時間戳預設值 (#24638)

  • 將易出錯的 ti.task.dag 賦值放回 try/except 塊中 (#24533) (#24592)

  • 將缺少的型別新增到 FSHook (#24470)

  • airflow tasks teststdout 中遮蔽 secrets (#24362)

  • DebugExecutor 使用 ti.run() 而不是 ti._run_raw_task (#24357)

  • 修復 MySQL 連線的 URI 建構函式中的錯誤 (#24320)

  • openapi 中添加了缺少的 scheduleinterval nullable true (#24253)

  • 統一任務執行器的 return_code 介面 (#24093)

  • 處理帶重試的觸發器中的偶爾死鎖 (#24071)

  • 刪除 mapped op_kwargs 的特殊 serde 邏輯 (#23860)

  • 如果外部任務進入 failed_state,則 ExternalTaskSensor 尊重 soft_fail (#23647)

  • 修復 StatD 定時指標單位 (#21106)

  • cache_ok 標誌新增到 sqlalchemy TypeDecorators。 (#24499)

  • 允許 LOGGING_LEVEL=DEBUG (#23360)

  • 修復網格日期刻度 (#24738)

  • 在 Grid 檢視中消除狀態突出顯示抖動 (#24710)

  • 修復 Grid 垂直滾動 (#24684)

  • 不要嘗試為關閉的組渲染子行 (#24637)

  • 不要計算網格根例項 (#24528)

  • 在過濾上游時保持網格檢視選擇 (#23779)

  • grid_data 端點加速 10 倍 (#24284)

  • 將每個執行日誌模板應用於日誌處理程式 (#24153)

  • 如果執行配置具有舊的 k8s 物件,則不要崩潰排程器 (#24117)

  • map_index 修復 TI.log_url (#24335)

  • 修復遷移 0080_2_0_2 - 在設定列為非空之前替換空值 (#24585)

  • 如果使用舊的 Postgres 方案,則修補 sql_alchemy_conn (#24569)

  • 種子 log_template 表 (#24511)

  • 修復已棄用的 log_id_template 值 (#24506)

  • 修復 toast 訊息 (#24505)

  • task_instance 的 CASCADE 刪除新增索引 (#24488)

  • 如果 Pod JSON 編碼失敗,則返回空字典 (#24478)

  • 透過自定義工具提示提高網格渲染效能 (#24417, #24449)

  • 檢查網格組摘要的 run_id (#24327)

  • 最佳化 cron 排程 DAG 的日曆檢視 (#24262)

  • 使用 get_hostname 而不是 socket.getfqdn (#24260)

  • 檢查邊緣節點是否實際存在 (#24166)

  • 修復 useTasks 在錯誤時崩潰 (#24152)

  • 不要讓重新排隊的 TIs 失敗 (#23846)

  • 減少網格檢視 API 呼叫 (#24083)

  • 將 Permissions 重新命名為 Permission Pairs (#24065)

  • use_task_execution_date 替換為 use_task_logical_date (#23983)

  • 修復網格詳細資訊按鈕被截斷和小的 UI 調整 (#23934)

  • 將 TaskInstance 狀態 REMOVED 新增到已完成狀態和成功狀態 (#23797)

  • 修復清除後對映任務的不可變性 (#23667)

  • 修復 dag 名稱中有點的許可權問題 (#23510)

  • 修復關閉連線 dbapi.get_pandas_df (#23452)

  • 檢查 bag DAG schedule_interval 是否與 timetable 匹配 (#23113)

  • 解析錯誤:任務新增到多個組 (#23071)

  • 修復返回的 dag runs 的順序不穩定問題 (#24405)

  • 將影響執行/任務選擇的 jsx 檔案遷移到 tsx (#24509)

  • 修復示例的原始碼連結 (#24386)

  • grid_data 端點上設定正確的 Content-Typechartset (#24375)

僅文件更改

  • 更新模板文件以提及 extras 並格式化 Airflow Vars / Conns (#24735)

  • 記錄內建時間表 (#23099)

  • 按字母順序排列兩個表 (#23923)

  • 闡明使用者不應使用 Maria DB (#24556)

  • 將匯入新增到延遲程式碼示例 (#24544)

  • 新增有關 2022 年 6 月影像再生的註釋 (#24524)

  • 小清理 get_current_context() 章節 (#24482)

  • 修復預設 2.2.5 log_id_template (#24455)

  • 更新從核心單獨安裝提供程式的描述 (#24454)

  • 提及上下文變數和日誌記錄 (#24304)

雜項/內部

  • 刪除 internet explorer 支援 (#24495)

  • api_connexion 中刪除魔法狀態程式碼數字 (#24050)

  • 將 FAB 升級到 4.1.2 (#24619)

  • 將 Markdown 引擎切換到 markdown-it-py (#19702)

  • rich 更新到全域性最新版本。 (#24186)

  • 擺脫 TimedJSONWebSignatureSerializer (#24519)

  • 更新 flask-appbuilder authlib/ oauth 依賴 (#24516)

  • 升級到 webpack 5 (#24485)

  • 新增 typescript (#24337)

  • 在檢索日誌的請求中,JWT 宣告已標準化:我們使用 nbfaud 宣告來表示請求的成熟度和受眾。 此外,使用“filename”有效負載欄位來保留日誌名稱。 (#24519)

  • 解決所有 yarn 測試警告 (#24722)

  • 升級到 react 18 和 chakra 2 (#24430)

  • 重構 DagRun.verify_integrity (#24114)

  • 將 FAB 升級到 4.1.1 (#24399)

  • 我們現在至少需要 Flask-WTF 0.15 (#24621)

Airflow 2.3.2 (2022-06-04)

沒有重大更改。

Bug 修復

  • 至少執行一次 check_migration 迴圈

  • 修復對映任務的網格檢視 (#24059)

  • 不同 DAG 執行型別的網格檢視中的圖示 (#23970)

  • 更快的網格檢視 (#23951)

  • 不允許呼叫不帶引數的 expand (#23463)

  • 將缺少的 is_mapped 欄位新增到 Task 響應。 (#23319)

  • DagFileProcessorManager:僅噹噹前程序不是會話領導者時才啟動新的程序組 (#23872)

  • 遮蔽尚未執行的 TIs 的敏感值 (#23807)

  • 將級聯新增到 dag_tagdag 外部索引鍵 (#23444)

  • --subdir 引數值用於獨立 dag 處理器。 (#23864)

  • 透過懸停在圖例行上來突出顯示任務狀態 (#23678)

  • 修復並加速網格檢視 (#23947)

  • 防止 UI 在網格任務例項為空時崩潰 (#23939)

  • 刪除 dag-processor 命令中冗餘的註冊退出訊號 (#23886)

  • __wrapped__ 屬性新增到 _TaskDecorator (#23830)

  • 修復當 DbApiHook 中的 sql 為空列表時的 UnboundLocalError (#23816)

  • 允許在自動完成下拉列表中單擊 DAG 所有者 (#23804)

  • 簡化 _airflow_moved 表的快閃記憶體訊息 (#23635)

  • 從甘特圖中排除缺失的任務 (#23627)

僅文件更改

  • 新增資料庫遷移參考的列名 (#23853)

雜項/內部

  • 刪除 xmltodict 的固定 (#23992)

Airflow 2.3.1 (2022-05-25)

重大更改

沒有重大更改。

Bug 修復

  • 自動重新排程 CeleryExecutor 中停止的排隊任務 (#23690)

  • 修復展開/摺疊所有按鈕 (#23590)

  • 網格檢視狀態過濾器 (#23392)

  • 展開/摺疊所有組 (#23487)

  • 修復檢索已棄用的非配置值 (#23723)

  • 修復在未執行任務時 UI 中呈現的金鑰。 (#22754)

  • 修復提供程式匯入錯誤匹配 (#23825)

  • 修復忽略符號連結中的迴歸 (#23535)

  • 修復 dag-processor 獲取元資料資料庫配置 (#23575)

  • 修復展開非模板欄位時自動上游依賴 (#23771)

  • 修復未捕獲任務日誌的問題 (#23684)

  • reschedule 新增到 BaseSensorOperator 的序列化欄位 (#23674)

  • 修改 db clean 以捕獲 ProgrammingError 異常 (#23699)

  • 從連結按鈕中刪除標題 (#23736)

  • 修復網格詳細資訊標題文字重疊 (#23728)

  • 確保 execution_timeout 作為 timedelta (#23655)

  • 不要對降級執行預遷移檢查 (#23634)

  • 在日誌表中新增事件列的索引 (#23625)

  • CeleryKubernetesExecutorLocalKubernetesExecutor 實現 send_callback 方法 (#23617)

  • 修復 PythonVirtualenvOperator templated_fields (#23559)

  • 也將特定的 ID 排序規則應用於 root_dag_id (#23536)

  • 防止 KubernetesJobWatcher 卡在資源太舊的狀態 (#23521)

  • 修復在使用返回 none 的對映任務進行擴充套件時排程程式崩潰的問題 (#23486)

  • 修復同時啟動多個執行時的損壞的 dagrun 連結 (#23462)

  • 修復:解析日誌時的異常 #20966 (#23301)

  • 處理 webserver 檢視中的無效日期解析。 (#23161)

  • 具有負開放槽的池不應阻止其他池 (#23143)

  • 移動溢位、位置和填充 (#23044)

  • 更改查詢錯誤行的方法為 LEFT OUTER JOIN。 (#23528)

  • 僅在 moved 表存在時才計算錯誤的引用 (#23491)

  • 在視覺上區分任務組摘要 (#23488)

  • 刪除高度巢狀組的顏色更改 (#23482)

  • 最佳化 2.3.0 預升級檢查查詢 (#23458)

  • core__sql_alchemy_conn__cmd 新增向後相容性 (#23441)

  • 修復文字交叉積展開 (#23434)

  • 修復 xcom 列表中的損壞的任務例項連結 (#23367)

  • 修復連線測試按鈕 (#23345)

  • 修復 cli airflow dags show 用於對映運算子 (#23339)

  • 隱藏一些任務例項屬性 (#23338)

  • 如果伺服器將拒絕並顯示許可權被拒絕,則不要顯示網格操作 (#23332)

  • 使用 run_id 作為 ti.mark_success_url (#23330)

  • 修復更新使用者身份驗證統計資訊 (#23314)

  • 在對映例項表中使用 <Time /> (#23313)

  • 修復重複的 Kubernetes DeprecationWarnings (#23302)

  • 將網格檢視選擇儲存在 url 引數中 (#23290)

  • 刪除 Triggerer 中的自定義訊號處理 (#23274)

  • 當從 cli 傳遞池時,覆蓋 TaskInstance 的池。 (#23258)

  • 如果 DAG 執行 ID 中使用了“/”,則顯示警告 (#23106)

  • 在 kubernetes 混合執行器中使用 kubernetes 佇列 (#23048)

  • 在 try 塊中新增標籤。 (#21784)

僅文件更改

  • dag_processing.processor_timeouts 移動到 counters 部分 (#23393)

  • 闡明 bundle extras 不應用於 PyPi 安裝 (#23697)

  • 在文件中同步對 Postgres 和 K8S 的支援 (#23673)

  • 替換文件中的 DummyOperator 引用 (#23502)

  • expand()partial() 新增僅關鍵字引數的文件註釋 (#23373)

  • 修復了 2.3.0+ 升級後損壞的 Elasticsearch 日誌的文件 (#23821)

其他/內部

  • 為 airflow/configuration.py 新增型別提示 (#23716)

  • 預設情況下從 docker-compose 停用 Flower (#23685)

  • 添加了對 Postgres 14 的支援(包括 breeze)(#23506)

  • 新增 K8S 1.24 支援 (#23637)

  • 將程式碼引用從樹形結構重構為網格結構 (#23254)

Airflow 2.3.0 (2022-04-30)

有關生產 Docker 映象相關的更改,請參見 Docker 映象變更日誌

重大更改

execution_date 傳遞給 XCom.set(), XCom.clear() , XCom.get_one() , 和 XCom.get_many() 已棄用 (#19825)

為了持續努力將 TaskInstance 繫結到 DagRun,現在 XCom 條目也與 DagRun 相關聯。 使用 run_id 引數來指定 DagRun。

現在任務日誌模板從元資料資料庫讀取,而不是從 airflow.cfg 讀取 (#20165)

以前,任務的日誌是從執行時的 [core] log_filename_template[elasticsearch] log_id_template 配置值動態呈現的。 這導致了一些不幸的特性,例如,在 Airflow 例項執行一段時間後修改配置值是不切實際的,因為所有現有的任務日誌都必須儲存在之前的格式下,並且無法使用新的配置值找到。

引入了一個新的 log_template 表來解決這個問題。 每次 Airflow 啟動時,此表都會與上述配置值同步,並且每個 DAG 執行都會新增一個新的欄位 log_template_id,以指向任務使用的格式(NULL 表示第一個條目,用於相容性)。

最低 Kubernetes 庫版本從 3.0.0 提升到 21.7.0 (#20759)

注意

這僅涉及更改 kubernetes 庫,而不是 Kubernetes 叢集。 Airflow 對 Kubernetes 版本的支援在 安裝先決條件中進行了描述。

預計不會有行為上的改變。 這是為了利用關於重新整理 Kubernetes API tokens with EKS 的一個 bugfix,它允許移除一些 workaround code

XCom 現在由 run_id 定義,而不是 execution_date (#20975)

作為 Airflow 2.2 中開始的 TaskInstance-DagRun 關係更改的延續,XCom 上的 execution_date 列已從資料庫中刪除,並替換為 ORM 級別的 關聯代理欄位。 如果您直接訪問 Airflow 的元資料資料庫,則應重寫實現以使用 run_id 列。

請注意,Airflow 在資料庫和 ORM 級別的元資料庫定義被認為是實現細節,沒有嚴格的向後相容性保證。

已棄用非 JSON 可序列化的引數 (#21135)。

以前可以使用非 JSON 可序列化的 dag 或任務引數預設值。

例如,這以前是可以工作的

@dag.task(params={"a": {1, 2, 3}, "b": pendulum.now()})
def datetime_param(value):
    print(value)


datetime_param("{{ params.a }} | {{ params.b }}")

請注意 setdatetime 型別的使用,它們不是 JSON 可序列化的。 這種行為是有問題的,因為要覆蓋 dag 執行配置中的這些值,您必須使用 JSON,這可能使這些引數不可覆蓋。 另一個問題是引數驗證的支援假定 JSON。 在 Airflow 3.0 中將刪除對非 JSON 可序列化引數的使用,在此之前,使用它們將在解析時產生警告。

對於 SQLAlchemy 1.4.0+,您必須在 sql_alchemy_conn 中使用 postgresql:// 而不是 postgres:// (#21205)

當您使用 SQLAlchemy 1.4.0+ 時,您需要在 sql_alchemy_conn 中使用 postgresql:// 作為 scheme。 在以前的 SQLAlchemy 版本中,可以使用 postgres:// ,但在 SQLAlchemy 1.4.0+ 中使用它會導致

>       raise exc.NoSuchModuleError(
            "Can't load plugin: %s:%s" % (self.group, name)
        )
E       sqlalchemy.exc.NoSuchModuleError: Can't load plugin: sqlalchemy.dialects:postgres

如果您無法立即更改 URL 的 scheme,Airflow 將繼續使用 SQLAlchemy 1.3,您可以降級 SQLAlchemy,但我們建議更新該 scheme。 有關詳細資訊,請參見 SQLAlchemy 變更日誌

auth_backends 替換了 auth_backend 配置設定 (#21472)

以前,只使用一個後端來授權使用 REST API。 在 2.3 中,這已更改為支援多個後端,用逗號分隔。 將依次嘗試每個後端,直到返回成功的響應。

airflow.models.base.Operator 已刪除 (#21505)

以前,有一個空的類 airflow.models.base.Operator 用於“型別提示”。 這個類對於任何事情來說從來都不是真正有用的(它所做的一切都可以透過 airflow.models.baseoperator.BaseOperator 更好地完成),並且已經被刪除。 如果您依賴於該類的存在,請使用 BaseOperator (用於具體的運算子), airflow.models.abstractoperator.AbstractOperator ( BaseOperator 和 AIP-42 MappedOperator 的基類), 或者 airflow.models.operator.Operator (一個聯合型別 BaseOperator | MappedOperator 用於型別註解).

DAG 資料夾中的 Zip 檔案不能再具有 .py 副檔名 (#21538)

以前可以為 DAG 資料夾中的 zip 檔案使用任何副檔名。 現在,.py 檔案將被載入為模組,而無需檢查它是否是 zip 檔案,因為它會導致更少的 IO。 如果 DAG 資料夾中的 .py 檔案是 zip 壓縮檔案,則解析它將失敗並出現異常。

auth_backends 包括會話 (#21640)

為了允許 Airflow UI 使用 API,以前的預設授權後端 airflow.api.auth.backend.deny_all 被更改為 airflow.api.auth.backend.session,如果設定了非預設值,則會自動將其新增到 API 授權後端列表中。

更改了日誌檔名和 Elasticsearch log_id 的預設模板 (#21734)

為了支援動態任務對映,每個任務例項日誌記錄的預設模板已更改。 如果您的配置包含舊的預設值,它們將被就地升級。

如果您對新的配置值感到滿意,則應刪除 airflow.cfg 中的設定,並讓使用預設值。 舊的預設值是

  • [core] log_filename_template: {{ ti.dag_id }}/{{ ti.task_id }}/{{ ts }}/{{ try_number }}.log

  • [elasticsearch] log_id_template: {dag_id}-{task_id}-{execution_date}-{try_number}

[core] log_filename_template 現在預設使用 dag_id=<id>/run_id=<id> 的“hive 分割槽樣式”,這可能會在一些較舊的 FAT 檔案系統上引起問題。 如果這影響了您,那麼您將不得不更改日誌模板。

如果您自定義了模板,並且想要使用動態對映任務,請確保模板包含 {{ ti.map_index }}

如果升級後發現無法訪問任務日誌,請嘗試在 log_template 表中新增一行,設定 id=0,其中包含您之前的 log_id_templatelog_filename_template。例如,如果您使用的是 2.2.5 中的預設值。

INSERT INTO log_template (id, filename, elasticsearch_id, created_at) VALUES (0, '{{ ti.dag_id }}/{{ ti.task_id }}/{{ ts }}/{{ try_number }}.log', '{dag_id}-{task_id}-{execution_date}-{try_number}', NOW());

ReadyToRescheduleDep 現在僅在 reschedule 為 *True* 時執行 (#21815)

當執行 ReadyToRescheduleDep 時,它現在檢查運算子上的 reschedule 屬性,並且始終報告自身為 *passed*,除非它設定為 *True*。 如果你在自定義運算子上使用這個依賴類,你需要將這個屬性新增到運算子類。使用此依賴類的內建運算子類(包括感測器和所有子類)已經具有此屬性,因此不受影響。

運算子類上的 deps 屬性應為類級別屬性 (#21815)

為了支援運算子對映 (AIP 42),運算子類上的 deps 屬性必須在類級別設定。 這意味著,如果自定義運算子將其實現為例項級別變數,則它將無法用於運算子對映。 這不會影響現有程式碼,但我們強烈建議您重構運算子的依賴邏輯,以支援新功能。

棄用:Connection.extra 必須是 JSON 編碼的 dict (#21816)

總結:

從 Airflow 3.0 開始,airflow 連線中的 extra 欄位必須是 JSON 編碼的 Python dict。

原因和時間?

Airflow 的 Connection 用於儲存憑據。 對於不適合使用者/密碼/主機/模式/埠的資訊儲存,我們有 extra 字串欄位。 其意圖始終是提供任意鍵值對的儲存,例如 SSH hook 中的 no_host_key_check 或 GCP 中的 keyfile_dict

但由於該欄位是字串,因此從技術上講,可以儲存任何字串值。 例如,可以儲存字串值 'my-website.com' 並在 hook 中使用它。 但這是一種非常糟糕的做法。 一個原因是可理解性:當您檢視 extra 的值時,您不知道其目的是什麼。 更好的方法是儲存 {"api_host": "my-website.com"},至少告訴您一些關於該值的資訊。 另一個原因是可擴充套件性:如果將 API 主機儲存為簡單的字串值,那麼如果需要新增更多資訊(例如 API 端點或憑據)會發生什麼? 然後您需要將字串轉換為 dict,這將是一個重大更改。

出於這些原因,從 Airflow 3.0 開始,我們將要求 Connection.extra 欄位儲存 JSON 編碼的 Python dict。

我將受到什麼影響?

對於 Airflow 程式碼庫中包含的提供程式的 使用者,您不應該進行任何更改,因為在 Airflow 程式碼庫中,我們不應該允許 hook 以這種方式濫用 Connection.extra 欄位。

但是,如果您有任何自定義 hook 儲存了 JSON dict 以外的內容,則必須對其進行更新。 如果這樣做,您應該在檢索或例項化此連線時看到警告(例如,它應該顯示在任務日誌中)。

要檢視是否有任何需要更新的連線,您可以執行以下命令

airflow connections export - 2>&1 >/dev/null | grep 'non-JSON'

這將捕獲有關在 extra 欄位中儲存 JSON 編碼的 Python dict 以外內容的連線的任何警告。

tree 預設檢視設定已重新命名為 grid (#22167)

如果將 dag_default_view 配置選項或 default_view 引數設定為 DAG()tree,則需要更新您的部署。 舊名稱將繼續工作,但會發出警告。

資料庫配置已移至新部分 (#22284)

以下配置已從 [core] 移至新的 [database] 部分。 但是,在讀取新選項時,將檢查舊選項是否存在。 如果存在,將發出 DeprecationWarning,並改用舊選項。

  • sql_alchemy_conn

  • sql_engine_encoding

  • sql_engine_collation_for_ids

  • sql_alchemy_pool_enabled

  • sql_alchemy_pool_size

  • sql_alchemy_max_overflow

  • sql_alchemy_pool_recycle

  • sql_alchemy_pool_pre_ping

  • sql_alchemy_schema

  • sql_alchemy_connect_args

  • load_default_connections

  • max_db_retries

刪除自定義連線 UI 欄位必須以什麼為字首的要求 (#22607)

Hooks 可以透過實現方法 get_connection_form_widgets 為其連線型別定義自定義連線欄位。 這些自定義欄位在 Web UI 中顯示為其他連線屬性,但在內部,它們儲存在連線 extra dict 欄位中。 由於技術原因,以前,儲存在 extra dict 中時,自定義欄位的 dict 鍵必須採用 extra__<conn type>__<field name> 的形式。 這使得在 UI 之外定義連線更加麻煩,因為字首 extra__<conn type>__ 使其更難以讀取和使用。 使用 #22607,我們現在可以定義自定義欄位,以便可以在沒有字首的情況下從 extra 中讀取和儲存它們。

要啟用此功能,請更新由 get_connection_form_widgets 方法返回的 dict,以從鍵中刪除字首。 在內部,提供程式管理器仍將使用字首來確保每個自定義欄位都是全域性唯一的,但是返回的 widget dict 中缺少字首將向 Web UI 發出訊號,以讀取和儲存沒有字首的自定義欄位。 請注意,這只是對 Web UI 行為的更改; 以這種方式更新 hook 時,必須確保當您的*hook*讀取 extra 欄位時,它還將檢查字首值以實現向後相容性。

webserver.X_FRAME_ENABLED 配置現在按照描述工作了 (#23222)。

在 Airflow 2.0.0 - 2.2.4 中,webserver.X_FRAME_ENABLED 引數的工作方式與其描述相反,將該值設定為“true”會導致“X-Frame-Options”標頭為“DENY”(不允許在 iframe 中使用 Airflow)。 當您將其設定為“false”時,未新增標頭,因此可以將 Airflow 嵌入到 iframe 中。 預設情況下,Airflow 無法嵌入到 iframe 中。

在 Airflow 2.2.5 中,引入了一個錯誤,導致無法停用 Airflow 在 iframe 中工作。 無論配置如何設定,都可以將 Airflow 嵌入到 iframe 中。

Airflow 2.3.0 恢復了引數的原始含義。 如果您將其設定為“true”(預設),則可以將 Airflow 嵌入到 iframe 中(未新增標頭),但是當您將其設定為“false”時,將新增標頭,並且無法將 Airflow 嵌入到 iframe 中。

新功能

  • 新增動態任務對映 (AIP-42)

  • 新的網格檢視取代樹檢視 (#18675)

  • Python 運算子中模板化的 requirements.txt (#17349)

  • 允許重用裝飾的任務 (#22941)

  • 將資料庫配置移至新部分 (#22284)

  • 新增 SmoothOperator (#22813)

  • 使運算子的 execution_timeout 可配置 (#22389)

  • 事件時間表 (#22332)

  • 支援使用自定義 ti_deps 規則進行 DAG 序列化 (#22698)

  • 支援在任務日誌檢視中下載日誌 (#22804)

  • 支援在失敗時繼續回填 (#22697)

  • 新增 dag-processor cli 命令 (#22305)

  • 新增在 LDAP 模式下建立使用者的可能性 (#22619)

  • 為計劃的作業新增 ignore_first_depends_on_past (#22491)

  • 更新基本感測器運算子以支援 XCOM 返回值 (#20656)

  • 在 UI 觸發螢幕中為執行 ID 新增一個選項 (#21851)

  • 為連線啟用 JSON 序列化 (#19857)

  • 為批次更新 DAG 新增 REST API 端點 (#19758)

  • 將佇列按鈕新增到 click-on-DagRun 介面。 (#21555)

  • 新增 list-import-errorsairflow dags 命令 (#22084)

  • 如果 standalone_dag_processor 配置為 True,則將回調儲存在資料庫中。 (#21731)

  • 新增 LocalKubernetesExecutor (#19729)

  • 新增 celery.task_timeout_error 指標 (#21602)

  • Airflow db downgrade 命令列命令 (#21596)

  • 新增 ALL_SKIPPED 觸發規則 (#21662)

  • 新增 db clean CLI 命令用於清除舊資料 (#20838)

  • 新增 celery_logging_level (#21506)

  • 支援為 dag 檔案解析設定不同的超時值 (#21501)

  • 支援生成用於升級的 SQL 指令碼 (#20962)

  • 新增壓縮序列化 DAG 資料的選項 (#21332)

  • 分支 Python Operator 裝飾器 (#20860)

  • 將審計日誌檢視新增到 DAG 檢視 (#20733)

  • 為失敗的 SLA 回撥通知新增缺失的 StatsD 指標 (#20924)

  • 為尊重下游觸發規則,新增 ShortCircuitOperator 可配置性 (#20044)

  • 允許在 Webserver 的頁面標題中使用 Markup (#20888)

  • 新增跟蹤 TaskInstance 狀態更改的 Listener Plugin API (#20443)

  • 新增 context var hook 以注入更多環境變數 (#20361)

  • 新增一個將所有任務設定為跳過的按鈕 (#20455)

  • 清理掛起的 Pod (#20438)

  • 新增配置以警告 UI 中的公共部署暴露 (#18557)

  • 記錄檔名模板 (#20165)

  • 添加了 Windows 擴充套件 (#16110)

  • 在 Airflow 中顯示到下一個 dag_run 的近似時間 (#20273)

  • 擴充套件 UI 上的配置視窗 (#20052)

  • 新增將 DAG 依賴關係特性顯示到 CLI 的功能 (#19985)

  • 為 'airflow dags reserialize' 新增 cli 命令 (#19471)

  • 將缺失的 description 欄位新增到 Pool schema(REST API) (#19841)

  • 引入 DagRun 操作以將狀態更改為 queued。 (#19353)

  • 新增 DAG 執行詳細資訊頁面 (#19705)

  • 將角色匯出/匯入新增到 cli 工具 (#18916)

  • /dags 端點新增 dag_id_pattern 引數 (#18924)

改進

  • 在 UI 中顯示 schedule_interval/timetable 描述 (#16931)

  • 將 duration 列新增到 DAG 執行檢視 (#19482)

  • 啟用對自定義連線額外欄位的無字首使用 (#22607)

  • 將已完成計數器初始化為零 (#23080)

  • 改進可選提供程式特性訊息的日誌記錄 (#23037)

  • 在 resolve_template_files 中提供有意義的錯誤訊息 (#23027)

  • 更新 ImportError 條目而不是刪除並重新建立它們 (#22928)

  • 向 db reset 命令新增選項 --skip-init (#22989)

  • 支援從帶有 “.yml” 副檔名的檔案匯入連線 (#22872)

  • 支援在 .airflowignore 檔案中使用 glob 語法 (#21392) (#22051)

  • 當資料是單頁時,隱藏分頁 (#22963)

  • 支援在 Web UI 中對 DAG 進行排序 (#22671)

  • has_access 裝飾器的速度提高約 200 毫秒 (#22858)

  • 將 XComArg 新增到 Airflow 模組的惰性匯入列表 (#22862)

  • 向 REST API dags/dag_id/details 端點新增更多欄位 (#22756)

  • 不在 UI 中顯示不相關/重複/"內部" Task 屬性 (#22812)

  • 無需在 current_state 中載入整個 ti (#22764)

  • 修復 Pickle dag 異常字串 (#22760)

  • 更好地驗證 Localexecutor 的 parallelism 選項 (#22711)

  • 將 backfill 異常記錄到 sentry (#22704)

  • 在 backfill 期間重試 MySQL 死鎖上的提交 (#22696)

  • 向 REST API get DAG(dags/dag_id) 端點新增更多欄位 (#22637)

  • 使用時間表生成當前年份的計劃日期 (#22055)

  • 停用 Celery Worker 的連線池 (#22493)

  • 使日期選擇器標籤在觸發 dag 檢視中可見 (#22379)

  • 公開 airflow vars 中的 try_number (#22297)

  • 新增通用連線型別 (#22310)

  • 向 taskinstance finished 日誌訊息新增更多欄位 (#22262)

  • 如果排程程式未執行,則暫停自動重新整理 (#22151)

  • 顯示 DagModel 詳細資訊。 (#21868)

  • 將 pip_install_options 新增到 PythonVirtualenvOperator (#22158)

  • 顯示 airflow dags list CLI 命令的匯入錯誤 (#21991)

  • 當頁面隱藏時,暫停自動重新整理 (#21904)

  • 預設引數型別檢查 (#21809)

  • 增強 XComArg 上 magic 方法的 UX (#21882)

  • py 檔案不必在 refresh_dag 中檢查 is_zipfiles (#21926)

  • 修復 TaskDecorator 型別提示 (#21881)

  • 為變數新增“顯示記錄”選項 (#21342)

  • 儘可能使用 DB 來加速 airflow dag 子命令 (#21793)

  • REST API:在任務例項中新增呈現的欄位。 (#21741)

  • 將預設身份驗證後端更改為會話 (#21640)

  • 在解析期間,不要檢查 py DAG 檔案是否已壓縮 (#21538)

  • 切換 XCom 實現以使用 run_id (#20975)

  • 瀏覽檢視上的操作日誌 (#21569)

  • 實現多個 API 身份驗證後端 (#21472)

  • 更改 get_connection() 中連線資訊的日誌記錄級別詳細資訊 (#21162)

  • 在 airflow db shell 中支援 mssql (#21511)

  • 支援 Celery 的配置 worker_enable_remote_control (#21507)

  • CgroupTaskRunner 中記錄記憶體使用情況 (#21481)

  • 現代化 DAG 相關的 URL 路由,並將“tree”重新命名為“grid” (#20730)

  • 將 Zombie 檢測移動到 SchedulerJob (#21181)

  • 將執行 airflow 的速度提高 6 倍 (#21438)

  • 新增更多 SQL 模板欄位渲染器 (#21237)

  • 簡化 fab has access 查詢 (#19294)

  • 僅記錄預設方法的上下文 (#21244)

  • 僅當至少有一個正在執行時,才記錄觸發器狀態 (#21191)

  • 在 provider 中新增可選功能。 (#21074)

  • 更好地推斷 @task.python 的 multiple_outputs (#20800)

  • 改進字串型別和非屬性 template_fields 的處理 (#21054)

  • 刪除不需要的 deps/version 要求 (#20979)

  • 正確指定 TaskFlow API 的過載以進行型別提示 (#20933)

  • 將 notification_sent 引入 SlaMiss 檢視 (#20923)

  • 將任務裝飾器重寫為組合 (#20868)

  • 在瀏覽檢視中的過濾器中新增“大於/小於或等於” (#20602) (#20798)

  • 重寫任務命令中的 DAG 執行檢索 (#20737)

  • 將大型 DAG(5k+ 任務)的 DagRun 建立速度提高 25-130% (#20722)

  • 使原生環境具有像沙盒一樣的 Airflow 風格 (#20704)

  • 當引數值具有意外型別時,提供更好的錯誤提示 (#20648)

  • 在 DagRun REST API 中按狀態新增篩選器(列出 Dag 執行) (#20485)

  • 防止具有自定義日誌記錄處理程式的任務中的指數記憶體增長 (#20541)

  • 在日誌記錄 Mixin 中設定預設記錄器 (#20355)

  • 減少來自 www 的棄用警告 (#20378)

  • 在使用 nvd3.lineChart 的所有圖表的 x 軸上,將小時和分鐘新增到時間格式 (#20002)

  • 當任務請求的槽數超過定義的池時,新增特定警告 (#20178)

  • UI:更新 duration 列以提高可讀性 (#20112)

  • 使用 Viewer 角色作為示例公共角色 (#19215)

  • 正確實現 DAG 引數字典複製 (#20216)

  • ShortCircuitOperator 透過返回 python_callable 結果來推送 XCom (#20071)

  • 為因 Dagrun 超時而終止的任務新增明確的日誌記錄 (#19950)

  • 更改 Zombie 檢測訊息的日誌級別 (#20204)

  • 更好的確認提示 (#20183)

  • 僅執行正在執行的 DagRuns 的 TIs (#20182)

  • 必要時檢查並在命令中執行遷移 (#18439)

  • 僅在 Zombies 存在時才記錄 (#20118)

  • 增加電子郵件和使用者名稱的長度 (#19932)

  • 在 UI 中為 TI 新增更多過濾選項 (#19910)

  • 透過連線型別動態啟用“測試連線”按鈕 (#19792)

  • 避免使用 HA 排程程式在 postgres 伺服器日誌中亂用“無法獲取鎖” (#19842)

  • 重新命名 Connection.get_hook 引數,使其與 SqlSensorSqlOperator 中的引數相同。 (#19849)

  • 使用來自 PR #18718 的最新更改在 SqlSensor 中新增 hook_params。 (#18431)

  • 透過延遲 provider 初始化來加快 webserver 啟動時間 (#19709)

  • PythonOperator 中 XCOM 值的可配置日誌記錄 (#19378)

  • 最小化生產 js 檔案 (#19658)

  • BaseSqlOperator 中新增 hook_params (#18718)

  • 將缺失的“end_date”新增到雜湊元件 (#19281)

  • 更友好的 airflow plugins 命令輸出 + 新增時間表 (#19298)

  • 新增感測器預設超時配置 (#19119)

  • 更新 taskinstance REST API 模式以包含 dag_run_id 欄位 (#19105)

  • 在 bash operator 中新增將使用者定義的 env 變數附加到系統 env 變數的功能 (#18944)

  • 重複連線:添加了邏輯以查詢連線 id 是否存在,然後再建立一個 (#18161)

Bug 修復

  • 使用繼承的“trigger_tasks”方法 (#23016)

  • 在 DAG 依賴關係檢測器中,使用類型別而不是類名稱 (#21706)

  • 修復任務被 schedule_after_task_execution 錯誤跳過的問題 (#23181)

  • 修復啟用的 X-Frame 行為 (#23222)

  • 允許 extra 在連線有效負載中根據 schema(REST API) 可為空。 (#23183)

  • 修復 Web UI 中 DAG 級別訪問檢查的 dag_id 提取 (#23015)

  • 修復 UI 上日誌的時區顯示 (#23075)

  • 在圖表中包含錯誤資訊 (#23021)

  • 更改觸發器下拉選單的左側位置 (#23013)

  • 不要為舊版 DAG 執行新增計劃任務 (#23007)

  • 為 TaskInstance 引用新增懸空行檢查 (#22924)

  • 驗證連線 CLI 命令中的輸入引數 (#22688)

  • 修復觸發器事件有效負載未持久化到資料庫的問題 (#22944)

  • 在命令 db reset 中刪除 “airflow moved” 表 (#22990)

  • 為任務組工具提示新增最大寬度 (#22978)

  • external_task_ids 新增模板支援。 (#22809)

  • 允許 DagParam 持有 falsy 值 (#22964)

  • 修復池指標中的迴歸 (#22939)

  • 即使在使用池時也優先排序任務 (#22483)

  • 從延期恢復時不要清除 XCom (#22932)

  • 處理 get_logs_with_metadata endpoint 中的無效 JSON 元資料。 (#22898)

  • 修復針對 dag_run 的懸空行的預升級檢查 (#22850)

  • 修復了回填與排程程式的干擾 (#22701)

  • 支援回填執行的 conf 引數覆蓋 (#22837)

  • 正確插值 PoolSlotsAvailableDep 狀態中的池名稱 (#22807)

  • 修復 email_on_failurerender_template_as_native_obj 的配合使用 (#22770)

  • 修復 DagFileProcessorManager 上的處理器清理問題 (#22685)

  • 防止任務例項的元名稱衝突 (#22783)

  • 刪除甘特圖的 JSON 解析 (#22780)

  • 缺失 dagrun 的檢查應該知道版本 (#22752)

  • 修復 ScheduleInterval 規範 (#22635)

  • 修復非執行和非提交任務的任務狀態 (#22410)

  • 即使在 DEBUG 級別也不要記錄 hook 連線詳細資訊 (#22627)

  • 停止在從 kubernetes 客戶端收到空日誌時崩潰 (#22566)

  • 修復關於時區變更的錯誤 (#22525)

  • 修復當一個任務具有 end_date 時,整個 DAG 停止的問題 (#20920)

  • 使用 logger 在任務執行期間列印訊息。 (#22488)

  • 確保在異常處理期間不跳過 finalizers (#22475)

  • 更新智慧感測器文件,並對 is_smart_sensor_compatible() 進行小修復 (#22386)

  • 修復 run_id k8s 和 elasticsearch 與 Airflow 2.1 的相容性 (#22385)

  • 允許在 BranchPythonOperatorexcept_skip None (#20411)

  • 修復不正確的日期時間詳細資訊 (DagRun 檢視) (#21357)

  • 刪除 secrets 後端中不正確的棄用警告 (#22326)

  • 刪除用於 K8s 令牌重新整理的 RefreshConfiguration 解決方法 (#20759)

  • 遮蔽 GET /connections/<connection> 端點中的 extras (#22227)

  • 在將任務直接提交給執行器時設定 queued_dttm (#22259)

  • 解決了討論 #22233 中提到的一些教程問題 (#22236)

  • 將 docker 裝飾器的預設 python 可執行檔案更改為 python3 (#21973)

  • 當 NOTSET 時,不要驗證 Params 是否為 JSON (#22000)

  • 新增每個 DAG 的刪除許可權 (#21938)

  • 修復 kubernetes 23 庫中處理一些 None 引數的問題。 (#21905)

  • 修復在 bulk_write_to_db 中處理空 (None) 標籤的問題 (#21757)

  • 修復 DAG 日期範圍錯誤 (#20507)

  • 從 views.py 中刪除 request.referrer (#21751)

  • 使 DbApiHook 使用 Connection 中的 get_uri (#21764)

  • 修復一些遷移 (#21670)

  • 正確地在任務上[反]序列化資源 (#21445)

  • 將引數 dag_idtask_id 等新增到 XCom.serialize_value (#19505)

  • 更新測試連線功能以使用自定義表單欄位 (#21330)

  • 修復所有 “high” npm 漏洞 (#21526)

  • 修復了錯誤地從角色中刪除 action 而不是許可權的錯誤。 (#21483)

  • 使用 SQLA 1.4 修復 FAB/SecurityManager 中的關係連線錯誤 (#21296)

  • 在 SQLAlchemy 1.4 中為 MSSQL 使用 Identity 而不是 Sequence (#21238)

  • 確保 on_task_instance_running 監聽器可以訪問任務 (#21157)

  • 在觸發 DAG 時返回到同一位置 (#20955)

  • 修復 @task_group 中的任務 ID 去重 (#20870)

  • 為一些 FAB 遷移新增降級 (#20874)

  • 僅在觸發 DAG 時驗證 Params (#20802)

  • 修復 airflow trigger cli (#20781)

  • 修復池中任務例項的迭代以防止阻塞 (#20816)

  • 允許依賴於作為整體的 @task_group (#20671)

  • 如果任務在延期後繼續,則使用原始任務的 start_date (#20062)

  • 停用任務例項列表檢視頁面中的編輯按鈕 (#20659)

  • 修復包名稱匯入錯誤 (#20519) (#20519)

  • 在獲取清理 pod 列表時刪除 execution_date 標籤 (#20417)

  • 刪除不需要的 FAB REST API 端點 (#20487)

  • 修復包含斜槓的 Cloudwatch 日誌組 arn 的解析 (#14667) (#19700)

  • MySQL 的 TIMESTAMP 列的健全性檢查 (#19821)

  • 允許將預設 celery 命令組與從基於 Celery 的執行器繼承的執行器一起使用。 (#18189)

  • class_permission_name 移動到 mixin,以便它應用於所有類 (#18749)

  • 調整 trimmed_pod_id 並將 ‘.’ 替換為 ‘-’ (#19036)

  • 將 custom_headers 傳遞給 send_email 和 send_email_smtp (#19009)

  • 確保在示例 dags 中使用 catchup=False (#19396)

  • 編輯 OpenApi 描述檔案中的永久連結 (#19244)

  • 從搜尋 typeahead 列表中選擇時直接導航到 DAG (#18991)

  • [次要] 修復主頁上的填充 (#19025)

僅文件更改

  • 更新 DAG 檔案處理的文件 (#23209)

  • 現在用發行說明和 towncrier 替換 changelog/updating (#22003)

  • 修復 tracking-user-activity.rst 中的錯誤引用 (#22745)

  • 從文件中刪除對 rbac = True 的引用 (#22725)

  • 文件:更新執行器繫結依賴項的描述 (#22601)

  • 更新 check-health.rst (#22372)

  • 關於 Docker Compose 可定製性的更強烈的語言 (#22304)

  • 更新 logging-tasks.rst (#22116)

  • 新增 sql_alchemy_connect_args 的示例配置 (#22045)

  • 更新 best-practices.rst (#22053)

  • 新增有關 DAG 暫停/停用/刪除的資訊 (#22025)

  • 新增您可能需要的整合測試 dags 的簡短示例 (#22009)

  • 在 CHANGELOG 上執行包容性語言檢查 (#21980)

  • 為 Sendgrid 新增詳細的電子郵件文件 (#21958)

  • db upgrade / db downgrade 新增文件 (#21879)

  • 更新 modules_management.rst (#21889)

  • 修復 SqlAlchemy 1.4 方案更改的 UPDATING 部分 (#21887)

  • 更新 TaskFlow 教程文件以顯示如何傳遞 “operator-level” args。 (#21446)

  • 修復文件 - 將 decreasing 替換為 increasing (#21805)

  • 向文件新增另一種動態生成 DAG 的方法 (#21297)

  • 新增有關所需時間同步的額外資訊 (#21685)

  • 更新 debug.rst 文件 (#21246)

  • postgres:// 的用法替換為 postgresql:// (#21205)

  • 修復 CeleryExecutor 文件中的任務執行過程 (#20783)

雜項/內部

  • 恢復已棄用的安全管理器功能 (#23243)

  • DummyOperator 的用法替換為 EmptyOperator (#22974)

  • 棄用 DummyOperator,建議使用 EmptyOperator (#22832)

  • 刪除不必要的 python 3.6 條件語句 (#20549)

  • 將 /airflow/www 中的 moment 從 2.29.1 升級到 2.29.2 (#22873)

  • 將 /airflow/www 中的 prismjs 從 1.26.0 升級到 1.27.0 (#22823)

  • 將 /airflow/www 中的 nanoid 從 3.1.23 升級到 3.3.2 (#22803)

  • 將 /airflow/www 中的 minimist 從 1.2.5 升級到 1.2.6 (#22798)

  • 從 db init 命令中刪除 dag 解析 (#22531)

  • 更新我們用於執行器繫結依賴項的方法 (#22573)

  • 在 FAB 模型中使用 Airflow.Base.metadata (#22353)

  • 限制 docutils 以使我們的文件再次漂亮 (#22420)

  • 新增 Python 3.10 支援 (#22050)

  • [功能] 新增 1.22 1.23 K8S 支援 (#21902)

  • SQLA 現在是 1.4+,刪除 pandas 上限 (#22162)

  • 如果使用舊的 postgres 方案,則修補 sql_alchemy_conn (#22333)

  • 防止意外濫用 XCom.get_value() (#22244)

  • 排序遷移的檔名 (#22168)

  • 不要嘗試為 Celery 表自動生成遷移 (#22120)

  • 需要 SQLAlchemy 1.4 (#22114)

  • bump sphinx-jinja (#22101)

  • 為 SQLAlchemy 新增相容性填充以避免警告 (#21959)

  • xcom.dagrun_id 重新命名為 xcom.dag_run_id (#21806)

  • 棄用非 JSON conn.extra (#21816)

  • jsonschema 的上限版本提升到 5.0 (#21712)

  • 棄用輔助實用程式 days_ago (#21653)

  • 刪除 :type` 行,現在 sphinx-autoapi 支援型別提示 (#20951)

  • 消除測試中的棄用警告 (#20900)

  • 在更新 TI 的狀態(UI & REST API)時,使用 DagRun.run_id 而不是 execution_date (#18724)

  • 將 Context stub 新增到 Airflow 包 (#20817)

  • 更新 Kubernetes 庫版本 (#18797)

  • PodLauncher 重新命名為 PodManager (#20576)

  • 刪除 Python 3.6 支援 (#20467)

  • 為不可 JSON 序列化的引數新增棄用警告 (#20174)

  • 將 TaskMixin 重新命名為 DependencyMixin (#20297)

  • 棄用將 execution_date 傳遞給 XCom 方法 (#19825)

  • 刪除 get_readable_dagsget_editable_dags,以及 get_accessible_dags。 (#19961)

  • 刪除 postgres 9.6 支援 (#19987)

  • 刪除了硬編碼的連線型別。 檢查 hook 是否為 DbApiHook 的例項。 (#19639)

  • 新增 kubernetes 1.21 支援 (#19557)

  • 新增 FAB 基類並顯式設定 import_name。 (#19667)

  • 刪除用於處理自動更改檢視許可權的未使用狀態轉換。 (#19153)

  • Chore: 使用 enum 作為 __var__type 成員 (#19303)

  • 使用 fab 模型 (#19121)

  • 整合 Airflow Security Manager 和 FAB 預設值之間的方法名稱 (#18726)

  • 移除 Python 3.10 的 distutils 用法 (#19064)

  • 移除 SchedulerJob 中冗餘的 max_tis_per_query 初始化 (#19020)

  • 移除 API 中已棄用的 init_role() 用法 (#18820)

  • 移除 dbapi hook 上的重複程式碼 (#18821)

Airflow 2.2.5, (2022-04-04)

重大更改

沒有重大更改。

Bug 修復

  • 檢查並禁止 sqlite 的相對路徑 (#22530)

  • 修復了 dask executor 和測試 (#22027)

  • 修復了指向 celery 文件的損壞連結 (#22364)

  • 修復了提供給嘗試次數和落地時間圖表的不正確資料 (#21928)

  • 修復了未分配觸發器的分配問題 (#21770)

  • 修復了 triggerer --capacity 引數 (#21753)

  • 修復了頁面載入時圖表自動重新整理 (#21736)

  • 修復了目錄的檔案系統感測器 (#21729)

  • 修復了多餘的 order_by(TaskInstance.execution_date) (#21705)

  • 正確處理 LocalFileSystem secrets 中的多個“=” (#21694)

  • 記錄 local executor 中的異常 (#21667)

  • 在 web ui 上停用 default_pool 刪除 (#21658)

  • 擴充套件 typing-extensions 以使用 python 3.8+ 安裝 #21566 (#21567)

  • 釋放未使用的連線池 (#21565)

  • 修復任務失敗時記錄 JDBC SQL 錯誤的問題 (#21540)

  • 在存在覆蓋時過濾掉預設配置 (#21539)

  • 修復 Resources __eq__ 檢查 (#21442)

  • 修復 max_active_runs=1min_file_process_interval 較高時無法排程執行的問題 (#21413)

  • 減少 Stale DAG 停用導致的 DB 負載 (#21399)

  • 修復 triggerer 和 scheduler 之間的競爭條件 (#21316)

  • 修復從任務例項日誌檢視重定向觸發 DAG (#21239)

  • 記錄觸發器異常中的 traceback (#21213)

  • 觸發器可能使用連線;確保我們遮蔽密碼 (#21207)

  • 更新 ExternalTaskSensorLink 以處理模板化的 external_dag_id (#21192)

  • 確保 clear_task_instances 設定有效的執行狀態 (#21116)

  • 修復:更新自定義連線欄位處理 (#20883)

  • 截斷 DAG 使用者程式碼的堆疊跟蹤,用於執行期間引發的異常 (#20731)

  • 修復重複觸發器建立競爭條件 (#20699)

  • 修復任務卡在計劃狀態的問題 (#19747)

  • 修復:不渲染未定義的圖形邊緣 (#19684)

  • 僅當 X_FRAME_ENABLED 設定為 true 時,才將 X-Frame-Options 標頭設定為 DENY (#19491)

僅文件更改

  • on_execute_callback 新增到回撥文件 (#22362)

  • 新增有關指定 DB schema 的文件 (#22347)

  • 修復教程中 pipeline 示例的 postgres 部分 (#21586)

  • 擴充套件 DAG 和任務狀態的文件,並更新觸發器規則文件 (#21382)

  • 更新 Airflow 時需要 DB 升級 (#22061)

  • 從文件中刪除具有誤導性的 MSSQL 資訊 (#21998)

其他

  • 將新的 Airflow Trove Classifier 新增到 setup.cfg (#22241)

  • 在 TriggerRunner 中將 to_delete 重新命名為 to_cancel (#20658)

  • 將 Flask-AppBuilder 更新到 3.4.5 (#22596)

Airflow 2.2.4, (2022-02-22)

重大更改

智慧感測器已棄用

智慧感測器是 Airflow 2 中新增的“提前訪問”功能,現已棄用,並將在 Airflow 2.4.0 中刪除。它們已被 Airflow 2.2.0 中新增的可延遲運算子取代。

有關如何遷移的詳細資訊,請參閱 遷移到可延遲運算子

Bug 修復

  • 從 Flask-Appbuilder 新增缺少的登入提供程式相關方法 (#21294)

  • 修復由於作業表缺少 dag_id 索引而導致的 DAG 刪除緩慢的問題 (#20282)

  • 新增一個會話後端,用於將會話資料儲存在資料庫中 (#21478)

  • 僅顯示正在執行的 dags 的任務狀態或僅顯示最後一個完成的 dag 的任務狀態 (#21352)

  • 在日誌處理程式中使用相容的資料間隔 shim (#21289)

  • 修復 DAG 執行生成的 run_id 與邏輯日期不匹配的問題 (#18707)

  • 修復 TriggerDagRunOperator 額外連結 (#19410)

  • 新增在遠端使用者模式下建立使用者的可能性 (#19963)

  • 避免重新排程任務時出現死鎖 (#21362)

  • 修復 dag 首次執行的錯誤排程時間 (#21011)

  • 修復執行丟失 DAG 的任務例項時 Scheduler 崩潰的問題 (#20349)

  • 當 DAG 標記為失敗時,延遲的任務不會取消 (#20649)

  • 刪除 Dag.get_task_instances() 中重複的 dag_run join (#20591)

  • 避免刪除 DAG 時意外丟失資料 (#20758)

  • 修復 /rendered-k8s 檢視中的會話使用 (#21006)

  • 修復當執行兩次時 airflow dags backfill --reset-dagruns 錯誤 (#21062)

  • 不要在 refresh_from_task 中設定 TaskInstance.max_tries (#21018)

  • 不要在 dagrun REST API 端點的 body 中要求 dag_id (#21024)

  • 在內部安全管理器中從 Azure OAUTH 響應新增角色 (#20707)

  • 如果使用者具有 DAG “讀取”許可權,則允許檢視 DagRuns 和 TIs (#20663)

  • 修復執行兩次時 airflow dags test <dag_id> <execution_dt> 導致錯誤的問題 (#21031)

  • 切換到非 vendored 的最新 connexion 庫 (#20910)

  • 將 flask-appbuilder 提升到 >=3.3.4 (#20628)

  • 將 celery 升級到 5.2.3 (#19703)

  • 將 croniter 從 <1.1 提升到 <1.2 (#20489)

  • 避免為 TaskInstance.get_template_context() 呼叫 DAG.following_schedule() (#20486)

  • 修復(獨立):刪除硬編碼的 Webserver 埠 (#20429)

  • 刪除實驗性 API 中不必要的日誌記錄 (#20356)

  • 取消忽略 DeprecationWarning (#20322)

  • Deepcopying Kubernetes Secrets 屬性導致問題 (#20318)

  • 修復(dag-dependencies):修復箭頭樣式 (#20303)

  • 新增任務例項檢索鎖的重試 (#20030)

  • 使用 dogstatsd 時正確傳送定時指標(修復 schedule_delay 指標) (#19973)

  • 增強 dict 型別化的 multiple_outputs 推斷 (#19608)

  • 修復 Amazon SES 電子郵件後端 (#18042)

  • Pin MarkupSafe,直到我們能夠升級 Flask/Jinja (#21664)

僅文件更改

  • 在 DAG 執行文件中添加了解釋邏輯日期的概念 (#21433)

  • 新增關於帶有 env vars 的變數優先順序的說明 (#21568)

  • 更新錯誤文件以包含 before_send 選項 (#21275)

  • 擴充 xcom 文件 (#20755)

  • 新增關於 “最新” 約束的文件和釋出策略 (#21093)

  • 在 Python API 參考中新增指向 DAG 模型的連結 (#21060)

  • 添加了一個 enum 引數示例 (#20841)

  • 比較 taskgroup 和 subdag (#20700)

  • 新增關於保留的 params 關鍵字的說明 (#20640)

  • 改進 Params 的文件 (#20567)

  • 修復 MySQL 資料庫建立程式碼中的錯字(設定 DB 文件) (#20102)

  • 新增 requirements.txt 描述 (#20048)

  • 清理文件中的 default_args 用法 (#19803)

  • 將 docker-compose 解釋新增到 conn localhost (#19076)

  • 更新教程的 CSV 提取程式碼 (#18960)

  • 新增 Pendulum 1.x -> 2.x 升級文件 (#18955)

  • 從文件中清除動態 start_date 值 (#19607)

  • 多個池插槽的文件 (#20257)

  • 使用如何解決升級後警告的詳細程式碼示例更新 upgrading.rst (#19993)

其他

  • 棄用實驗性 API 中的一些函式 (#19931)

  • 棄用智慧感測器 (#20151)

Airflow 2.2.3, (2021-12-21)

重大更改

沒有重大更改。

Bug 修復

  • 延遲 Jinja2 上下文 (#20217)

  • 排除 snowflake-sqlalchemy v1.2.5 (#20245)

  • 從舊版 importlib.resources API 遷移 (#19091)

  • setgid 作為 forked 任務 runner 中執行的第一個命令移動 (#20040)

  • 修復啟動 DagProcessorAgent 時的競爭條件 (#19935)

  • httpx 限制為 <0.20.0 (#20218)

  • 將 provider 匯入錯誤記錄為除錯警告 (#20172)

  • 提升所需的最低 alembic 版本 (#20153)

  • 修復 gantt 檢視中的日誌連結 (#20121)

  • 透過將 chown 移動到使用 sudo 來修復 #19028 (#20114)

  • 取消 MarkupSafe 的上限 (#20113)

  • 修復編輯日誌時的無限遞迴 (#20039)

  • 修復 db 降級 (#19994)

  • Context 類處理棄用 (#19886)

  • 修復可能引用未宣告變數的問題 (#19933)

  • 驗證在分配時 DagRun 狀態是否有效 (#19898)

  • 解決 MSSQL 的偶爾死鎖 (#19856)

  • 使任務執行設定能夠重新初始化 (#19845)

  • 修復同一任務的日誌端點 (#19672)

  • 顯式強制轉換宏 datetime 字串輸入 (#19592)

  • 當任務例項丟失時,不要崩潰並顯示堆疊跟蹤 (#19478)

  • 修復任務日誌檢視中的日誌時區 (#19342) (#19401)

  • 修復:將 taskgroup 工具提示新增到圖形檢視 (#19083)

  • 在表單和表格中重新命名執行日期 (#19063)

  • 簡化“無效的 TI 狀態”訊息 (#19029)

  • 處理準備檔案路徑佇列時不存在檔案的情況 (#18998)

  • 不要為匯入錯誤的 DAG 建立 dagrun (#19367)

  • 修復在連線型別之間切換時欄位重新命名的問題 (#19411)

  • KubernetesExecutor 應該預設使用模板映象 (如果已使用) (#19484)

  • 修復任務例項 API 無法列出狀態為 None 的任務例項 (#19487)

  • 修復 DagFileProcessor.manage_slas 中的 IntegrityError (#19553)

  • 將資料間隔欄位宣告為可序列化的 (#19616)

  • 放寬時間表類驗證 (#19878)

  • 修復用於查詢排隊的 KubernetesExecutor Pod 的標籤 (#19904)

  • 修復使用複製時 MySQL 的移動資料遷移檢查 (#19999)

僅文件更改

  • 當 example_dags 缺少依賴項時發出警告,而不是顯示回溯 (#20295)

  • 可延遲運算子文件澄清 (#20150)

  • 確保所有示例 DAG 都能正常工作 (#19355)

  • 更新核心示例 DAG 以在適用的情況下使用 TaskFlow API (#18562)

  • 在任務重試時新增 xcom 清除行為 (#19968)

  • 新增一個簡短的章節,重點介紹如何調整連線的金鑰格式 (#19859)

  • 新增有關 Apache Airflow 支援的作業系統的資訊 (#19855)

  • 更新文件以反映更改 base_log_folder 需要更新其他配置 (#19793)

  • KubernetesExecutor Pod 模板文件中的免責宣告 (#19686)

  • 新增有關 execution_date -> run_id 的升級說明 (#19593)

  • 在 TaskFlow 教程文件中擴充套件 .output 運算子屬性資訊 (#19214)

  • 新增示例 SLA DAG (#19563)

  • 新增一個正確的示例來修補 DAG (#19465)

  • 將 DAG 檔案處理描述新增到 Scheduler Concepts (#18954)

  • 更新 TaskFlow API 教程文件中的顯式引數示例 (#18907)

  • 添加回關於在 Python/@task 中使用上下文的文件 (#18868)

  • 新增端點/欄位新增到 REST API 中的釋出日期 (#19203)

  • 更好的 pod_template_file 示例 (#19691)

  • 新增有關如何自定義映象入口點的描述 (#18915)

  • Dags-in-image Pod 模板示例不應具有 DAG 掛載 (#19337)

Airflow 2.2.2 (2021-11-15)

重大更改

沒有重大更改。

Bug 修復

  • 修復檢查 Variable 是否存在時的錯誤 (#19395)

  • 修復將 relativedelta 作為 schedule_interval 傳遞時的序列化 (#19418)

  • 修復 SQL Server 中懸掛 TaskInstance 行的移動 (#19425)

  • 修復甘特圖檢視中的任務例項模態框 (#19258)

  • 修復具有集合資料型別的 Params 的序列化 (#19267)

  • 在呼叫 .is_alive() 之前檢查 job 物件是否為 None (#19380)

  • 當 Pod 無法處理時,任務應立即失敗 (#19359)

  • 修復資料庫遷移的降級 (#19390)

  • 僅將 SchedulerJobs 標記為失敗,而不是任何作業 (#19375)

  • 修復“標記為”確認頁面上的訊息 (#19363)

  • Bugfix: 在讀取資料間隔之前檢查下一個執行是否存在 (#19307)

  • 修復帶有預設編碼/排序規則的 MySQL 資料庫遷移 (#19268)

  • 修復隱藏的工具提示位置 (#19261)

  • sqlite_default 連線已硬編碼為 /tmp,請改用 gettempdir (#19255)

  • 修復 DAG 程式碼頁面上的切換換行 (#19211)

  • 在 CLI 中闡明“未找到 DAG”錯誤訊息 (#19338)

  • 向 SLA 新增關於 schedule_interval 的註釋 (#19173)

  • 使用 execution_date 檢查 TriggerDagRunOperator 是否存在 DagRun (#18968)

  • PoolSlotsAvailableDep 中新增顯式會話引數 (#18875)

  • FAB 仍然需要 WTForms<3.0 (#19466)

  • 修復 catchup=True 時缺少 dagruns 的問題 (#19528)

僅文件更改

  • 為“timetable”新增缺少的引數文件 (#19282)

  • 改進 Kubernetes Executor 文件 (#19339)

  • 更新 Docker 文件中使用的映象標籤

Airflow 2.2.1 (2021-10-29)

重大更改

Paramdefault 預設值已刪除

在 Airflow 2.2.0 中引入的 Param 意外地將預設值設定為 None。此預設值已刪除。 如果你想要 None 作為預設值,請顯式地將其設定為預設值。 例如

Param(None, type=["null", "string"])

現在,如果你解析一個沒有預設值的 Param 並且沒有傳遞值,你將收到一個 TypeError。 例如

Param().resolve()  # raises TypeError

max_queued_runs_per_dag 配置已被刪除

[core] 部分中的 max_queued_runs_per_dag 配置選項已被刪除。 以前,這控制了排程程式可以在 DAG 中建立的排隊 dagrun 的數量。 現在,最大數量由 DAG 的 max_active_runs 在內部控制

Bug 修復

  • 修復 SchedulerJob 中的意外提交錯誤 (#19213)

  • 新增 DagRun.logical_date 作為屬性 (#19198)

  • 在任務完成時清除 ti.next_methodti.next_kwargs (#19183)

  • 更快地將 PostgreSQL 資料庫遷移到 Airflow 2.2 (#19166)

  • 刪除 Swagger2Specification._set_defaults 類方法中的不正確的型別註釋 (#19065)

  • 將 TriggererJob 新增到作業檢查命令 (#19179, #19185)

  • 當下一個執行為 None 時隱藏工具提示 (#19112)

  • 使用資料間隔相容層建立 TI 上下文 (#19148)

  • 修復排隊的 DAG 執行更改 catchup=False 的行為 (#19130, #19145)

  • 在 DAG 或任務完成時,將詳細資訊新增到日誌記錄中。 (#19097)

  • 警告不支援 Python 3.10 (#19060)

  • 透過使用 max_active_runs 限制排隊的 dagrun 建立來修復 catchup (#18897)

  • 防止序列化 DAG 丟失時排程程式崩潰 (#19113)

  • 不要為其他資料庫安裝 SQLAlchemy/Pendulum 介面卡 (#18745)

  • 解決 libstdcpp TLS 錯誤 (#19010)

  • dsts 等改回使用邏輯日期 (#19088)

  • 確保在標記為失敗/成功/跳過時任務狀態不會更改 (#19095)

  • 放寬打包要求 (#19087)

  • 將觸發器頁面標籤重新命名為邏輯日期 (#19061)

  • 允許 Param 支援預設值 None (#19034)

  • 從資料庫反序列化時,升級舊的 DAG/任務引數格式 (#18986)

  • 不要將 ENV 和 _cmd 烘焙到非 sudo 的 tmp 配置中 (#18772)

  • CLI:如果在缺少引數的情況下載入 DAG 之前,backfill 命令失敗 (#18994)

  • BugFix:插入到 task_fail 時執行日期為空,違反了 NOT NULL (#18979)

  • 嘗試在資料庫升級中移動“懸掛”行 (#18953)

  • SchedulerJob._process_executor_events 中行鎖定 TI 查詢 (#18975)

  • Sentry 傳送前的回退 (#18980)

  • 修復 Airflow 2.2.0 中的 XCom.delete 錯誤 (#18956)

  • 在啟動觸發器之前檢查 Python 版本 (#18926)

僅文件更改

  • 更新 TaskInstances 和 DagRuns 的訪問控制文件 (#18644)

  • 新增有關託管 Postgres 的 keepalive 的資訊 (#18850)

  • Doc:向日志記錄和監控添加回調部分 (#18842)

  • 將 PATCH DAGrun 與其他 DAGRun 端點組合在一起 (#18885)

Airflow 2.2.0 (2021-10-11)

重大更改

注意:將資料庫升級到 2.2.0 或更高版本可能需要一段時間才能完成,特別是如果你有一個大型 task_instance 表。

worker_log_server_port 配置已移動到 logging 部分。

worker_log_server_port 配置選項已從 [celery] 部分移動到 [logging] 部分,以便允許在不同的執行器之間重用。

pandas 現在是一個可選依賴項

以前,pandas 是一個核心要求,因此當你執行 pip install apache-airflow 時,它會查詢 pandas 庫,如果它不存在,則會安裝它。

如果要安裝與 Airflow 相容的 pandas,可以在安裝 Airflow 時使用 [pandas] extra,例如 Python 3.8 和 Airflow 2.1.2

pip install -U "apache-airflow[pandas]==2.1.2" \
  --constraint https://raw.githubusercontent.com/apache/airflow/constraints-2.1.2/constraints-3.8.txt"

none_failed_or_skipped 觸發規則已被棄用

TriggerRule.NONE_FAILED_OR_SKIPPEDTriggerRule.NONE_FAILED_MIN_ONE_SUCCESS 替代。這只是名稱更改,沒有進行功能更改。此更改是向後相容的,但是 TriggerRule.NONE_FAILED_OR_SKIPPED 將在下一個主要版本中刪除。

虛擬觸發規則已被棄用

TriggerRule.DUMMYTriggerRule.ALWAYS 替代。這只是名稱更改,沒有進行功能更改。此更改是向後相容的,但是 TriggerRule.DUMMY 將在下一個主要版本中刪除。

DAG 併發設定已重新命名

[core] dag_concurrencyairflow.cfg 中的設定已重新命名為 [core] max_active_tasks_per_dag,以便更好地理解。

它是每個 DAG 允許併發執行的任務例項的最大數量。要計算 DAG 併發執行的任務數量,請將 DAG 的所有 DAG 執行的執行任務數量相加。

這可以在 DAG 級別使用 max_active_tasks 進行配置,並且可以在 airflow.cfg 中設定為預設值 [core] max_active_tasks_per_dag

之前:

[core]
dag_concurrency = 16

現在:

[core]
max_active_tasks_per_dag = 16

類似地,DAG.concurrency 已重新命名為 DAG.max_active_tasks

之前:

dag = DAG(
    dag_id="example_dag",
    start_date=datetime(2021, 1, 1),
    catchup=False,
    concurrency=3,
)

現在:

dag = DAG(
    dag_id="example_dag",
    start_date=datetime(2021, 1, 1),
    catchup=False,
    max_active_tasks=3,
)

如果您正在使用 DAGs Details API endpoint,請使用 max_active_tasks 代替 concurrency

任務併發引數已重新命名

BaseOperator.task_concurrency 已被棄用並重命名為 max_active_tis_per_dag,以便更好地理解。

此引數控制每個任務跨 dag_runs 併發執行的任務例項的數量。

之前:

with DAG(dag_id="task_concurrency_example"):
    BashOperator(task_id="t1", task_concurrency=2, bash_command="echo Hi")

之後:

with DAG(dag_id="task_concurrency_example"):
    BashOperator(task_id="t1", max_active_tis_per_dag=2, bash_command="echo Hi")

processor_poll_interval 配置已重新命名為 scheduler_idle_sleep_time

[scheduler] processor_poll_intervalairflow.cfg 中的設定已重新命名為 [scheduler] scheduler_idle_sleep_time,以便更好地理解。

它控制 SchedulerJob 中沒有安排任何內容時,排程器迴圈結束時的“睡眠時間”。

之前:

[scheduler]
processor_poll_interval = 16

現在:

[scheduler]
scheduler_idle_sleep_time = 16

標記成功/失敗會自動清除失敗的下游任務

在圖形檢視中標記任務成功/失敗時,處於 failed/upstream_failed 狀態的下游任務將自動清除。

[core] store_dag_code 已被刪除

雖然 DAG 序列化自 Airflow 2 以來是一個嚴格的要求,但我們允許使用者控制 Webserver 在顯示 **程式碼檢視** 時查詢的位置。

如果 [core] store_dag_code 設定為 True,則排程器將 DAG 檔案中的程式碼作為純字串儲存在 DB 中(在 dag_code 表中),Webserver 只是從同一個表中讀取它。如果該值設定為 False,則 Webserver 從 DAG 檔案中讀取它。

雖然此設定對於 Airflow < 2 來說是有意義的,但它給一些使用者造成了一些困惑,他們認為此設定控制 DAG 序列化。

從 Airflow 2.2 開始,當用戶單擊 DAG 的 **程式碼檢視** 時,Airflow 只會查詢 DB。

清除正在執行的任務將其狀態設定為 RESTARTING

以前,清除正在執行的任務會將其狀態設定為 SHUTDOWN。該任務被終止並進入 FAILED 狀態。在 #16681 之後,清除正在執行的任務會將其狀態設定為 RESTARTING。該任務有資格重試,而不會進入 FAILED 狀態。

刪除 TaskInstance.log_filepath 屬性

此方法長期以來返回不正確的值,因為它沒有考慮到不同的記錄器配置和任務重試。我們還開始支援更多不使用檔案的高階工具,因此不可能在每種情況下都確定正確的檔案路徑,例如 Stackdriver 不使用檔案,而是基於標籤識別日誌。因此,我們決定刪除此屬性。

如果您需要讀取日誌,可以使用 airflow.utils.log.log_reader.TaskLogReader 類,該類沒有上述限制。

如果感測器超時,它將不會重試

以前,當感測器超時時,會重試它直到 retries 的數量耗盡。因此,感測器的有效超時時間是 timeout * (retries + 1)。此行為現已更改。如果達到 timeout,感測器將立即失敗,而無需重試。如果希望感測器繼續執行更長時間,請設定更大的 timeout

可以使用 [core] default_pool_task_slot_count 設定預設任務池槽位

預設情況下,任務在 default_pool 中執行。default_pool 使用 128 個槽位初始化,使用者可以透過 UI/CLI/API 更改現有部署的槽位數量。

對於新的部署,您可以使用 default_pool_task_slot_count[core] 部分進行設定。此設定對 default_pool 已經存在的現有部署沒有任何影響。

以前,這是由 non_pooled_task_slot_count[core] 部分控制的,但沒有記錄。

Webserver DAG 重新整理按鈕已刪除

現在 DAG 解析器同步了 DAG 許可權,不再需要手動重新整理 DAG。因此,從 UI 中刪除了重新整理 DAG 的按鈕。

此外,/refresh/refresh_all Webserver 端點也已刪除。

TaskInstances 現在*需要* DagRun

在正常操作下,資料庫中的每個 TaskInstance 行都有 DagRun 行,但可以手動刪除 DagRun,Airflow 仍將排程 TaskInstances。

在 Airflow 2.2 中,我們已經更改了這一點,現在有一個數據庫級別的外部索引鍵約束,確保每個 TaskInstance 都有一個 DagRun 行。

在更新到此 2.2 版本之前,如果您有任何“懸空”TaskInstance”行,您必須手動解決任何不一致之處(添加回 DagRun 行,或刪除 TaskInstances)。

作為此更改的一部分,clean_tis_without_dagrun_interval 配置選項已在 [scheduler] 部分下刪除,並且不起作用。

TaskInstance 和 TaskReschedule 現在定義 run_id 而不是 execution_date

作為 TaskInstance-DagRun 關係更改的一部分,TaskInstance 和 TaskReschedule 上的 execution_date 列已從資料庫中刪除,並替換為 ORM 級別的 關聯代理 欄位。如果您直接訪問 Airflow 的元資料資料庫,您應該重寫實現以使用 run_id 列。

請注意,Airflow 在資料庫和 ORM 級別的元資料庫定義被認為是實現細節,沒有嚴格的向後相容性保證。

DaskExecutor - Dask Worker 資源和佇列

如果 Dask worker 沒有使用與指定佇列相匹配的補充資源啟動,現在將導致 AirflowException,而之前它只會忽略 queue 引數。

從 Web UI 觸發的 DAG 執行的邏輯日期現在將其亞秒部分設定為零

由於手動 DAG 執行的邏輯日期(execution_date)的生成方式發生了變化,手動 DAG 執行的邏輯日期可能與其觸發時間不匹配,而是將其亞秒部分歸零。例如,在 2021-10-11T12:34:56.78901 觸發的 DAG 執行的邏輯日期將被設定為 2021-10-11T12:34:56.00000

這可能會影響一些依賴此特性的邏輯,用於檢測執行是否是手動觸發的。請注意,dag_run.run_type 是用於此目的的更權威的值。此外,如果您需要區分自動化觸發的執行和手動觸發的執行,以便計算“下一次執行日期”,請考慮使用新的資料間隔變數,它們在這兩種執行型別之間提供更一致的行為。

新功能

  • AIP-39:向 Airflow 新增(可自定義的)時間表類,以實現更豐富的排程行為 (#15397, #16030, #16352, #17030, #17122, #17414, #17552, #17755, #17989, #18084, #18088, #18244, #18266, #18420, #18434, #18421, #18475, #18499, #18573, #18522, #18729, #18706, #18742, #18786, #18804)

  • AIP-40:新增可延期的“非同步”任務 (#15389, #17564, #17565, #17601, #17745, #17747, #17748, #17875, #17876, #18129, #18210, #18214, #18552, #18728, #18414)

  • 新增 Docker Taskflow 裝飾器 (#15330, #18739)

  • 新增 Airflow Standalone 命令 (#15826)

  • 從本地設定在儀表板上顯示警報訊息 (#18284)

  • 使用 json-schema 的高階引數 (#17100)

  • 能夠從 UI 或 API 測試連線 (#15795, #18750)

  • 向 UI 新增下次執行 (#17732)

  • 新增預設權重規則配置選項 (#18627)

  • 新增日曆欄位以在觸發 DAG 時選擇 DAG 的執行日期 (#16141)

  • 允許為 BashOperator 設定特定的 cwd (#17751)

  • 在 DAG 檢視中顯示匯入錯誤 (#17818)

  • 新增執行前/後鉤子 [實驗性] (#17576)

  • 新增表格以在 Airflow UI 的管理選項卡下檢視提供程式 (#15385)

  • 將 secrets 後端/日誌記錄/身份驗證資訊新增到 provider yaml (#17625)

  • 將日期格式過濾器新增到 Jinja 環境 (#17451)

  • 引入 RESTARTING 狀態 (#16681)

  • Webserver:手動觸發時取消暫停 DAG (#16569)

  • 用於建立新使用者的 API 端點 (#16609)

  • 新增 insert_args 以支援傳輸替換 (#15825)

  • 向檔案系統感測器中的 glob 新增遞迴標誌 (#16894)

  • 將 conn 新增到 jinja 模板上下文 (#16686)

  • TaskGroup 新增 default_args (#16557)

  • 允許從 UI 新增重複連線 (#15574)

  • 允許透過 CORS 配置選項指定多個 URL (#17941)

  • 實現用於 DAG 刪除的 API 端點 (#17980)

  • 新增 DAG 執行端點以標記 dagrun 成功或失敗 (#17839)

  • kinit 選項 [-f|-F][-a|-A] 新增支援 (#17816)

  • 使用 Dask Worker Resources 為 DaskExecutor 提供佇列支援 (#16829, #18720)

  • 使自動重新整理間隔可配置 (#18107)

改進

  • Airflow UI 的小改進 (#18715, #18795)

  • processor_poll_interval 重新命名為 scheduler_idle_sleep_time (#18704)

  • 檢查日誌記錄級別的允許值 (#18651)

  • 修復使用 dagrun_conf 觸發不存在的 dag 時發生的錯誤 (#18655)

  • 將 muldelete 操作新增到 TaskInstanceModelView (#18438)

  • 避免在清理資料庫安裝期間匯入 DAG (#18450)

  • 需要 DAG 許可權才能修改 TaskInstance 和 DagRun (#16634)

  • 使 Kubernetes 作業描述適合一行日誌 (#18377)

  • 如果任務例項狀態為 null 或未定義,則始終繪製邊框 (#18033)

  • 包容性語言 (#18349)

  • 改進了對殭屍任務的日誌處理 (#18277)

  • 新增 Variable.update 方法並改進了對變數鍵衝突的檢測 (#18159)

  • 在觸發 DAG 頁面上新增有關引數的說明 (#18166)

  • TaskInstanceTaskReschedule PK 從 execution_date 更改為 run_id (#17719)

  • BaseOperator.chain() 中新增 TaskGroup 支援 (#17456)

  • 允許在 REST API 中按標籤過濾 DAG (#18090)

  • 最佳化 Provider Manager 的匯入 (#18052)

  • 為不相容的社群提供程式新增警告功能 (#18020)

  • 序列化 template_ext 屬性以在 UI 中顯示它 (#17985)

  • 新增 robots.txtX-Robots-Tag 標頭 (#17946)

  • 重構 BranchDayOfWeekOperator, DayOfWeekSensor (#17940)

  • 更新錯誤訊息以指導使用者進行自助 (#17929)

  • 更新到 Celery 5 (#17397)

  • 新增指向提供程式文件的連結 (#17736)

  • 刪除 Marshmallow schema 警告 (#17753)

  • none_failed_or_skipped 重新命名為 none_failed_min_one_success 觸發規則 (#17683)

  • 刪除 [core] store_dag_code 並使用 DB 獲取 Dag 程式碼 (#16342)

  • task_concurrency 重新命名為 max_active_tis_per_dag (#17708)

  • 在 providers manager 中延遲單獨匯入 Hooks (#17682)

  • 在外部任務感測器中新增對多個 task-id 的支援 (#17339)

  • 在 airflow tasks run 命令中將 execution_date 替換為 run_id (#16666)

  • 使使用者 cli 命令的輸出更加一致 (#17642)

  • 就地開啟相對額外連結 (#17477)

  • worker_log_server_port 選項移動到日誌記錄部分 (#17621)

  • 使用 gunicorn 來提供 worker 生成的日誌 (#17591)

  • 改進 Group id 的驗證 (#17578)

  • 簡化 404 頁面 (#17501)

  • 新增 XCom.clear 以便在自定義 XCom 後端中可以掛鉤 (#17405)

  • SubDagOperator 新增棄用通知 (#17488)

  • 支援 DAGS 資料夾位於排程程式和執行程式上的不同位置 (#16860)

  • 刪除 /dagrun/create 並停用 F.A.B 生成的編輯表單 (#17376)

  • 允許在 template_fields_renderers 中指定字典路徑 (#17321)

  • 如果 virtualenv 丟失,則提前出錯 (#15788)

  • 處理新增到 Extra 和自定義欄位的連線引數 (#17269)

  • 修復 airflow celery stop 以接受 pid 檔案。 (#17278)

  • 刪除 DAG 重新整理按鈕 (#17263)

  • 棄用 dummy 觸發規則,支援 always (#17144)

  • 詳細說明匯入 airflow_local_settings 失敗的原因 (#17195)

  • BashOperator 失敗時,在 AirflowException str 中包含退出程式碼。 (#17151)

  • 為 chain() 新增 EdgeModifier 支援 (#17099)

  • 僅允許在自定義連線中使用支援的欄位型別 (#17194)

  • Secrets 後端故障轉移 (#16404)

  • 使用 SQLiteSequentialExecutor 時,在 Webserver 上發出警告 (#17133)

  • 擴充套件在 pod_override 中定義的 init_containers (#17537)

  • 客戶端過濾 dag 依賴項 (#16253)

  • 改進 CLI 中的執行程式驗證 (#17071)

  • 防止並行執行 airflow db init/upgrade 遷移和設定。 (#17078)

  • 更新 chain()cross_downstream() 以支援 XComArgs (#16732)

  • 改進圖形檢視重新整理 (#16696)

  • 當任務例項因異常而失敗時,記錄它 (#16805)

  • serve-logsLocalExecutor 設定程序標題 (#16644)

  • test_cycle 重新命名為 check_cycle (#16617)

  • 新增 schema 作為 DbApiHook 例項屬性 (#16521, #17423)

  • 提高與 MSSQL 的相容性 (#9973)

  • 為不受支援的連線型別新增透明度 (#16220)

  • 呼叫基於資源 fab 的方法 (#16190)

  • 使用時區格式化更多日期 (#16129)

  • 將已棄用的 dag.sub_dag 替換為 dag.partial_subset (#16179)

  • AirflowSensorTimeout 視為立即失敗,不進行重試 (#12058)

  • 自動標記成功/失敗會清除失敗的下游任務 (#13037)

  • 為匯入 DAG 錯誤新增關閉/開啟指示器 (#16073)

  • 新增可摺疊的匯入錯誤 (#16072)

  • 始終在 TI 的 action_clear 檢視中返回響應 (#15980)

  • 新增透過電子郵件刪除使用者的 CLI 命令 (#15873)

  • 為 FAB 許可權使用資源和操作名稱 (#16410)

  • 重新命名 DAG 併發 ([core] dag_concurrency) 設定,以便更容易理解 (#16267, #18730)

  • 日曆 UI 改進 (#16226)

  • 重構: SKIPPED 不應再次記錄為 SUCCESS (#14822)

  • 移除 dnspython 的版本限制 (#18046, #18162)

  • 在 TriggerDagRunOperator 中接受自定義執行 ID (#18788)

錯誤修復

  • 使 REST API patch user 端點的行為與 UI 相同 (#18757)

  • 正確設定已清除任務的 start_date (#18708)

  • 確保在更新其狀態 (REST API) 之前存在 task_instance (#18642)

  • 使 AirflowDateTimePickerWidget 成為必填欄位 (#18602)

  • 重試刪除舊渲染任務欄位時的死鎖事務 (#18616)

  • 修復重試延遲為零時 retry_exponential_backoff 除以零的錯誤 (#17003)

  • 改進 UI 處理日期時間的方式 (#18611, #18700)

  • Bugfix: dag_bag.get_dag 應該返回 None,而不是引發異常 (#18554)

  • 僅在任務模態是一個有效例項時顯示它 (#18570)

  • 修復從模板中訪問渲染的 {{ task.x }} 屬性 (#18516)

  • 新增缺少的電子郵件型別的連線 (#18502)

  • 不要為“同一頁面”UI 訊息使用閃現訊息 (flash). (#18462)

  • 修復任務組工具提示 (#18406)

  • 正確修復 dagrun 更新狀態端點 (#18370)

  • 正確處理執行器和排程器之間的 ti 狀態差異 (#17819)

  • 修復 KubernetesExecutor 中卡住的“queued”任務 (#18152)

  • 不要永久將 zip DAG 新增到 sys.path (#18384)

  • 修復 MSSQL 資料庫中的隨機死鎖 (#18362)

  • 停用已從檔案中刪除的 DAG (#17121)

  • 當將 DAG 同步到資料庫時,刪除現在未使用的 dag_tag 行 (#8231)

  • 錯誤時正常關閉排程程式 (#18092)

  • 修復 mini 排程程式不遵循 wait_for_downstream 依賴關係 (#18338)

  • 將異常傳遞給 Debug Executor 的 run_finished_callback (#17983)

  • 使 XCom.get_one 返回完整值,而不是縮寫值 (#18274)

  • 在 task_runner 中關閉臨時檔案時使用 try/except (#18269)

  • 如果 next run 不是 None,則顯示它 (#18273)

  • 修復 XCom.set 中的資料庫會話處理 (#18240)

  • 修復手動執行作業未設定 external_executor_id 的問題 (#17207)

  • 修復序列化 DAG 表中壓縮 DAG 的刪除 (#18243)

  • 在使用者新增時,如果電子郵件重複,則返回明確的錯誤 (#18224)

  • 即使上次執行資料為空也移除載入點 (#18230)

  • 交換 DAG 匯入錯誤下拉選單圖示 (#18207)

  • 遷移配置時自動建立 section (#16814)

  • 預設情況下,在讀取任務日誌時將編碼設定為 utf-8 (#17965)

  • 將父 DAG 許可權應用於子 DAG (#18160)

  • 將 MySQL 的 id 排序規則更改為區分大小寫 (#18072)

  • StandardTaskRunner 中記錄任務啟動異常 (#17967)

  • 將許可權應用於 self._error_file (#15947)

  • 修復空白 DAG 依賴關係檢視 (#17990)

  • 為 DAG 依賴關係和配置頁面新增缺失的選單訪問許可權 (#17450)

  • 修復在 DateTimeSensor 中傳遞 Jinja 模板的問題 (#17959)

  • 修復了限制 ImportError 可見性的錯誤 (#17924)

  • 修復 traceback.html 中的語法 (#17942)

  • 修復 MySQLdb 驅動程式的 DagRunState 列舉查詢 (#17886)

  • 修復了“操作”組中的按鈕大小。 (#17902)

  • 僅顯示使用者可以訪問的 DAG 的匯入錯誤 (#17835)

  • 顯示來自 zip 檔案的所有 import_errors (#17759)

  • 修復 EXTRA_LOGGER_NAMES 引數和相關文件 (#17808)

  • 為 Airflow 和 gunicorn 使用一個直譯器 (#17805)

  • 修復: Mysql 5.7 id utf8mb3 (#14535)

  • 修復 dag_processing.last_duration 指標隨機漏洞 (#17769)

  • 自動為 MySQL 使用 utf8mb3_general_ci 排序規則 (#17729)

  • 修復: TaskInstance 的過濾條件不起作用 #17535 (#17548)

  • 不要在 CeleryExecutor.trigger_tasks 中使用 TaskInstance (#16248)

  • 移除 MSSQL 中升級的鎖 (#17213)

  • 透過 python 呼叫建立 virtualenv (#17156)

  • 確保執行 DAG.cli() 時 DAG 是非迴圈的 (#17105)

  • 翻譯非 ASCII 字元 (#17057)

  • 更改 model_list 模板中 None 比較的邏輯 (#16893)

  • 使 UI 和 POST /task_instances_state API 端點具有相同的行為 (#16539)

  • 確保如果缺少 SLA 則跳過任務 (#16719)

  • 修復直接使用 cached_property 模組的問題 (#16710)

  • 修復 TI 成功確認頁面 (#16650)

  • 修改 python virtualenv jinja 模板中的返回值檢查 (#16049)

  • 修復 DAG 依賴關係搜尋 (#15924)

  • 使自定義 JSON 編碼器支援 Decimal (#16383)

  • Bugfix: 允許僅使用 dag_id 和空的 subdir 清除任務 (#16513)

  • 在呼叫測試連線之前將埠值轉換為數字 (#16497)

  • 處理缺失/空的序列化 DAG 依賴關係 (#16393)

  • 在使用 @dag 裝飾器時正確設定 dag.fileloc (#16384)

  • 修復 TI 成功/失敗連結 (#16233)

  • 正確實現 airflow/www/views.py 中的自動完成提前返回 (#15940)

  • 反向移植修復以允許將 Logger 序列化到 Python 3.6 (#18798)

  • 修復了當有任務執行到 reschedule 狀態時,Backfill 作業無法執行的錯誤 (#17305, #18806)

僅限文件更改

  • 更新 dagbag_size 文件 (#18824)

  • 更新關於 bundle extras 的文件 (#18828)

  • 修復錯誤的 Postgres search_path 設定說明 (#17600)

  • 從 Docker 映象中移除 AIRFLOW_GID (#18747)

  • 改進 BranchPythonOperator 在沒有要跟隨的 task_id 時的錯誤訊息 (#18471)

  • 改進對使用者的指導,告訴他們在匯入超時時該怎麼做 (#18478)

  • 更好地解釋排程程式的微調 (#18356)

  • 為 airflow pools 匯入添加了示例 JSON (#18376)

  • 向文件新增 sla_miss_callback 部分 (#18305)

  • 解釋子程序鉤子的 Sentry 預設環境變數 (#18346)

  • 重構安裝頁面 (#18282)

  • 改進了快速入門 docker-compose 警告和文件 (#18164)

  • 對 MSSQL 的生產級別支援 (#18382)

  • 更新文件中無法正常工作的示例 (#18067)

  • 刪除 default_args 模式 + 為核心 Airflow 示例 DAG 添加了 get_current_context() 用法 (#16866)

  • 更新 max_tis_per_query 以便在網頁上更好地呈現 (#17971)

  • 添加了帶有基於團隊的授權的 Github Oauth 示例 (#17896)

  • 更新 docker.rst (#17882)

  • 示例 xcom 更新 (#17749)

  • 新增關於透過環境變數新增連線的文件警告 (#17915)

  • 修復了 upgrade-check.rst 附近的錯誤文件 (#17903)

  • 將 Brent 新增到提交者列表 (#17873)

  • 改進了關於模組管理的文件 (#17757)

  • 從 metrics.rst 中刪除已棄用的指標 (#17772)

  • 確保很好地解釋 docker-compose 的“生產就緒性” (#17731)

  • 文件: 使用 Airflow 1.10.x EOL 日期更新升級到 v2 的文件 (#17710)

  • 文件: 從文件字串中替換已棄用的引數 (#17709)

  • 更仔細地描述 DAG 所有者 (#17699)

  • 更新說明以避免誤解 (#17701)

  • 文件: 使 DAG.is_active 在 API 中為只讀 (#17667)

  • 更新關於 Python 3.9 支援的文件 (#17611)

  • 修復 MySQL 資料庫字元集指令 (#17603)

  • 記錄覆蓋 XCom.clear 以進行資料生命週期管理 (#17589)

  • 文件中 airflow core 的路徑更正 (#17567)

  • 文件(celery): 重新措辭,新增實際的多個佇列示例 (#17541)

  • 文件: 新增 FAQ 以加速解析大量 DAG 檔案 (#17519)

  • 改進新使用者的映象構建文件 (#17409)

  • 文件: 從 MariaDB JIRA URL 中刪除不必要的引數 (#17296)

  • 更新關於 MariaDB 和多個排程程式的警告 (#17287)

  • 文件: 建議在所有 Airflow 元件上使用相同的配置 (#17146)

  • 將關於 masking 的文件移動到新頁面 (#17007)

  • 建議在最佳實踐文件中使用環境變數而不是 Airflow 變數 (#16926)

  • 文件: 更好地描述 pod_template_file (#16861)

  • 新增 Aneesh Joseph 作為 Airflow 提交者 (#16835)

  • 文件: 為教程文件添加了新的管道示例 (#16548)

  • 從文件中刪除 upstart (#16672)

  • 新增新的提交者: JedTP (#16671)

  • 文件: 在升級文件中修復 flask-ouathlibflask-oauthlib (#16320)

  • 文件: 修復建立連線文件 (#16312)

  • 文件:修復 Elasticsearch 的 URL (#16275)

  • 對 README.md 檔案的小改進 (#16244)

  • 修復 dag_concurrency 的文件 (#16177)

  • 檢查程式碼片段的語法正確性 (#16005)

  • 在文件中新增 wheel 包的正確連結 (#15999)

  • default_pool 插槽新增文件 (#15997)

  • 在快速入門文件中新增記憶體使用警告 (#15967)

  • 更新示例 KubernetesExecutor git-sync pod 模板檔案 (#15904)

  • 文件:修復 Taskflow API 文件 (#16574)

  • 為教程文件新增新的 pipeline 示例 (#16084)

  • 更新 DAG 文件字串以包含 render_template_as_native_obj (#16534)

  • 更新關於設定 SMTP 的文件 (#16523)

  • 文件:修復 API 動詞,從 POST 改為 PATCH (#16511)

其他/內部

  • 重新命名變數以與程式碼邏輯保持一致 (#18685)

  • 簡化之前跨行分割的字串 (#18679)

  • 修復 BranchPythonOperator 的異常字串 (#18623)

  • 建立使用者時新增多個角色 (#18617)

  • 將 FABs 基本安全管理器移動到 Airflow 中 (#16647)

  • 刪除不必要的 CSS 狀態顏色 (#18461)

  • boto3 更新到 <1.19 (#18389)

  • 提高 airflow.security.kerberos module 的覆蓋率 (#18258)

  • 修復 Amazon Kinesis 測試 (#18337)

  • 修復 provider 測試訪問 importlib-resources 的問題 (#18228)

  • 在使用 SubDagOperator 時,在測試中消除警告 (#18275)

  • 修復 range(len())enumerate 的使用 (#18174)

  • 自動完成檢視的測試覆蓋率 (#15943)

  • 將 “packaging” 新增到核心需求 (#18122)

  • 將 LoggingMixins 新增到 BaseTrigger (#18106)

  • 修復在 main 構建中構建文件的問題 (#18035)

  • 刪除 tenacity 的上限 (#17593)

  • 刪除冗餘的 numpy 依賴 (#17594)

  • mysql-connector-python 升級到最新版本 (#17596)

  • 使 pandas 成為可選的核心依賴 (#17575)

  • 為 airflow.utils.helpers 新增更多型別提示 (#15582)

  • 改進:清理 airflow/utils/db.py 中的一些程式碼 (#17090)

  • 重構:從 DAG 處理中刪除 processor_factory (#16659)

  • 從 DAG 處理中刪除 AbstractDagFileProcessorProcess (#16816)

  • 更新 TaskGroup 型別提示 (#16811)

  • click 更新到 8.x (#16779)

  • 刪除剩餘的 Pylint 停用項 (#16760)

  • 刪除重複的 try,create_session 中已經存在 try (#16701)

  • 從我們的工具鏈中移除 pylint (#16682)

  • 重構不必要的函式呼叫 (#16653)

  • 向 setup.py 新增型別註解 (#16658)

  • 刪除 SQLAlchemy <1.4 約束 (#16630) (注意:我們的依賴項仍然要求 <1.4)

  • 重構 dag.clear 方法 (#16086)

  • 使用 DAG_ACTIONS 常量 (#16232)

  • 使用更新後的 _get_all_non_dag_permissions 方法 (#16317)

  • 為內建 FAB 方法新增更新名稱的包裝器 (#16077)

  • 刪除 TaskInstance.log_filepath 屬性 (#15217)

  • 刪除 airflow/www/app.py 中不必要的函式呼叫 (#15956)

  • plyvel 移動到 google provider extra (#15812)

  • 更新許可權遷移以使用新的命名方案 (#16400)

  • 對 FAB 使用資源和操作名稱 (#16380)

  • 將對 find_permission_view_menu 的呼叫替換為 get_permission 包裝器 (#16377)

  • 修復 fab_logging_level 的棄用預設值,設為 WARNING (#18783)

  • 在使用 CeleryKubernetesExecutor 時,允許從 UI 執行任務 (#18441)

Airflow 2.1.4 (2021-09-18)

重大變更

沒有重大更改。

Bug 修復

  • 修復棄用錯誤訊息,而不是使其靜默 (#18126)

  • 限制 Scheduler 建立的排隊 dagrun 的數量 (#18065)

  • 修復從排隊到執行的 DagRun 執行順序未正確遵循的問題 (#18061)

  • 修復 max_active_runs 不允許將排隊的 dagrun 移動到執行的問題 (#17945)

  • 避免沒有許可權的使用者的重定向迴圈 (#17838)

  • 避免使用者沒有角色時的無限重定向迴圈 (#17613)

  • 修復 graph TI 模態框上的日誌連結 (#17862)

  • 如果使用者缺少許可權,則隱藏變數匯入表單 (#18000)

  • 改進 dag/task 併發檢查 (#17786)

  • 修復 Clear task instances 端點重置所有 DAG 執行的 bug (#17961)

  • 修復傳遞給檢視的不正確引數 (#18083) (#18085)

  • 修復來自 LocalTaskJob 的 Sentry 處理程式導致錯誤的問題 (#18119)

  • 限制 colorlog 版本 (6.x 不相容) (#18099)

  • 僅在懸停時顯示暫停/取消暫停工具提示 (#17957)

  • 改進開啟組的 DAG 的圖形檢視載入時間 (#17821)

  • 增加 Run 列的寬度 (#17817)

  • 修復執行 tis 上的錯誤查詢 (#17631)

  • 將根新增到樹重新整理 URL (#17633)

  • 不要從 UI 中刪除正在執行的 DAG (#17630)

  • 提高 Provider 包功能的發現性

  • 不要讓 create_dagrun 覆蓋顯式 run_id (#17728)

  • pid 重置的迴歸,允許在心跳訊號後啟動任務 (#17333)

  • 當 pod 在執行時被刪除時,將任務狀態設定為失敗 (#18095)

  • 建議核心不要快取 Airflow 生成的日誌檔案 (#18054)

  • _check_for_stalled_adopted_tasks 方法中對採用的任務進行排序 (#18208)

僅文件更改

  • 更新 airflow/config_templates/config.yml 中的 version added 欄位 (#18128)

  • 改進關於如何處理動態任務生成的描述 (#17963)

  • 改進到運算子和鉤子引用的交叉連結 (#17622)

  • 文件:修復 Docker 堆疊替換 Airflow 版本的問題 (#17711)

  • 使 providers 運算子/鉤子引用更易於使用 (#17768)

  • 更新關於新的 connection-types provider 元資料的描述

  • 建議在變數包含敏感資料時使用 secrets 後端 (#17319)

  • 分離從原始碼安裝部分並新增更多詳細資訊 (#18171)

  • 文件:使用 closer.lua 指令碼下載原始碼 (#18179)

  • 文件:改進從原始碼安裝 (#18194)

  • 改進了所有元件的從原始碼安裝頁面 (#18251)

Airflow 2.1.3 (2021-08-23)

重大變更

沒有重大更改。

Bug 修復

  • 修復任務重試,當它們收到 sigkill 並有重試時,並正確處理 sigterm (#16301)

  • 修復在上下文異常中編輯秘密 (#17618)

  • 修復 dagrun 回撥的競爭條件 (#16741)

  • 將 ‘queued’ 新增到 DagRunState (#16854)

  • 將 ‘queued’ 狀態新增到 DagRun (#16401)

  • 修復外部 Elasticsearch 日誌連結 (#16357)

  • 當記錄的 PID 與當前 PID 不同時,新增正確的警告訊息 (#17411)

  • 修復使用 default_impersonation 配置執行任務的問題 (#17229)

  • 如果 DagRun 的 DAG 已從資料庫中刪除,則進行救援 (#17544)

  • 修復損壞的 json_client (#17529)

  • 處理並記錄任務回撥期間引發的異常 (#17347)

  • 修復 CLI kubernetes cleanup-pods,它在無效的標籤鍵上失敗 (#17298)

  • 在 DAG 解析日誌中顯示序列化異常 (#17277)

  • 修復:TaskInstance 不顯示 queued_by_job_id & external_executor_id (#17179)

  • 當未配置 SecretsMasker 時,新增更多解釋性訊息 (#17101)

  • 允許在 BaseOperator 的子類中使用 __init_subclass__ (#17027)

  • 修復 XCom 檢視中的任務例項檢索 (#16923)

  • 在解析期間驗證 priority_weight 的型別 (#16765)

  • 在 DAG 序列化期間正確處理自定義 depstask_group (#16734)

  • 修復 Celery worker 採用的緩慢(已清除)任務 (#16718)

  • 修復樹檢視中計算持續時間的問題 (#16695)

  • 修復 AttributeError: datetime.timezone 物件沒有屬性 name (#16599)

  • 在 Webserver 日誌中編輯連線金鑰 (#16579)

  • 將圖表焦點更改為檢視頂部而不是中心 (#16484)

  • 當執行器報告任務失敗時,排程器中標記任務為失敗 (#15929)

  • 修復(smart_sensor): 未繫結的變數錯誤 (#14774)

  • 將缺少的許可權添加回 UserModelView 控制元件 (#17431)

  • 更好的 docker-compose 診斷和自我修復 (#17484)

  • 改進當用戶錯誤配置 secret_key 時的診斷資訊 (#17410)

  • 停止在 task_instance.refresh_from_db 中檢查 execution_date (#16809)

改進

  • 在任務退出期間,在 LocalTaskJob 中執行迷你排程器 (#16289)

  • 刪除 SQLAlchemy<1.4 約束 (#16630)

  • 將 Jinja2 上限從 2.12.0 提升到 4.0.0 (#16595)

  • 提升 dnspython (#16698)

  • 更新到 FlaskAppBuilder 3.3.2+ (#17208)

  • 為任務和 DAG 新增狀態型別 (#15285)

  • 當使用 LocalExecutor 時,設定 Worker 的程序標題 (#16623)

  • DagFileProcessorDagFileProcessorProcess 移出 scheduler_job.py (#16581)

僅文件更改

  • 修復配置文件中的不一致性 (#17317)

  • 修復使用 SQLite 作為元資料 DB 的文件連結 (#17308)

其他

  • 在 requests 移除 LGPL 依賴項後,切換回 http 提供程式 (#16974)

Airflow 2.1.2 (2021-07-14)

重大變更

沒有重大更改。

Bug 修復

  • 僅允許 Webserver 從 Worker 日誌伺服器請求 (#16754)

  • 修復 “無效的 JSON 配置,必須是字典” 錯誤 (#16648)

  • 修復 CeleryKubernetesExecutor (#16700)

  • 如果鍵是 token 則掩碼值 (#16474)

  • 修復 LocalTaskJob 的模擬問題 (#16852)

  • 解決所有 npm 漏洞,包括將 jQuery 提升到 3.5 (#16440)

其他

  • 新增 Python 3.9 支援 (#15515)

Airflow 2.1.1 (2021-07-02)

重大變更

函式 clear_task_instances 的引數 activate_dag_runs 被替換為 dag_run_state

要實現 clear_task_instances 的先前預設行為 (使用 activate_dag_runs=True),無需進行任何更改。要實現先前的 activate_dag_runs=False 行為,請傳遞 dag_run_state=False 代替。(之前的引數仍然被接受,但已被棄用)

dag.set_dag_runs_state 已棄用

在 PR: #15382 中的 bug 修復之後,不再需要 set_dag_runs_state 方法。此方法現已棄用,將在未來的版本中刪除。

Bug 修復

  • 不要嘗試掩碼具有非字串鍵的字典中的機密資訊時崩潰 (#16601)

  • 始終從 PyPI 安裝 sphinx_airflow_theme (#16594)

  • 刪除 elasticsearch 庫的限制 (#16553)

  • 為 PROD 映象的構建和執行時新增額外的要求 (#16170)

  • 2021 年 5 月底釋出的 Cattrs 1.7.0 打破了 lineage 的使用 (#16173)

  • 從 setup_requires 中刪除不必要的軟體包 (#16139)

  • 將 docutils 固定到 <0.17,直到修復破壞性行為 (#16133)

  • Docker 映象文件的改進 (#14843)

  • 確保 dag_run.conf 是一個字典 (#15057)

  • 修復 CLI 連線匯入並將邏輯從 secrets 遷移到 Connection 模型 (#15425)

  • 修復 Dag 詳情的開始日期錯誤 (#16206)

  • 修復 DAG 暫停時 DAG 執行狀態未更新的問題 (#16343)

  • 允許 task_instance 模式 (REST API) 中 operator 欄位的空值 (#16516)

  • 避免在編輯日誌時遞迴過深 (#16491)

  • 回填:如果沒有任務與任務正則表示式匹配,則不建立 DagRun (#16461)

  • 用於較大 DAG 的樹狀檢視 UI 和樹狀檢視中更一致的間距 (#16522)

  • 正確處理 Query.scalar() 的 None 返回值 (#16345)

  • only_active 引數新增到 /dags 端點 (#14306)

  • 如果序列化的 DAG 在 DB 中被刪除,則不顯示過期的序列化 DAG (#16368)

  • 使 REST API List DAGs 端點與 UI/CLI 行為一致 (#16318)

  • 支援在 elasticsearch 中使用 filebeat 7 進行遠端日誌記錄 (#14625)

  • 首先對具有更高優先順序和更早 execution_date 的任務進行排隊 (#15210)

  • 使圖例上的任務 ID 具有足夠的寬度,並使折線圖的寬度為 100%。(#15915)

  • 修復 normalize-url 漏洞 (#16375)

  • 驗證初始化時的 retries 值以獲得更好的錯誤 (#16415)

  • 為樹重新整理新增 num_runs 查詢引數 (#16437)

  • 修復配置參考文件中的模板化預設/示例值 (#16442)

  • passphraseprivate_key 新增到預設敏感欄位名稱 (#16392)

  • 修復了無限插槽池中的任務永遠不會被排程的問題 (#15247)

  • 修復在 CeleryExecutor 中卡住為執行狀態的孤立任務 (#16550)

  • 如果無法編輯某些內容,請不要記錄失敗日誌 (#16118)

  • 將最大樹寬度設定為 1200 畫素 (#16067)

  • 在沒有 --local/--raw 的情況下,為 KubeExecutor 填充 airflow task run 的 “job_id” 欄位 (#16108)

  • 修復了在初始化之前使用 conf 變數的問題 (#16088)

  • 修復任務裝飾器的應用預設值 (#16085)

  • 即使剛剛解析,也要解析最近修改的檔案 (#16075)

  • 確保我們不會嘗試在日誌中遮蔽空字串 (#16057)

  • 當沒有異常時,不要在遮蔽 log.exception 時崩潰 (#16047)

  • 恢復 base_sensor_operator 中的 apply_defaults 匯入 (#16040)

  • 修復當 webserver UI 不在 / 時,樹狀檢視中的自動重新整理 (#16018)

  • 修復 dag.clear() 以在必要時將多個 dags 設定為執行狀態 (#15382)

  • 修復由於 multiprocessing 中的 reset_signals 導致 Celery 執行器隨機卡住的問題 (#15989)

Airflow 2.1.0 (2021-05-21)

重大變更

新的 “deprecated_api” extra

我們有一個新的 '[deprecated_api]' extra,當安裝 airflow 且將要使用已棄用的 API 時,應該使用它。現在它是 Airflow 的一個可選功能,因為它引入了 requests,後者 (截至 2021 年 5 月 14 日) 引入了 LGPL chardet 依賴項。

http 提供程式預設不安裝

chardet 成為 requests 的可選依賴項之前,http 提供程式現在是可選的,並且預設不安裝。請參閱 用 charset-normalizer 替換 chardet 的 PR

@apply_default 裝飾器不再必要

現在,此裝飾器透過 BaseOperator 上的元類自動新增到所有運算子

更改欄位遮蔽的配置選項

我們改進了 Web UI 和日誌中敏感資料的遮蔽。作為其中的一部分,以下配置已更改

  • admin 部分中的 hide_sensitive_variable_fields 選項已被 core 部分中的 hide_sensitive_var_conn_fields 部分替換,

  • admin 部分的 sensitive_variable_fields 選項已被 core 部分的 sensitive_var_conn_names 部分替代。

已棄用 airflow.kubernetes.pod_generator 中的 PodDefaults 和 add_xcom_sidecar

我們已將 PodDefaults 從 airflow.kubernetes.pod_generator.PodDefaults 移動到 airflow.providers.cncf.kubernetes.utils.xcom_sidecar.PodDefaults,並將 add_xcom_sidecar 從 airflow.kubernetes.pod_generator.PodGenerator.add_xcom_sidecar 移動到 airflow.providers.cncf.kubernetes.utils.xcom_sidecar.add_xcom_sidecar。此更改將允許我們修改 KubernetesPodOperator 的 XCom 功能,而無需升級 Airflow。

從核心 Airflow 中移除 pod_launcher

已將 pod launcher 從 airflow.kubernetes.pod_launcher 移動到 airflow.providers.cncf.kubernetes.utils.pod_launcher

這將允許使用者更新 KubernetesPodOperator 的 pod_launcher,而無需升級 Airflow

預設的 [webserver] worker_refresh_interval 已更改為 6000

對於 Airflow <=2.0.1,[webserver] worker_refresh_interval 的預設值為 30 秒。但是,由於 Airflow 2.0 DAG 序列化是一項硬性要求,並且 Webserver 使用了序列化的 DAG,因此無需像 30 秒那樣頻繁地終止現有 worker 並建立一個新的 worker。

此設定可以提高到更高的值,目前設定為 6000 秒(100 分鐘)以用作 DagBag 快取突發時間。

default_queue 配置已移動到 operators 部分。

default_queue 配置選項已從 [celery] 部分移動到 [operators] 部分,以便在不同的 executor 之間重複使用。

新特性

  • PythonVirtualenvDecorator 新增到 Taskflow API (#14761)

  • 新增 Taskgroup 裝飾器 (#15034)

  • 建立一個 DAG 日曆檢視 (#15423)

  • 建立跨 DAG 依賴關係檢視 (#13199)

  • 新增 REST API 以查詢 providers (#13394)

  • 在任務日誌和 UI 中遮蔽密碼和敏感資訊 (#15599)

  • 新增 SubprocessHook 以從 operators 執行命令 (#13423)

  • 在 UI 頁面“DAG Details”中新增 DAG 超時 (#14165)

  • 新增 WeekDayBranchOperator (#13997)

  • 將 JSON linter 新增到 DAG Trigger UI (#13551)

  • 將 DAG 描述文件新增到 Trigger UI 頁面 (#13365)

  • 將 Airflow Webserver URL 新增到 SLA miss 電子郵件。(#13249)

  • 為使用者新增只讀 REST API 端點 (#14735)

  • 新增生成 Airflow 的 Python SDK 的檔案 (#14739)

  • 將動態欄位新增到 snowflake 連線 (#14724)

  • 為角色和許可權新增只讀 REST API 端點 (#14664)

  • 新增新的 datetime branch operator (#11964)

  • 新增 Google leveldb hook 和 operator (#13109) (#14105)

  • 將 plugins 端點新增到 REST API (#14280)

  • 新增 worker_pod_pending_timeout 支援 (#15263)

  • 新增標記 DAG edges 的支援 (#15142)

  • 為 Roles 新增 CUD REST API 端點 (#14840)

  • 從檔案匯入連線 (#15177)

  • 一堆 template_fields_renderers 新增 (#15130)

  • 將 REST API 查詢排序和順序新增到某些端點 (#14895)

  • 在新 UI 中新增時區上下文 (#15096)

  • 將查詢 mutations 新增到新 UI (#15068)

  • 新增不同的模式來排序 dag 檔案以進行解析 (#15046)

  • 在 Tree View 上自動重新整理 (#15474)

  • BashOperator 在退出程式碼 99 時引發 AirflowSkipException(預設情況下,可配置)(#13421) (#14963)

  • 透過 REST API 中的任務 ID 清除任務 (#14500)

  • 支援 jinja2 原生 Python 型別 (#14603)

  • 允許沒有 gossip 或 mingle 模式的 celery workers (#13880)

  • 新增 airflow jobs check CLI 命令以檢查 jobs 的健康狀況(Scheduler 等)(#14519)

  • DateTimeBranchOperator 重新命名為 BranchDateTimeOperator (#14720)

改進

  • 將可選的結果處理程式回撥新增到 DbApiHook (#15581)

  • 將 Flask App Builder 限制更新到最近釋出的 3.3 (#15792)

  • 防止在 REST API 請求上建立 flask 會話 (#15295)

  • 在解析時同步 DAG 特定許可權 (#15311)

  • 將任務上 pool 名稱的最大長度增加到 256 個字元 (#15203)

  • 在使用 mysql 時強制執行 READ COMMITTED 隔離 (#15714)

  • 自動將 apply_default 應用於 BaseOperator 的子類 (#15667)

  • 在重複的 DAG ID 上發出錯誤 (#15302)

  • 更新 KubernetesExecutor pod 模板以允許訪問 IAM 許可權 (#15669)

  • 執行 airflow db check-migrations 時更詳細的日誌 (#15662)

  • 當 one_success 沒有成功時將任務標記為失敗 (#15467)

  • 新增一個選項來觸發 dag 而不更改 conf (#15591)

  • 新增 Airflow UI instance_name 配置選項 (#10162)

  • 新增一個裝飾器以使用 DB 事務重試函式 (#14109)

  • 將返回新增到 PythonVirtualenvOperator 的 execute 方法 (#14061)

  • 為 kubernetes 新增 verify_ssl 配置 (#13516)

  • 新增有關 Webserver > 1 時 secret_key 的描述 (#15546)

  • JSONFormatter 中新增 LogRecord 中的 Traceback (#15414)

  • 新增對 conn uri 格式中任意 json 的支援 (#15100)

  • 在 variable 中新增 description 欄位 (#12413) (#15194)

  • 新增日誌以顯示 SFTP、FTP 和 Filesystem sensor 中最後修改的時間 (#15134)

  • 當收到 SIGTERM 時執行 on_failure_callback (#15172)

  • 允許在突出顯示狀態時隱藏所有 edges (#15281)

  • 如果 UID 沒有實際使用者名稱,則顯示顯式錯誤 (#15212)

  • 在使用 Local 或 Sequential Executor 時,使用 Scheduler 提供日誌 (#15557)

  • 停用 dag 詳細資訊檢視上的觸發、重新整理和刪除控制元件。(#14144)

  • 關閉連線表單的自動完成功能 (#15073)

  • 將預設 worker_refresh_interval 增加到 6000 秒 (#14970)

  • 僅在 User 的本地時區不是 UTC 時顯示 (#13904)

  • 抑制一些任務 CLI 的 LOG/WARNING 以獲得更好的 CLI 體驗 (#14567)

  • 可配置的 API 響應 (CORS) 標頭 (#13620)

  • 允許檢視者檢視所有 docs 連結 (#14197)

  • 更新 Tree View 日期刻度 (#14141)

  • 使暫停/取消暫停 DAG 的工具提示更清晰 (#13642)

  • 在獲取變數時警告有關 env var 的優先順序 (#13501)

  • [celery] default_queue 配置移動到 [operators] default_queue 以在 executors 之間重用 (#14699)

Bug 修復

  • 修復當未傳遞 dry_run 時來自 updateTaskInstancesState API 端點的 500 錯誤 (#15889)

  • 確保 PythonVirtualenvOperator 之前的任務不會失敗 (#15822)

  • 防止混合大小寫的 env vars 導致 worker 等程序崩潰 (#14380)

  • 修復了 DAG 裝飾器中的型別註釋 (#15778)

  • 修復任務收到 SIGKILL 時的 on_failure_callback (#15537)

  • 修復 dags 表格溢位 (#15660)

  • 修復在 subdag 清除時更改父 dag 狀態 (#15562)

  • 修復從 zip 包讀取以預設為文字 (#13962)

  • 修復 dags.html 中 drawDagStatsForDag 的錯誤引數 (#13884)

  • 修復 QueuedLocalWorker 因 EOFError 崩潰 (#13215)

  • 修復 NotPreviouslySkippedDep 中的拼寫錯誤 (#13933)

  • 修復 KubeExecutor pod 採用後的並行性 (#15555)

  • 修復啟用 keepalive 的 mac 上的 kube 客戶端 (#15551)

  • 修復 python>3.7 的 dask 的錯誤限制(應為 <3.7)(#15545)

  • 修復 KubernetesExecutor 中的任務採用 (#14795)

  • 修復將 XCom 與 KubernetesPodOperator 一起使用時的超時 (#15388)

  • 修復 “extras” 中已棄用的 provider 別名無法工作的問題 (#15465)

  • 修復了預設的 XCom 反序列化。(#14827)

  • 進一步修復修剪後的 pod_id 用於 KubernetesPodOperator (#15445)

  • 修復 dag.partial_subset 中的 used_group_ids (#13700) (#15308)

  • Bugfix:當修剪後的 pod_idKubernetesPodOperator 中以連字元結尾時,名稱無效 (#15443)

  • 修復 TI pool_slots > 1 時不正確的插槽統計資訊 (#15426)

  • 修復 DAG 上次執行連結 (#15327)

  • 修復當 update_fab_perms = False 時 sync-perm 無法正確工作的問題 (#14847)

  • 修復了 Plexus 測試對 Arrow 的限制 (#14781)

  • 修復樹檢視中的 UI bug (#14566)

  • 修復 AzureDataFactoryHook 無法例項化其連線的問題 (#14565)

  • 修復非 POSIX 檔案系統上的許可權錯誤 (#13121)

  • 修復 “ignorable” 中的拼寫 (#14348)

  • 修復 get_context_data doctest 匯入 (#14288)

  • 更正 GCSObjectsWtihPrefixExistenceSensor 中的拼寫錯誤 (#14179)

  • 修復失敗依賴項的順序 (#14036)

  • 修復關鍵的 CeleryKubernetesExecutor bug (#13247)

  • 修復 StackdriverTaskHandler 中的四個 bug (#13784)

  • func.sum 可能會返回 Decimal,從而破壞 REST API (#15585)

  • 在分頁中保留標籤引數 (#15411)

  • API:當 execution_date 相同時,引發 AlreadyExists 異常 (#15174)

  • 刪除 DagFileProcessorManager 中對 sync_metadata 的重複呼叫 (#15121)

  • 額外的 docker-py 更新以解決 docker op 問題 (#15731)

  • 確保呼叫 executors end 方法 (#14085)

  • 從 API schema 中刪除 user_id (#15117)

  • 防止停用分頁時可點選的錯誤連結 (#15074)

  • 在遷移期間獲取資料庫上的鎖 (#10151)

  • 僅在 SLA 為 None 時跳過 SLA 檢查 (#14064)

  • 在 airflow info 命令中列印正確的版本 (#14560)

  • 使 airflow info 可以與管道一起使用 (#14528)

  • 重做連線表單的客戶端指令碼 (#14052)

  • API: 在所有具有 total_entries 的集合中新增 CollectionInfo (#14366)

  • 修復匯入 airflow.models.dagrun 時的 task_instance_mutation_hook (#15851)

僅文件更改

  • 修復 SqlSensor 的文件字串 (#15466)

  • “DAG 和任務文件”上的小改動 (#14853)

  • 新增關於配置選項更改的說明 (#15696)

  • 將文件新增到 markdownlintyamllint 配置檔案 (#15682)

  • 在文件中將舊的“Experimental” API 重新命名為 deprecated。 (#15653)

  • 修復 git_sync_template.yaml 中的文件錯誤 (#13197)

  • 修復文件連結許可權名稱 (#14972)

  • 修復 Helm chart 文件的連結 (#14652)

  • 修復 Kubernetes 程式碼的文件字串 (#14605)

  • 文件:大寫和小的修復 (#14283) (#14534)

  • 修復了從 zip 包讀取內容時預設為文字的問題 (#13984)

  • 對“Concepts”文件的初步修改 (#15444)

  • 改進各種模組的文件字串 (#15047)

  • 新增關於資料庫連線 URI 的文件 (#14124)

  • 將 Helm Chart 徽標新增到文件索引 (#14762)

  • 為 Helm Chart 建立新的文件包 (#14643)

  • 新增關於支援的日誌記錄級別的文件 (#14507)

  • 更新關於 tableau 和 salesforce 提供程式的文件 (#14495)

  • 將已棄用的文件連結替換為正確的連結 (#14429)

  • 重構冗餘文件 url 邏輯以使用實用程式 (#14080)

  • 文件:注意:將 2016-2019 更新為 2016-now (#14248)

  • 如果可能,在解析期間跳過 DAG perm 同步 (#15464)

  • 為 Edge Labels 新增圖片和示例 (#15310)

  • 為 sqlite 新增示例 DAG 和操作指南 (#13196)

  • 為已棄用的模組新增指向新模組的連結 (#15316)

  • 在 Updating.md 中新增關於 FAB 資料模型更改的說明 (#14478)

雜項/內部

  • 修復 logging.exception 冗餘 (#14823)

  • 升級 stylelint 以刪除易受攻擊的子依賴項 (#15784)

  • 新增解決方法以強制依賴項使用 lodash 的修補版本 (#15777)

  • 將 croniter 更新到 1.0.x 系列 (#15769)

  • 在 Breeze 中移除 Airflow 1.10 (#15712)

  • 並行執行 helm chart 測試 (#15706)

  • ssri 從 6.0.1 升級到 /airflow/www 中的 6.0.2 (#15437)

  • 移除 Gunicorn 依賴項的限制 (#15611)

  • 為任務提供更好的“依賴已註冊”警告訊息 #14613 (#14860)

  • 將 pandas-gbq 固定到 <0.15.0 (#15114)

  • 使用 Pip 21.* 正式安裝 airflow (#15513)

  • 升級 mysqlclient 以支援 1.4.x 和 2.x 系列 (#14978)

  • 完成 DAG 資源名稱助手的重構 (#15511)

  • 重構/清理圖表任務和路徑高亮的呈現 (#15257)

  • 標準化預設 fab 許可權 (#14946)

  • 從任務例項詳細資訊檢視中刪除 datepicker (#15284)

  • 將提供程式的匯入警告轉換為除錯日誌 (#14903)

  • 從 provider_info 模式中刪除 required 中的剩餘欄位。 (#14119)

  • 棄用 tableau extra (#13595)

  • 在 Python 3.8 上儘可能使用內建的 cached_property (#14606)

  • 清理 UI 模板中的 JS 程式碼 (#14019)

  • 將 /airflow/www 中的 elliptic 從 6.5.3 升級到 6.5.4 (#14668)

  • 使用 flynt 切換到 f-strings。 (#13732)

  • 使用 jquery ready 而不是 vanilla js (#15258)

  • 遷移任務例項日誌 (ti_log) js (#15309)

  • 遷移 graph js (#15307)

  • 遷移 dags.html javascript (#14692)

  • 刪除不必要的 AzureContainerInstance 連線型別 (#15514)

  • 將 Kubernetes pod_launcher 從核心 airflow 中分離出來 (#15165)

  • 更新運算子的剩餘舊匯入路徑 (#15127)

  • 刪除損壞且未記錄的“演示模式”功能 (#14601)

  • 簡化 Webpack 條目的配置/易讀性 (#14551)

  • 移除內聯樹 js (#14552)

  • Js linting 和簡單指令碼的內聯遷移 (#14215)

  • 刪除 AirflowConfigParser 中重複使用的常量 (#14023)

  • 棄用來自環境變數的電子郵件憑據。 (#13601)

  • 刪除 task_instance.py 中未使用的“context”變數 (#14049)

  • 在除錯時停用 cli 中的 suppress_logs_and_warning (#13180)

Airflow 2.0.2 (2021-04-19)

重大變化

預設的 [kubernetes] enable_tcp_keepalive 已更改為 True

這允許 Airflow 預設情況下在某些環境(如 Azure)中更可靠地工作。

sync-perm CLI 預設不再同步 DAG 特定許可權

預設情況下,sync-perm CLI 命令將不再同步 DAG 特定許可權,因為它們現在在 DAG 解析期間處理。 如果您需要或想要舊的行為,您可以傳遞 --include-dags 以使 sync-perm 也同步 DAG 特定許可權。

Bug 修復

  • Bugfix: 序列化和排序 DAG 的可迭代屬性時出現 TypeError (#15395)

  • 修復基於資料夾的外掛缺少 on_load 觸發器 (#15208)

  • kubernetes cleanup-pods 子命令只會清理 Airflow 建立的 Pod (#15204)

  • 修復 CLI action_logging 中的密碼遮蔽 (#15143)

  • 修復 TriggerDagRunOperatorLink 的 url 生成 (#14990)

  • 恢復基本 lineage 後端 (#14146)

  • 無法使用 Kubernetes executor 觸發回填或手動作業 (#14160)

  • Bugfix: 任務文件未顯示在任務例項詳細資訊檢視中 (#15191)

  • Bugfix: 修復 KubernetesExecutor 中覆蓋 pod_template_file (#15197)

  • Bugfix: executor_config 中的資源破壞了 UI 中的圖表檢視 (#15199)

  • 修復 celery executor 嘗試在 map 上呼叫 len 的 bug (#14883)

  • 修復 airflow.stats timing 中破壞 dogstatsd 模式的 bug (#15132)

  • 透過使用非阻塞 IO 來避免排程程式/解析器管理器死鎖 (#15112)

  • 重新引入 dagrun.schedule_delay 指標 (#15105)

  • 比較字串值,而不是字串在 Kube executor 中是否是同一物件 (#14942)

  • 像 airflow 1.10 中一樣,將 queue 傳遞給 BaseExecutor.execute_async (#14861)

  • 排程程式:從關鍵路徑中刪除飢餓池中的 TI。 (#14476)

  • 從 airflow.contrib 模組中刪除額外的/不必要的棄用警告 (#15065)

  • 修復 KubernetesExecutor 中對長 dag_id 和 task_id 的支援 (#14703)

  • 在序列化 DAG 中對列表、集合和元組進行排序 (#14909)

  • 簡化傳遞給 origin param 的字串的清理 (#14738) (#14905)

  • 修復啟用 Sentry 整合時執行任務時出錯的問題 (#13929)

  • Webserver:清理傳遞給 origin param 的字串 (#14738)

  • 修復樹中丟失的持續時間 < 1 秒的問題 (#13537)

  • 由於 sqlalchemy-utils 損壞,將 SQLAlchemy 固定到 <1.4 (#14812)

  • 修復 KubernetesExecutor 中已刪除的掛起 pod 的問題 (#14810)

  • 當後端模型不存在時,預設為 Celery Task 模型 (#14612)

  • Bugfix: Plugins 端點未經過身份驗證 (#14570)

  • BugFix: 修復 DAG 文件顯示(特別是對於 TaskFlow DAG)(#14564)

  • BugFix: airflow.kubernetes.pod_launcher 的 monitor_pod 中出現 TypeError (#14513)

  • Bugfix: 修復 dag 詳細資訊 API 端點中標籤和所有者的錯誤輸出 (#14490)

  • 修復啟用 JSON 日誌記錄時任務錯誤導致的日誌記錄錯誤 (#14456)

  • 修復使用守護程式模式時 StatsD 指標未傳送的問題 (#14454)

  • 優雅地處理 DagRun 缺少 start_date 和 end_date 的情況 (#14452)

  • BugFix: 將 max_retry_delay 序列化為 timedelta (#14436)

  • 修復使用者單擊“任務例項詳細資訊”時由 start_date 為 None 引起的崩潰 (#14416)

  • BugFix: 如果任務從正在執行的 DAG 中刪除,則修復 TaskInstance API 呼叫失敗的問題 (#14381)

  • 當傳遞無效的 executor_config 時,排程程式不應失敗 (#14323)

  • 修復當超過 dagrun_timeout 時允許任務例項生存的 bug (#14321)

  • 修復 DAG 時區未始終在 UI 工具提示中正確顯示的 bug (#14204)

  • 當傳遞空字串時,為 cookie_samesite 使用 Lax (#14183)

  • [AIRFLOW-6076] 修復 dag.cli() KeyError (#13647)

  • 修復在清除成功的子 DAG 後在子 DAG 中執行子任務的問題 (#14776)

改進

  • 刪除導致錯誤安全警報的未使用 JS 包 (#15383)

  • 將新安裝的 [kubernetes] enable_tcp_keepalive 的預設值更改為 True (#15338)

  • 修復 #14270:在 OOM 情況下新增錯誤訊息 (#15207)

  • 在 docker 映象中對任意 UID 具有更好的相容性/診斷 (#15162)

  • 更新了幾個庫的最新版本的 3.6 限制 (#15209)

  • 添加了最近更改後缺失的 Blinker 依賴項 (#15182)

  • 從 DagRun View 的 search_columns 中刪除 'conf' (#15099)

  • K8S cleanup-pods CLI 中名稱空間更合適的預設值 (#15060)

  • Webserver 啟動期間更快的預設角色同步 (#15017)

  • 當有許多 DAG 時,加快 webserver 啟動速度 (#14993)

  • 更容易使用且文件更完善的 Docker 映象 (#14911)

  • 在可用時使用 libyaml C 庫。 (#14577)

  • 不在單元測試模式下執行時不建立 unittest.cfg (#14420)

  • Webserver:允許按 queued_dttm 過濾 TaskInstances (#14708)

  • 更新 Flask-AppBuilder 依賴項以允許 3.2(和所有 3.x 系列)(#14665)

  • 記住瀏覽器本地儲存中展開的任務組 (#14661)

  • 向 cli 表新增純格式輸出 (#14546)

  • 使 airflow dags show 命令顯示 TaskGroups (#14269)

  • 增加 extra 連線欄位的最大大小。 (#12944)

  • 透過對 TaskReschedule 執行單個 SQL 刪除操作來加速 clear_task_instances。 (#14048)

  • 為 FAB 菜單鏈接新增更多靈活性。 (#13903)

  • 在 SQLite 版本不匹配的情況下新增更好的描述和指導。 (#14209)

僅文件更改

  • 新增文件建立/更新社群提供程式。 (#15061)

  • 修復 airflow.utils.timezone 文件字串中的錯誤和拼寫錯誤。 (#15180)

  • 替換為 Stable Airflow 文件的新 URL。 (#15169)

  • 文件:闡明 delete_worker_pods_on_failure 的行為。 (#14958)

  • 為 Docker 映象建立一個文件包。 (#14846)

  • 多個小的文件 (OpenAPI) 修復。 (#14917)

  • 替換圖檢視截圖以顯示自動重新整理。 (#14571)

雜項/內部

  • 在 hooks 中懶載入匯入 Connection 以避免迴圈依賴。 (#15361)

  • 將 last_scheduler_run 重新命名為 last_parsed_time,並確保它在資料庫中更新。 (#14581)

  • 使 TaskInstance.pool_slots 不可為空,預設值為 1。 (#14406)

  • 以一致的方式記錄遷移資訊。 (#14158)

Airflow 2.0.1 (2021-02-08)

重大更改

檢視 Airflow 配置的許可權已從 UserViewer 角色中刪除

以前,具有 UserViewer 角色的使用者可以使用 REST API 或 Webserver 獲取/檢視配置。 從 Airflow 2.0.1 開始,只有具有 AdminOp 角色的使用者才能獲取/檢視配置。

要允許具有其他角色的使用者檢視配置,請將 can read on Configurations 許可權新增到該角色。

請注意,如果 [webserver] expose_config 設定為 False,即使使用者具有帶有 can read on Configurations 許可權的角色,API 也會丟擲 403 響應。

預設的 [celery] worker_concurrency 已更改為 16

Airflow <2.0.0 的 [celery] worker_concurrency 的預設值為 16。 但是,在 2.0.0 中,它被意外地更改為 8

從 Airflow 2.0.1 開始,我們恢復到舊的預設值 16

預設的 [scheduler] min_file_process_interval 已更改為 30

由於 [scheduler] min_file_process_interval 的預設值為 0,因此 CPU 使用率通常保持在 100% 左右,因為 DAG 檔案會不斷解析。

從 Airflow 2.0.0 開始,排程決策已從 DagFileProcessor 移至 Scheduler,因此我們可以將預設值設定得更高一些:30

Bug 修復

  • Bugfix: 在 XCom Endpoint API 中返回 XCom 值 (#13684)

  • Bugfix: 使用自定義後端和 sql_alchemy_conn_secret 時的匯入錯誤 (#13260)

  • 在守護程序化程序(排程程式、Kerberos 等)時允許 PID 檔案路徑為相對路徑 (#13232)

  • Bugfix: 在 airflow db upgrade 期間,MySQL 中沒有通用的 DROP CONSTRAINT (#13239)

  • Bugfix: 執行 sync-perm 時同步在 DAG 中定義的訪問控制 (#13377)

  • 如果沒有在 DAG 上定義回撥,則停止傳送回撥請求 (#13163)

  • BugFix: 未執行 DAG 級別的回撥請求 (#13651)

  • 停止建立重複的 Dag File Processors (#13662)

  • 在排程時過濾已刪除狀態的任務例項的 DagRuns (#13165)

  • 將 /airflow/www 中的 datatables.net 從 1.10.21 升級到 1.10.22 (#13143)

  • datatables.net JS 升級到 1.10.23 (#13253)

  • 將 /airflow/www 中的 dompurify 從 2.0.12 升級到 2.2.6 (#13164)

  • 更新最小的 cattrs 版本 (#13223)

  • 刪除 CLI 池匯入/匯出中不適用的引數 ‘output’ (#13071)

  • Webserver:修復停用身份驗證選項的行為並新增文件 (#13191)

  • 修復:新增對 no-menu 外掛檢視的支援 (#11742)

  • 為 Python 3.8+ 新增 python-daemon 限制以修復守護程式崩潰 (#13540)

  • 將預設的 celery worker_concurrency 更改為 16 (#13612)

  • 如果 dag_id 為 None,則審計日誌記錄檢視不應包含連結 (#13619)

  • 修復用於清理列表 pod 的無效 continue_token (#13563)

  • 切換到最新版本的 Snowflake 聯結器 (#13654)

  • 修復任務重試或重新排程時的回填崩潰 (#13712)

  • max_tis_per_query 設定為 0 現在可以正確刪除限制 (#13512)

  • 修復任務回撥呼叫中的競爭條件 (#10917)

  • 修復 gunicorn master 崩潰時 Webserver 退出 (#13518)(#13780)

  • 修復用於檢查重複連線的 SQL 語法 (#13783)

  • BaseBranchOperator 預設將推送到 xcom (#13704) (#13763)

  • 修復 configuration.getsection 的棄用警告 (#13804)

  • 修復日誌端點中的 TaskNotFound (#13872)

  • 修復使用動態 DAG 時的競爭條件 (#13893)

  • 修復:Linux/Chrome Webserver 中的視窗跳動

  • 修復 sqlite 的 db shell (#13907)

  • 僅在存在序列化 DAG 時比較更新時間 (#13899)

  • 修復 mysqldb 驅動程式的 dag run type 列舉查詢 (#13278)

  • 為實驗性 API 新增對 lineage 端點的身份驗證 (#13870)

  • 不要將 User 角色的許可權新增到自定義角色。 (#13856)

  • 不要將 Website.can_read 訪問許可權新增到預設角色。 (#13923)

  • 修復由長的 Kubernetes pod 名稱引起的無效值錯誤 (#13299)

  • 修復 SQLite 的 DB 遷移以升級到 2.0 (#13921)

  • Bugfix: 手動 DagRun 觸發器不應跳過計劃執行 (#13963)

  • 停止在 Scheduler 中載入額外的 Operator 連結 (#13932)

  • FileTaskHandler 的 read 函式中添加了缺失的返回引數 (#14001)

  • Bugfix: 不要嘗試在 Scheduler 中建立重複的 Dag Run (#13920)

  • 使 v1/config 端點尊重 webserver expose_config 設定 (#14020)

  • 停用 Mariadb 和 MySQL <8 的行級別鎖定 (#14031)

  • Bugfix: 修復僅觸發特定 DAG 的許可權 (#13922)

  • 修復損壞的 SLA 機制 (#14056)

  • Bugfix: 如果任務在執行時被刪除,Scheduler 會失敗 (#14057)

  • 刪除 User 和 Viewer 角色讀取配置的許可權 (#14067)

  • 修復從 2.0.1rc1 的 DB 遷移

改進

  • 增加預設的 min_file_process_interval 以降低 CPU 使用率 (#13664)

  • 在使用 os.fork & CeleryExecutor 執行任務時釋放連線 (#13265)

  • 使 example_kubernetes_executor 示例 dag 中的函式目的更清晰 (#13216)

  • 刪除未使用的庫 - flask-swagger, funcsigs (#13178)

  • 當任務尚未執行時(沒有 TI),顯示替代工具提示 (#13162)

  • 使用 werkzeug 自己的型別轉換來進行請求引數處理 (#13184)

  • UI: 將 queued_by_job_id & external_executor_id 列新增到 TI 檢視 (#13266)

  • 使 json-merge-patch 成為一個可選庫並取消固定 (#13175)

  • 為 LDAP 提供程式新增缺失的 LDAP “extra” 依賴項。 (#13308)

  • 重構 setup.py 以更好地反映提供程式中的更改 (#13314)

  • 固定 pyjwt 併為 Apache Pinot 新增整合測試 (#13195)

  • setup.cfg 中刪除提供程式強制的要求 (#13409)

  • 替換已棄用的裝飾器 (#13443)

  • 簡化 & 簡化模型 Dag 和 BaseOperator 中的 __eq__ 方法 (#13449)

  • 應允許在提供程式模式中新增其他屬性 (#13440)

  • 刪除未使用的依賴項 - contextdecorator (#13455)

  • 刪除 ‘typing’ 依賴項 (#13472)

  • 以一致的方式記錄遷移資訊 (#13458)

  • 取消固定 mysql-connector-python 以允許 8.0.22 (#13370)

  • 刪除 thrift 作為核心依賴 (#13471)

  • 在 OpenAPI YAML 中為 DELETE 方法新增 NotFound 響應 (#13550)

  • [core] lazy_load_pluginsFalse 時,停止日誌垃圾資訊 (#13578)

  • 當沒有載入外掛時,顯示訊息和文件連結 (#13599)

  • 取消對 colorlog 依賴項的限制 (#13176)

  • 為示例 DAG 新增缺失的 DAG 標籤 (#13665)

  • 支援 DAG 文件中的表格 (#13533)

  • 新增 python3-openid 依賴項 (#13714)

  • 為 Executors 新增 __repr__ (#13753)

  • 新增描述以提示是否缺少 conn_type (#13778)

  • 將 Azure blob 升級到 v12 (#12188)

  • get_connnection REST 端點新增額外欄位 (#13885)

  • 使 Smart Sensors DB 遷移冪等 (#13892)

  • 改進執行 dag pause 命令時 DAG 不存在的錯誤提示 (#13900)

  • 更新 airflow_local_settings.py 以修復錯誤訊息 (#13927)

  • 僅允許將 JSON 可序列化的 conf 傳遞給 TriggerDagRunOperator (#13964)

  • Bugfix: 允許獲取具有空 start_date 的 DAG 的詳細資訊 (REST API) (#13959)

  • 向 DAG 詳細資訊端點新增引數 (#13790)

  • 使分配給匿名使用者的角色可自定義 (#14042)

  • OperationalError 的情況下,重試排程程式迴圈中的關鍵方法 (#14032)

僅文件更改

  • 在文件中新增缺失的 StatsD 指標 (#13708)

  • 在配置文件中新增缺失的電子郵件配置 (#13709)

  • 新增 Docker 上 Airflow 的快速入門指南 (#13660)

  • 描述支援的 Python 版本 (#13259)

  • 向 2.x 遷移文件添加註釋塊 (#13094)

  • 新增關於 webserver_config.py 的文件 (#13155)

  • 向最近新增的配置新增缺失的版本資訊 (#13161)

  • API: 在 UpdateMask 元件中使用通用資訊 (#13146)

  • 將 Airflow 2.0.0 新增到 requirements 表 (#13140)

  • 避免 CeleryKubernetesExecutor 文件中的混淆 (#13116)

  • 更新 REST API 規範中的文件連結 (#13107)

  • 將 PyPI 儲存庫的連結新增到 provider 文件 (#13064)

  • 修復指向 Airflow master 分支文件的連結 (#13179)

  • 對 Sensors 文件的細微增強 (#13381)

  • 在 Airflow 文件和 Breeze 中使用 2.0.0 (#13379)

  • 改進有關 providers 和自定義連線的文件 (#13375)(#13410)

  • 修復 production-deployment.rst 中格式錯誤的表 (#13395)

  • 更新 celery.rst 以修復斷開的連結 (#13400)

  • 刪除文件中對 scheduler run_duration 引數的引用 (#13346)

  • 設定支援的最低 SQLite 版本 (#13412)

  • 修復安裝文件 (#13462)

  • 新增有關模擬變數和連線的文件 (#13502)

  • 新增關於 Flask CLI 的文件 (#13500)

  • 修復升級到 2 指南以使用 rbac UI (#13569)

  • 使文件明確 Stable API 無法停用 Auth (#13568)

  • 從文件中刪除存檔的連結並新增 AIP 的連結 (#13580)

  • 升級到 2.rst 中的小修復 (#13583)

  • 修復升級到 2.0 指南中的連結 (#13584)

  • 修復 best-practices.rst 中 Mocking 部分的標題 (#13658)

  • 新增有關如何在 plugins 資料夾中使用自定義運算子的文件 (#13186)

  • 更新文件以註冊 Operator Extra Links (#13683)

  • 改進資料庫設定文件 (#13696)

  • 將模組路徑替換為僅類名的類 (#13719)

  • 更新 DAG 序列化文件 (#13722)

  • 修復 Web 伺服器中指向 Apache Airflow 文件的連結 (#13250)

  • 闡明 extras 和 provider 包之間的差異 (#13810)

  • 新增有關所有訪問環境的方法的資訊 (#13940)

  • 文件:修復關於排程程式延遲的常見問題 (#13969)

  • 更新了 taskflow api 文件以顯示與感測器的依賴關係 (#13968)

  • 將已棄用的配置選項新增到文件 (#13883)

  • 在升級到 2 的文件中添加了常見問題解答部分 (#13979)

Airflow 2.0.0 (2020-12-18)

完整的更改日誌大約有 3,000 行長(已經排除了所有向後移植到 1.10 的內容),所以請檢視Airflow 2.0.0 Highlights Blog Post

重大變更

Airflow 的 2.0 版本是一次重大升級,包含大量的重大更改,其中一些可能是破壞性的。為該專案早期版本編寫的現有程式碼可能需要更新才能使用此版本。有時也需要必要的配置更改。本文件介紹了已進行的更改,以及更新您的使用方法所需執行的操作。

如果您遇到問題或有疑問,請提交 一個 issue

主要變更

本節介紹此版本中已進行的主要更改。

預設情況下停用實驗性 REST API

預設情況下停用實驗性 REST API。要在遷移到穩定的 REST API 時恢復這些 API,請將 [api] 部分中的 enable_experimental_api 選項設定為 True

請注意,實驗性 REST API 沒有訪問控制。經過身份驗證的使用者擁有完全訪問許可權。

SparkJDBCHook 預設連線

對於 SparkJDBCHook,預設連線是 spark-default,對於 SparkSubmitHook,預設連線是 spark_default。現在這兩個 hooks 都使用 spark_default,這是所有提供程式使用的連線名稱的通用模式。

命令中輸出引數的更改

從 Airflow 2.0 開始,我們將使用 rich 替換 tabulate 來渲染命令輸出。由於此更改,--output 引數將不再接受 tabulate 表的格式。相反,它現在接受:

  • table - 將以預定義的表格渲染輸出

  • json - 將輸出渲染為 json

  • yaml - 將輸出渲染為 yaml

透過這樣做,我們提高了程式碼一致性,並讓使用者可以以程式設計方式操作輸出(當使用 json 或 yaml 時)。

受影響的命令

  • airflow dags list

  • airflow dags report

  • airflow dags list-runs

  • airflow dags list-jobs

  • airflow connections list

  • airflow connections get

  • airflow pools list

  • airflow pools get

  • airflow pools set

  • airflow pools delete

  • airflow pools import

  • airflow pools export

  • airflow role list

  • airflow providers list

  • airflow providers get

  • airflow providers hooks

  • airflow tasks states-for-dag-run

  • airflow users list

  • airflow variables list

Azure Wasb Hook 無法與 Snowflake hook 一起使用

Apache Airflow 中的 WasbHook 使用 Azure 庫的舊版本。雖然對於大多數 Azure hooks 來說,衝突並不重要,但對於 Wasb Hook 來說,這是一個問題,因為兩個庫的 blob 資料夾重疊。安裝 Snowflake 和 Azure extra 將導致 WasbHook 無法匯入。

all 重新命名為 devel_all extra

all extras 已減少到僅包含面向使用者的依賴項。這意味著此 extra 不包含開發依賴項。如果您依賴 all extra,那麼您現在應該使用 devel_all 或者弄清楚是否需要開發 extras。

上下文變數 prev_execution_date_successprev_execution_date_success 現在是 pendulum.DateTime

將 policy 重新命名為 task_policy

因為 Airflow 引入了 DAG 級別的策略 (dag_policy),我們決定將現有的 policy 函式重新命名為 task_policy,以使區別更加深刻並避免任何混淆。

使用叢集策略的使用者需要在 airflow_local_settings.py 中將其 policy 函式重新命名為 task_policy

[celery] operation_timeout 的預設值已更改為 1.0

從 Airflow 2 開始,預設情況下,Airflow 將重試 3 次以將任務釋出到 Celery 代理。這由 [celery] task_publish_max_retries 控制。因此,我們現在可以擁有更低的操作超時,從而引發 AirflowTaskTimeout。這通常發生在網路故障或間歇性 DNS 問題期間。

不再支援透過外掛新增 Operators 和 Sensors

運算子和感測器不應再透過 Airflow 的外掛機制註冊或匯入——這些型別的類僅被 Airflow 視為普通的 Python 類,因此無需向 Airflow 註冊它們。

如果您之前有一個 plugins/my_plugin.py 檔案,並在 DAG 中像這樣使用它

from airflow.operators.my_plugin import MyOperator

您應該改為像這樣匯入它

from my_plugin import MyOperator

airflow.operators. 下的名稱是外掛名稱,而在第二個示例中,它是定義運算子的 Python 模組名稱。

更多資訊請參見 https://airflow.apache.tw/docs/apache-airflow/stable/howto/custom-operator.html

不再支援透過外掛匯入 Hooks

不再支援透過 airflow.hooks.<plugin_name> 匯入外掛中新增的 hooks,hooks 應該像常規 Python 模組一樣匯入。

from airflow.hooks.my_plugin import MyHook

您應該改為像這樣匯入它

from my_plugin import MyHook

仍然可以(但不是必須)在外掛中“註冊” hooks。 這是為了將來支援在 UI 中動態填充 Connections 表單。

更多資訊請參見 https://airflow.apache.tw/docs/apache-airflow/stable/howto/custom-operator.html

[core] enable_xcom_pickling 的預設值已更改為 False

XCom 訊息的 pickle 型別已預設替換為 JSON,以防止 RCE 攻擊。 請注意,JSON 序列化比 pickling 更嚴格,因此,例如,如果您想透過 XCom 傳遞原始位元組,則必須使用像 base64 這樣的編碼對其進行編碼。 如果您瞭解風險並且仍然想使用 pickling,請在 Airflow 配置的 core 部分中設定 enable_xcom_pickling = True

Airflowignore 的基礎路徑

https://github.com/apache/airflow/pull/11993 中修復了一個錯誤,即 "airflowignore" 檢查了 DAG 資料夾的基礎路徑是否包含禁止的 DAG,而不僅僅是相對路徑。 這導致如果基礎路徑包含排除的單詞,則可能排除整個 DAG 資料夾。 例如,如果 airflowignore 檔案包含 x,並且 DAG 資料夾是 '/var/x/dags',則資料夾中的所有 DAG 都會被排除。 此修復現在僅匹配相對路徑,這意味著如果您之前使用完整路徑作為忽略路徑,則應將其更改為相對路徑。 例如,如果您的 DAG 資料夾是 '/var/dags/' 並且您的 airflowignore 包含 '/var/dag/excluded/',則應將其更改為 'excluded/'。

ExternalTaskSensor 將所有任務上下文變數作為關鍵字引數提供給 execution_date_fn

context 作為字典傳遞的舊語法將繼續有效,但要注意引數必須命名為 context。 以下程式碼將中斷。 要修復它,請將 ctx 更改為 context

def execution_date_fn(execution_date, ctx): ...

execution_date_fn 可以接受任務上下文字典中提供的任意數量的關鍵字引數。 支援以下形式的 execution_date_fn

def execution_date_fn(dt): ...


def execution_date_fn(execution_date): ...


def execution_date_fn(execution_date, ds_nodash): ...


def execution_date_fn(execution_date, ds_nodash, dag): ...

資料庫模式更改

為了遷移資料庫,您應該使用命令 airflow db upgrade,但在某些情況下需要手動步驟。

連線表中的唯一 conn_id

以前,Airflow 允許使用者新增多個具有相同 conn_id 的連線,並且在訪問時它會隨機選擇一個連線。 當與重試結合使用時,這是一種基本的負載平衡和容錯技術。

這種行為給使用者帶來了一些困惑,並且沒有明確的證據表明它是否真的有效。

現在 conn_id 將是唯一的。 如果您的元資料資料庫中已經有重複項,您必須在升級資料庫之前管理這些重複連線。

連線表中不可為空的 conn_type 列

connection 表中的 conn_type 列必須包含內容。 以前,此規則由應用程式邏輯強制執行,但資料庫模式不強制執行。

如果您直接對錶進行了任何修改,請確保 conn_type 列中沒有 null。

配置更改

此版本包含許多需要更改此應用程式或與其整合的其他應用程式的配置的更改。

本節介紹已進行的更改以及您需要執行的操作。

airflow.contrib.utils.log 已移動

以前,核心程式碼由最初的建立者 Airbnb 維護。 contrib 包中的程式碼由社群支援。 該專案已傳遞給 Apache 社群,目前整個程式碼由社群維護,因此現在這種劃分沒有任何理由,僅僅是歷史原因。 在 Airflow 2.0 中,我們希望組織包並將與第三方服務的整合移動到 airflow.providers 包。

為了清理,移動了以下包

舊包

新包

airflow.contrib.utils.log

airflow.utils.log

airflow.utils.log.gcs_task_handler

airflow.providers.google.cloud.log.gcs_task_handler

airflow.utils.log.wasb_task_handler

airflow.providers.microsoft.azure.log.wasb_task_handler

airflow.utils.log.stackdriver_task_handler

airflow.providers.google.cloud.log.stackdriver_task_handler

airflow.utils.log.s3_task_handler

airflow.providers.amazon.aws.log.s3_task_handler

airflow.utils.log.es_task_handler

airflow.providers.elasticsearch.log.es_task_handler

airflow.utils.log.cloudwatch_task_handler

airflow.providers.amazon.aws.log.cloudwatch_task_handler

如果您使用 logging_config_class 選項設定日誌配置,則應更新匯入路徑。 舊的匯入路徑仍然有效,但可能會被廢棄。

SendGrid 傳送郵件程式已移動

以前,核心程式碼由最初的建立者 Airbnb 維護。 contrib 包中的程式碼由社群支援。 該專案已傳遞給 Apache 社群,目前整個程式碼由社群維護,因此現在這種劃分沒有任何理由,僅僅是歷史原因。

為了清理,已移動了 airflow.contrib.utils.sendgrid 模組中的 send_mail 函式。

如果您的配置檔案如下所示

[email]
email_backend = airflow.contrib.utils.sendgrid.send_email

現在應該如下所示

[email]
email_backend = airflow.providers.sendgrid.utils.emailer.send_email

舊的配置仍然有效,但可能會被廢棄。

統一 core 部分中的 hostname_callable 選項

之前的選項使用冒號 (:) 將模組與函式分開。 現在使用點 (.)。

此更改旨在統一 airflow.cfg 檔案中引用物件的所有選項的格式。

自定義執行程式使用完整匯入路徑載入

在之前的 Airflow 版本中,可以使用外掛來載入自定義的執行器。現在仍然可以,但配置方式已更改。現在您無需建立外掛來配置自定義執行器,而是需要在 core 部分的 executor 選項中提供模組的完整路徑。此更改旨在簡化外掛機制並使其更易於配置執行器。

如果您的模組路徑為 my_acme_company.executors.MyCustomExecutor 且外掛名為 my_plugin,那麼您的配置看起來像這樣:

[core]
executor = my_plugin.MyCustomExecutor

現在應該看起來像這樣:

[core]
executor = my_acme_company.executors.MyCustomExecutor

舊的配置仍然有效,但隨時可能被棄用。

對於自定義資料模型,請使用 CustomSQLAInterface 代替 SQLAInterface

從 Airflow 2.0 開始,如果您想定義自己的 Flask App Builder 資料模型,您需要使用 CustomSQLAInterface 代替 SQLAInterface。

對於非 RBAC,替換為:

from flask_appbuilder.models.sqla.interface import SQLAInterface

datamodel = SQLAInterface(your_data_model)

使用 RBAC(在 1.10 中):

from airflow.www_rbac.utils import CustomSQLAInterface

datamodel = CustomSQLAInterface(your_data_model)

在 2.0 中:

from airflow.www.utils import CustomSQLAInterface

datamodel = CustomSQLAInterface(your_data_model)
刪除外掛對 stat_name_handler 的支援。

在以前的版本中,您可以使用外掛機制來配置 stat_name_handler。現在,您應該使用 [scheduler] 部分中的 stat_name_handler 選項來實現相同的效果。

如果您的外掛看起來像這樣,並且可以透過 test_plugin 路徑訪問:

def my_stat_name_handler(stat):
    return stat


class AirflowTestPlugin(AirflowPlugin):
    name = "test_plugin"
    stat_name_handler = my_stat_name_handler

那麼您的 airflow.cfg 檔案應該看起來像這樣:

[scheduler]
stat_name_handler=test_plugin.my_stat_name_handler

此更改旨在簡化 statsd 配置。

日誌配置已移至新部分。

以下配置已從 [core] 移動到新的 [logging] 部分。

  • base_log_folder

  • remote_logging

  • remote_log_conn_id

  • remote_base_log_folder

  • encrypt_s3_logs

  • logging_level

  • fab_logging_level

  • logging_config_class

  • colored_console_log

  • colored_log_format

  • colored_formatter_class

  • log_format

  • simple_log_format

  • task_log_prefix_template

  • log_filename_template

  • log_processor_filename_template

  • dag_processor_manager_log_location

  • task_log_reader

指標配置已移至新部分。

以下配置已從 [scheduler] 移動到新的 [metrics] 部分。

  • statsd_on

  • statsd_host

  • statsd_port

  • statsd_prefix

  • statsd_allow_list

  • stat_name_handler

  • statsd_datadog_enabled

  • statsd_datadog_tags

  • statsd_custom_client_path

Elasticsearch 日誌記錄提供程式的更改。

啟用 JSON 輸出到 stdout 時,日誌行現在將包含 log_idoffset 欄位,這應使直接從 Web 伺服器上的 elasticsearch 讀取任務日誌成為可能。示例配置:

[logging]
remote_logging = True
[elasticsearch]
host = http://es-host:9200
write_stdout = True
json_format = True

請注意,Web 伺服器期望日誌行資料本身存在於文件的 message 欄位中。

刪除 airflow.cfg 檔案中的 gcp_service_account_keys 選項。

此選項已被刪除,因為它不再受 Google Kubernetes Engine 支援。 Google Cloud 管理方法的新推薦服務帳戶金鑰是 Workload Identity

預設啟用 Fernet。

預設情況下啟用 Fernet 機制,以提高預設安裝的安全性。為了恢復以前的行為,使用者必須在 airflow.cfg 檔案中 [core] 部分的 fernet_key 選項中有意識地設定一個空金鑰。

同時,這意味著始終安裝 apache-airflow[crypto] 額外包。但是,這要求您的作業系統安裝 libffi-dev

傳播 Kubernetes 工作節點註解的更改。

已刪除 kubernetes_annotations 配置部分。已將新鍵 worker_annotations 新增到現有的 kubernetes 部分。這是為了取消對 k8s 註解鍵的字元集限制。來自 kubernetes_annotations 的所有鍵/值對現在應作為 json 轉到 worker_annotations。例如,代替:

[kubernetes_annotations]
annotation_key = annotation_value
annotation_key2 = annotation_value2

應該重寫為:

[kubernetes]
worker_annotations = { "annotation_key" : "annotation_value", "annotation_key2" : "annotation_value2" }
刪除 run_duration。

我們不應該再使用 run_duration 選項。過去,這用於不時重啟排程器,但現在排程器變得更加穩定,因此使用此設定被認為是不好的,並且可能導致不一致的狀態。

重新命名 Pool statsd 指標。

已將使用的槽重新命名為正在執行的槽,以使名稱具有自解釋性並使程式碼更易於維護。

這意味著 pool.used_slots.<pool_name> 指標已重新命名為 pool.running_slots.<pool_name>。 Pools Web UI 檢視中的“Used Slots”列也已更改為“Running Slots”。

刪除 Mesos Executor。

Mesos Executor 已從程式碼庫中刪除,因為它沒有被廣泛使用且沒有得到維護。 郵件列表討論有關刪除它

更改 DAG 載入持續時間指標名稱。

將 DAG 檔案載入持續時間指標從 dag.loading-duration.<dag_id> 更改為 dag.loading-duration.<dag_file>。這是為了更好地處理一個 DAG 檔案具有多個 DAG 的情況。

預設停用 Sentry。

預設情況下停用 Sentry。要啟用這些整合,您需要在 [sentry] 部分將 sentry_on 選項設定為 "True"

簡化 GCSTaskHandler 配置。

在以前的版本中,為了配置服務帳戶金鑰檔案,您必須建立一個連線條目。在當前版本中,您可以在 [logging] 部分配置 google_key_path 選項來設定金鑰檔案路徑。

使用應用程式預設憑據 (ADC) 的使用者無需採取任何操作。

此更改旨在簡化日誌記錄的配置,以防止透過更改使用者控制的值(連線條目)來破壞例項配置。 如果您配置了後端金鑰,這也意味著 Web 伺服器不需要連線到它。 這簡化了具有多個 GCP 專案的設定,因為只有一個專案需要啟用 Secret Manager API。

核心運算子/鉤子的更改。

我們努力確保沒有可能影響終端使用者和您的檔案的更改,但此版本可能包含需要更改您的 DAG 檔案的更改。

本節介紹已進行的更改,以及如果您使用核心運算子或任何其他運算子,需要執行的操作來更新您的 DAG 檔案。

BaseSensorOperator 現在遵循下游任務的 trigger_rule。

以前,當 BaseSensorOperator 設定 soft_fail=True 時,它會跳過自身並無條件地跳過其所有下游任務,即不遵循下游任務的 trigger_rule。

在新行為中,遵循下游任務的 trigger_rule。使用者可以透過將每個下游任務的 trigger_rule 設定為 all_success 來保留/實現原始行為。

BaseOperator 使用元類。

BaseOperator 類使用 BaseOperatorMeta 作為元類。 此元類基於 abc.ABCMeta。 如果您的自定義運算子使用不同的元類,那麼您必須對其進行調整。

刪除 BaseHook 中的 SQL 支援。

從 BaseHook 中刪除 get_recordsget_pandas_dfrun,它們僅適用於 SQL 類似的鉤子。如果要使用它們,或者您的自定義鉤子繼承它們,請使用 airflow.hooks.dbapi.DbApiHook

不再支援使用按位移位(bit-shift)運算子將任務分配給 DAG。

以前,您可以按如下方式將任務分配給 DAG:

dag = DAG("my_dag")
dummy = DummyOperator(task_id="dummy")

dag >> dummy

不再支援此操作。相反,我們建議使用 DAG 作為上下文管理器:

with DAG("my_dag") as dag:
    dummy = DummyOperator(task_id="dummy")
移除已棄用的匯入機制

已移除已棄用的匯入機制,因此模組的匯入變得更加一致和明確。

例如: from airflow.operators import BashOperator 變為 from airflow.operators.bash_operator import BashOperator

感測器匯入的更改

感測器現在可以透過 airflow.sensors 訪問,而不再透過 airflow.operators.sensors 訪問。

例如: from airflow.operators.sensors import BaseSensorOperator 變為 from airflow.sensors.base import BaseSensorOperator

跳過的任務可以滿足 wait_for_downstream

以前,只有當先前任務例項的下游任務成功時,具有 wait_for_downstream=True 的任務例項才會執行。 同時,如果先前的任務例項成功或被跳過,則具有 depends_on_past=True 的任務例項將執行。 這兩個標誌是 close siblings,但它們的行為不同。 這種行為的不一致使得 API 對使用者來說不那麼直觀。 為了保持一致的行為,成功或跳過的下游任務現在都可以滿足 wait_for_downstream=True 標誌。

airflow.utils.helpers.cross_downstream
airflow.utils.helpers.chain

chaincross_downstream 方法現在已從 airflow.utils.helpers 模組移動到 airflow.models.baseoperator 模組。

baseoperator 模組似乎是將緊密耦合的方法放在一起的更好選擇。 Helpers 模組應該包含可以被所有類匯入的獨立幫助方法。

chain 方法和 cross_downstream 方法都使用 BaseOperator。 如果任何其他包從 helpers 模組匯入任何類或函式,那麼它會自動具有對 BaseOperator 的隱式依賴。 這通常會導致迴圈依賴。

更多資訊請參見 AIRFLOW-6392

在 Airflow < 2.0 中,你像這樣匯入這兩個方法

from airflow.utils.helpers import chain
from airflow.utils.helpers import cross_downstream

在 Airflow 2.0 中,應該更改為

from airflow.models.baseoperator import chain
from airflow.models.baseoperator import cross_downstream
airflow.operators.python.BranchPythonOperator

BranchPythonOperator 現在將返回一個等於所選分支的 task_id 的值,而之前它返回 None。 由於它繼承自 BaseOperator,如果 do_xcom_push=True,它將對該值進行 xcom_push。 這對於下游決策很有用。

airflow.sensors.sql_sensor.SqlSensor

SQLSensor 現在與 python bool() 函式一致,並且 allow_null 引數已被刪除。

它將在收到使用 python bool(value) 轉換為 True 的任何值後解析。 這改變了之前接收 NULL'0' 的響應。 早期 '0' 已被視為成功標準。 NULL 已根據 allow_null 引數的值進行處理。 但是,所有先前的行為仍然可以透過將引數 success 設定為 lambda x: x is None or str(x) not in ('0', '') 來實現。

airflow.operators.trigger_dagrun.TriggerDagRunOperator

TriggerDagRunOperator 現在接受一個 conf 引數,可以為 DagRun 提供一個 dict 作為 conf。 因此,python_callable 引數已被刪除。 PR: https://github.com/apache/airflow/pull/6317.

airflow.operators.python.PythonOperator

PythonOperator 上的 provide_context 引數已被刪除。 現在可以推斷傳遞給 PythonOperator 的可呼叫物件的簽名,並且始終自動提供引數值。 無需再顯式提供或不提供上下文。 例如

def myfunc(execution_date):
    print(execution_date)


python_operator = PythonOperator(task_id="mytask", python_callable=myfunc, dag=dag)

請注意,您不必設定 provide_context=True,現在會自動檢測並提供任務上下文中的變數。

所有上下文變數仍然可以使用雙星號引數提供

def myfunc(**context):
    print(context)  # all variables will be provided to context


python_operator = PythonOperator(task_id="mytask", python_callable=myfunc)

任務上下文變數名稱是可呼叫函式中的保留名稱,因此與 op_argsop_kwargs 的衝突會導致異常

def myfunc(dag):
    # raises a ValueError because "dag" is a reserved name
    # valid signature example: myfunc(mydag)
    print("output")


python_operator = PythonOperator(
    task_id="mytask",
    op_args=[1],
    python_callable=myfunc,
)

此更改向後相容,設定 provide_context 將向 kwargs 新增 provide_context 變數(但不會執行任何操作)。

PR: #5990

airflow.providers.standard.sensors.filesystem.FileSensor

FileSensor 現在接受 glob 模式,而不僅僅是檔名。 如果您要查詢的檔名中包含 *?[,則應將這些替換為 [*][?][[]

airflow.operators.subdag_operator.SubDagOperator

SubDagOperator 已更改為使用 Airflow 排程程式而不是回填來排程 subdag 中的任務。 使用者不再需要在 SubDagOperator 中指定執行程式。

airflow.providers.google.cloud.operators.datastore.CloudDatastoreExportEntitiesOperator
airflow.providers.google.cloud.operators.datastore.CloudDatastoreImportEntitiesOperator
airflow.providers.cncf.kubernetes.operators.kubernetes_pod.KubernetesPodOperator
airflow.providers.ssh.operators.ssh.SSHOperator
airflow.providers.microsoft.winrm.operators.winrm.WinRMOperator
airflow.operators.bash.BashOperator
airflow.providers.docker.operators.docker.DockerOperator
airflow.providers.http.operators.http.SimpleHttpOperator

do_xcom_push 標誌(用於將運算子的結果推送到 xcom 的開關)在不同的運算子中以不同的形式出現。 它的功能已在 BaseOperator 上以一個通用名稱 (do_xcom_push) 統一。 這樣,也很容易全域性停用將結果推送到 xcom。

以下運算子受到影響

  • DatastoreExportOperator(向後相容)

  • DatastoreImportOperator(向後相容)

  • KubernetesPodOperator(不向後相容)

  • SSHOperator(不向後相容)

  • WinRMOperator(不向後相容)

  • BashOperator(不向後相容)

  • DockerOperator(不向後相容)

  • SimpleHttpOperator(不向後相容)

有關詳細資訊,請參見 AIRFLOW-3249

airflow.operators.latest_only_operator.LatestOnlyOperator

在以前的版本中,LatestOnlyOperator 強制跳過所有(直接和間接)下游任務。 從此版本開始,該運算子將**僅跳過直接下游**任務,並且排程程式將處理跳過任何進一步的下游依賴項。

如果僅使用預設觸發規則 all_success,則無需進行任何更改。

如果 DAG 依賴於具有其他觸發規則(例如 all_done)的任務,這些任務被 LatestOnlyOperator 跳過,則需要對 DAG 進行調整以適應行為的變化,例如,從 LatestOnlyOperator 新增額外的邊。

此更改的目標是基於 BaseBranchOperator 實現更一致和可配置的級聯行為(請參閱 AIRFLOW-2923AIRFLOW-1784)。

核心 Python API 的更改

我們努力確保不會發生可能影響終端使用者及其 Python 檔案的更改,但此版本可能包含需要更改外掛、DAG 檔案或其他整合的更改。

此處僅描述此提供程式獨有的更改。您仍然應該注意對核心(包括核心運算子)所做的更改,因為它們會影響此提供程式的整合行為。

本節介紹已進行的更改,以及更新 Python 檔案所需的操作。

airflow/__init__.py 中刪除子包匯入

匯入 LoggingMixinconfAirflowException 已從 airflow/__init__.py 中刪除。對這些物件的所有隱式引用將不再有效。 要遷移,必須將其對應的所有舊路徑的用法替換為新的路徑。

舊路徑(隱式匯入)

新路徑(顯式匯入)

airflow.LoggingMixin

airflow.utils.log.logging_mixin.LoggingMixin

airflow.conf

airflow.configuration.conf

airflow.AirflowException

airflow.exceptions.AirflowException

從任務例項上下文中刪除的變數

以下變數已從任務例項上下文中刪除

  • end_date

  • latest_date

  • tables

airflow.contrib.utils.Weekday

以前,核心程式碼由最初的建立者 Airbnb 維護。 contrib 包中的程式碼由社群支援。 該專案已傳遞給 Apache 社群,目前整個程式碼由社群維護,因此現在這種劃分沒有任何理由,僅僅是歷史原因。

為了清理,Weekday 列舉已從 airflow.contrib.utils 移動到 airflow.utils 模組。

airflow.models.connection.Connection

連線模組具有新的已棄用方法

  • Connection.parse_from_uri

  • Connection.log_info

  • Connection.debug_info

以及一個已棄用的函式

  • parse_netloc_to_hostname

以前,使用者可以透過兩種方式建立連線物件

conn_1 = Connection(conn_id="conn_a", uri="mysql://AAA/")
# or
conn_2 = Connection(conn_id="conn_a")
conn_2.parse_uri(uri="mysql://AAA/")

現在不支援第二種方法。

Connection.log_infoConnection.debug_info 方法已被棄用。 請單獨讀取每個 Connection 欄位或使用預設表示形式 (__repr__)。

舊方法仍然有效,但隨時可能被放棄。 這些更改旨在刪除很少使用的方法。

airflow.models.dag.DAG.create_dagrun

DAG.create_dagrun 接受 run_type,不需要 run_id。 此更改是由將 run_type 列新增到 DagRun 引起的。

先前的簽名

def create_dagrun(
    self,
    run_id,
    state,
    execution_date=None,
    start_date=None,
    external_trigger=False,
    conf=None,
    session=None,
): ...

當前

def create_dagrun(
    self,
    state,
    execution_date=None,
    run_id=None,
    start_date=None,
    external_trigger=False,
    conf=None,
    run_type=None,
    session=None,
): ...

如果使用者提供 run_id,則 run_type 將透過檢查字首從它派生,允許的型別:manualscheduledbackfill(由 airflow.utils.types.DagRunType 定義)。

如果使用者提供 run_typeexecution_date,則 run_id 構造為 {run_type}__{execution_data.isoformat()}

Airflow 應該使用 run_typeexecution_date 構造 dagruns,使用 run_id 的建立被保留用於使用者操作。

airflow.models.dagrun.DagRun

使用 DagRunType.SCHEDULED.value 代替 DagRun.ID_PREFIX

各種 DagRun 的所有 run_id 字首已分組到 airflow.utils.types.DagRunType 中的單個列舉中。

以前,它們在不同的地方定義,例如 DagRunBackfillJobID_PREFIX 類變數和 _trigger_dag 函式中。

過去

>> from airflow.models.dagrun import DagRun
>> DagRun.ID_PREFIX
scheduled__

替換為

>> from airflow.utils.types import DagRunType
>> DagRunType.SCHEDULED.value
scheduled
airflow.utils.file.TemporaryDirectory

我們移除了 airflow.utils.file.TemporaryDirectory,因為 Airflow 放棄了對 Python < 3.5 的支援,因此無需擁有此自定義的 TemporaryDirectory 實現,因為 tempfile.TemporaryDirectory 提供了相同的功能。

現在,使用者應該執行 from tempfile import TemporaryDirectory 而不是 import from airflow.utils.files import TemporaryDirectory。 兩個上下文管理器提供相同的介面,因此不需要額外的更改。

airflow.AirflowMacroPlugin

我們移除了 airflow.AirflowMacroPlugin 類。 該類存在於 airflow 包中,但尚未使用(顯然自 2015 年以來)。 它已被刪除。

airflow.settings.CONTEXT_MANAGER_DAG

CONTEXT_MANAGER_DAG 已從設定中刪除。 它的作用已被 'airflow.models.dag' 中的 DagContext 取代。 其中一個原因是設定應該保持靜態,而不是儲存來自 DAG 的動態上下文,但主要原因是將上下文移出設定允許解除 DAG、BaseOperator、SerializedDAG、SerializedBaseOperator 之間的迴圈匯入,這是 AIRFLOW-6010 的一部分。

airflow.utils.log.logging_mixin.redirect_stderr
airflow.utils.log.logging_mixin.redirect_stdout

模組 airflow.utils.log.logging_mixin 中的函式 redirect_stderrredirect_stdout 已被刪除,因為它可以很容易地被標準庫替換。 標準庫的功能更加靈活,可以在更大的情況下使用。

下面的程式碼

import logging

from airflow.utils.log.logging_mixin import redirect_stderr, redirect_stdout

logger = logging.getLogger("custom-logger")
with redirect_stdout(logger, logging.INFO), redirect_stderr(logger, logging.WARN):
    print("I love Airflow")

可以被以下程式碼替換

from contextlib import redirect_stdout, redirect_stderr
import logging

from airflow.utils.log.logging_mixin import StreamLogWriter

logger = logging.getLogger("custom-logger")

with (
    redirect_stdout(StreamLogWriter(logger, logging.INFO)),
    redirect_stderr(StreamLogWriter(logger, logging.WARN)),
):
    print("I Love Airflow")
airflow.models.baseoperator.BaseOperator

現在,傳遞給 BaseOperator 的其他引數會導致異常。 以前版本的 Airflow 接受其他引數並在控制檯上顯示一條訊息。 當用戶沒有注意到該訊息時,會導致很難檢測到的錯誤。

為了恢復以前的行為,您必須在 airflow.cfg 檔案中 [operators] 部分的 allow_illegal_arguments 選項中設定為 True。 將來可能會完全刪除此選項。

airflow.models.dagbag.DagBag

store_serialized_dags 引數傳遞給 DagBag.__init__ 並訪問 DagBag.store_serialized_dags 屬性已被棄用,並在未來的版本中將被刪除。

先前的簽名:

def __init__(
    dag_folder=None,
    include_examples=conf.getboolean("core", "LOAD_EXAMPLES"),
    safe_mode=conf.getboolean("core", "DAG_DISCOVERY_SAFE_MODE"),
    store_serialized_dags=False,
): ...

當前:

def __init__(
    dag_folder=None,
    include_examples=conf.getboolean("core", "LOAD_EXAMPLES"),
    safe_mode=conf.getboolean("core", "DAG_DISCOVERY_SAFE_MODE"),
    read_dags_from_db=False,
): ...

如果您使用的是位置引數,則不需要更改,但如果您使用的是關鍵字引數,請將 store_serialized_dags 更改為 read_dags_from_db

同樣,如果您使用的是 DagBag().store_serialized_dags 屬性,請將其更改為 DagBag().read_dags_from_db

google 提供程式包中的更改

我們努力確保不會發生可能影響終端使用者及其 Python 檔案的更改,但此版本可能包含需要更改配置、DAG 檔案或其他整合(例如自定義運算子)的更改。

此處僅描述此提供程式獨有的更改。您仍然應該注意對核心(包括核心運算子)所做的更改,因為它們會影響此提供程式的整合行為。

本節介紹已進行的更改,以及如果您使用與 Google 服務(包括 Google Cloud - GCP)整合的運算子或掛鉤,則需要進行的更新。

直接模擬已新增到與 Google 服務通訊的運算子

透過名為 impersonation_chain 的新引數(在也與其它雲提供商的服務通訊的運算子的情況下為 google_impersonation_chain),可以直接模擬服務賬號以用於透過 Google 服務通訊的運算子。 因此,GCSToS3Operator 不再從 GCSListObjectsOperator 派生。

為 Google Cloud 規範化 gcp_conn_id

此前,並非所有與 Google Cloud 相關的 Hook 和 Operator 都使用 gcp_conn_id 作為 GCP 連線的引數。目前有一個引數適用於大多數服務。類似 datastore_conn_idbigquery_conn_idgoogle_cloud_storage_conn_id 等引數已被棄用。需要兩個連線的 Operator 未更改。

以下元件受到規範化的影響

  • airflow.providers.google.cloud.hooks.datastore.DatastoreHook

  • airflow.providers.google.cloud.hooks.bigquery.BigQueryHook

  • airflow.providers.google.cloud.hooks.gcs.GoogleCloudStorageHook

  • airflow.providers.google.cloud.operators.bigquery.BigQueryCheckOperator

  • airflow.providers.google.cloud.operators.bigquery.BigQueryValueCheckOperator

  • airflow.providers.google.cloud.operators.bigquery.BigQueryIntervalCheckOperator

  • airflow.providers.google.cloud.operators.bigquery.BigQueryGetDataOperator

  • airflow.providers.google.cloud.operators.bigquery.BigQueryOperator

  • airflow.providers.google.cloud.operators.bigquery.BigQueryDeleteDatasetOperator

  • airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyDatasetOperator

  • airflow.providers.google.cloud.operators.bigquery.BigQueryTableDeleteOperator

  • airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageCreateBucketOperator

  • airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageListOperator

  • airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageDownloadOperator

  • airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageDeleteOperator

  • airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageBucketCreateAclEntryOperator

  • airflow.providers.google.cloud.operators.gcs.GoogleCloudStorageObjectCreateAclEntryOperator

  • airflow.operators.sql_to_gcs.BaseSQLToGoogleCloudStorageOperator

  • airflow.operators.adls_to_gcs.AdlsToGoogleCloudStorageOperator

  • airflow.operators.gcs_to_s3.GoogleCloudStorageToS3Operator

  • airflow.operators.gcs_to_gcs.GoogleCloudStorageToGoogleCloudStorageOperator

  • airflow.operators.bigquery_to_gcs.BigQueryToCloudStorageOperator

  • airflow.operators.local_to_gcs.FileToGoogleCloudStorageOperator

  • airflow.operators.cassandra_to_gcs.CassandraToGoogleCloudStorageOperator

  • airflow.operators.bigquery_to_bigquery.BigQueryToBigQueryOperator

GCP Operator 和 Hook 的匯入路徑和名稱的更改

根據 AIP-21,與 Google Cloud 相關的 Operator 已從 contrib 移至 core。下表顯示了匯入路徑的更改。

舊路徑

新路徑

airflow.contrib.hooks.bigquery_hook.BigQueryHook

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook

airflow.contrib.hooks.datastore_hook.DatastoreHook

airflow.providers.google.cloud.hooks.datastore.DatastoreHook

airflow.contrib.hooks.gcp_bigtable_hook.BigtableHook

airflow.providers.google.cloud.hooks.bigtable.BigtableHook

airflow.contrib.hooks.gcp_cloud_build_hook.CloudBuildHook

airflow.providers.google.cloud.hooks.cloud_build.CloudBuildHook

airflow.contrib.hooks.gcp_container_hook.GKEClusterHook

airflow.providers.google.cloud.hooks.kubernetes_engine.GKEHook

airflow.contrib.hooks.gcp_compute_hook.GceHook

airflow.providers.google.cloud.hooks.compute.ComputeEngineHook

airflow.contrib.hooks.gcp_dataflow_hook.DataFlowHook

airflow.providers.google.cloud.hooks.dataflow.DataflowHook

airflow.contrib.hooks.gcp_dataproc_hook.DataProcHook

airflow.providers.google.cloud.hooks.dataproc.DataprocHook

airflow.contrib.hooks.gcp_dlp_hook.CloudDLPHook

airflow.providers.google.cloud.hooks.dlp.CloudDLPHook

airflow.contrib.hooks.gcp_function_hook.GcfHook

airflow.providers.google.cloud.hooks.functions.CloudFunctionsHook

airflow.contrib.hooks.gcp_kms_hook.GoogleCloudKMSHook

airflow.providers.google.cloud.hooks.kms.CloudKMSHook

airflow.contrib.hooks.gcp_mlengine_hook.MLEngineHook

airflow.providers.google.cloud.hooks.mlengine.MLEngineHook

airflow.contrib.hooks.gcp_natural_language_hook.CloudNaturalLanguageHook

airflow.providers.google.cloud.hooks.natural_language.CloudNaturalLanguageHook

airflow.contrib.hooks.gcp_pubsub_hook.PubSubHook

airflow.providers.google.cloud.hooks.pubsub.PubSubHook

airflow.contrib.hooks.gcp_speech_to_text_hook.GCPSpeechToTextHook

airflow.providers.google.cloud.hooks.speech_to_text.CloudSpeechToTextHook

airflow.contrib.hooks.gcp_spanner_hook.CloudSpannerHook

airflow.providers.google.cloud.hooks.spanner.SpannerHook

airflow.contrib.hooks.gcp_sql_hook.CloudSqlDatabaseHook

airflow.providers.google.cloud.hooks.cloud_sql.CloudSQLDatabaseHook

airflow.contrib.hooks.gcp_sql_hook.CloudSqlHook

airflow.providers.google.cloud.hooks.cloud_sql.CloudSQLHook

airflow.contrib.hooks.gcp_tasks_hook.CloudTasksHook

airflow.providers.google.cloud.hooks.tasks.CloudTasksHook

airflow.contrib.hooks.gcp_text_to_speech_hook.GCPTextToSpeechHook

airflow.providers.google.cloud.hooks.text_to_speech.CloudTextToSpeechHook

airflow.contrib.hooks.gcp_transfer_hook.GCPTransferServiceHook

airflow.providers.google.cloud.hooks.cloud_storage_transfer_service.CloudDataTransferServiceHook

airflow.contrib.hooks.gcp_translate_hook.CloudTranslateHook

airflow.providers.google.cloud.hooks.translate.CloudTranslateHook

airflow.contrib.hooks.gcp_video_intelligence_hook.CloudVideoIntelligenceHook

airflow.providers.google.cloud.hooks.video_intelligence.CloudVideoIntelligenceHook

airflow.contrib.hooks.gcp_vision_hook.CloudVisionHook

airflow.providers.google.cloud.hooks.vision.CloudVisionHook

airflow.contrib.hooks.gcs_hook.GoogleCloudStorageHook

airflow.providers.google.cloud.hooks.gcs.GCSHook

airflow.contrib.operators.adls_to_gcs.AdlsToGoogleCloudStorageOperator

airflow.operators.adls_to_gcs.AdlsToGoogleCloudStorageOperator

airflow.contrib.operators.bigquery_check_operator.BigQueryCheckOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryCheckOperator

airflow.contrib.operators.bigquery_check_operator.BigQueryIntervalCheckOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryIntervalCheckOperator

airflow.contrib.operators.bigquery_check_operator.BigQueryValueCheckOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryValueCheckOperator

airflow.contrib.operators.bigquery_get_data.BigQueryGetDataOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryGetDataOperator

airflow.contrib.operators.bigquery_operator.BigQueryCreateEmptyDatasetOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyDatasetOperator

airflow.contrib.operators.bigquery_operator.BigQueryCreateEmptyTableOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyTableOperator

airflow.contrib.operators.bigquery_operator.BigQueryCreateExternalTableOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryCreateExternalTableOperator

airflow.contrib.operators.bigquery_operator.BigQueryDeleteDatasetOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryDeleteDatasetOperator

airflow.contrib.operators.bigquery_operator.BigQueryOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryExecuteQueryOperator

airflow.contrib.operators.bigquery_table_delete_operator.BigQueryTableDeleteOperator

airflow.providers.google.cloud.operators.bigquery.BigQueryDeleteTableOperator

airflow.contrib.operators.bigquery_to_bigquery.BigQueryToBigQueryOperator

airflow.operators.bigquery_to_bigquery.BigQueryToBigQueryOperator

airflow.contrib.operators.bigquery_to_gcs.BigQueryToCloudStorageOperator

airflow.operators.bigquery_to_gcs.BigQueryToCloudStorageOperator

airflow.contrib.operators.bigquery_to_mysql_operator.BigQueryToMySqlOperator

airflow.operators.bigquery_to_mysql.BigQueryToMySqlOperator

airflow.contrib.operators.dataflow_operator.DataFlowJavaOperator

airflow.providers.google.cloud.operators.dataflow.DataFlowJavaOperator

airflow.contrib.operators.dataflow_operator.DataFlowPythonOperator

airflow.providers.google.cloud.operators.dataflow.DataFlowPythonOperator

airflow.contrib.operators.dataflow_operator.DataflowTemplateOperator

airflow.providers.google.cloud.operators.dataflow.DataflowTemplateOperator

airflow.contrib.operators.dataproc_operator.DataProcHadoopOperator

airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHadoopJobOperator

airflow.contrib.operators.dataproc_operator.DataProcHiveOperator

airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHiveJobOperator

airflow.contrib.operators.dataproc_operator.DataProcJobBaseOperator

airflow.providers.google.cloud.operators.dataproc.DataprocJobBaseOperator

airflow.contrib.operators.dataproc_operator.DataProcPigOperator

airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPigJobOperator

airflow.contrib.operators.dataproc_operator.DataProcPySparkOperator

airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPySparkJobOperator

airflow.contrib.operators.dataproc_operator.DataProcSparkOperator

airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkJobOperator

airflow.contrib.operators.dataproc_operator.DataProcSparkSqlOperator

airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkSqlJobOperator

airflow.contrib.operators.dataproc_operator.DataprocClusterCreateOperator

airflow.providers.google.cloud.operators.dataproc.DataprocCreateClusterOperator

airflow.contrib.operators.dataproc_operator.DataprocClusterDeleteOperator

airflow.providers.google.cloud.operators.dataproc.DataprocDeleteClusterOperator

airflow.contrib.operators.dataproc_operator.DataprocClusterScaleOperator

airflow.providers.google.cloud.operators.dataproc.DataprocScaleClusterOperator

airflow.contrib.operators.dataproc_operator.DataprocOperationBaseOperator

airflow.providers.google.cloud.operators.dataproc.DataprocOperationBaseOperator

airflow.contrib.operators.dataproc_operator.DataprocWorkflowTemplateInstantiateInlineOperator

airflow.providers.google.cloud.operators.dataproc.DataprocInstantiateInlineWorkflowTemplateOperator

airflow.contrib.operators.dataproc_operator.DataprocWorkflowTemplateInstantiateOperator

airflow.providers.google.cloud.operators.dataproc.DataprocInstantiateWorkflowTemplateOperator

airflow.contrib.operators.datastore_export_operator.DatastoreExportOperator

airflow.providers.google.cloud.operators.datastore.DatastoreExportOperator

airflow.contrib.operators.datastore_import_operator.DatastoreImportOperator

airflow.providers.google.cloud.operators.datastore.DatastoreImportOperator

airflow.contrib.operators.file_to_gcs.FileToGoogleCloudStorageOperator

airflow.providers.google.cloud.transfers.local_to_gcs.FileToGoogleCloudStorageOperator

airflow.contrib.operators.gcp_bigtable_operator.BigtableClusterUpdateOperator

airflow.providers.google.cloud.operators.bigtable.BigtableUpdateClusterOperator

airflow.contrib.operators.gcp_bigtable_operator.BigtableInstanceCreateOperator

airflow.providers.google.cloud.operators.bigtable.BigtableCreateInstanceOperator

airflow.contrib.operators.gcp_bigtable_operator.BigtableInstanceDeleteOperator

airflow.providers.google.cloud.operators.bigtable.BigtableDeleteInstanceOperator

airflow.contrib.operators.gcp_bigtable_operator.BigtableTableCreateOperator

airflow.providers.google.cloud.operators.bigtable.BigtableCreateTableOperator

airflow.contrib.operators.gcp_bigtable_operator.BigtableTableDeleteOperator

airflow.providers.google.cloud.operators.bigtable.BigtableDeleteTableOperator

airflow.contrib.operators.gcp_bigtable_operator.BigtableTableWaitForReplicationSensor

airflow.providers.google.cloud.sensors.bigtable.BigtableTableReplicationCompletedSensor

airflow.contrib.operators.gcp_cloud_build_operator.CloudBuildCreateBuildOperator

airflow.providers.google.cloud.operators.cloud_build.CloudBuildCreateBuildOperator

airflow.contrib.operators.gcp_compute_operator.GceBaseOperator

airflow.providers.google.cloud.operators.compute.GceBaseOperator

airflow.contrib.operators.gcp_compute_operator.GceInstanceGroupManagerUpdateTemplateOperator

airflow.providers.google.cloud.operators.compute.GceInstanceGroupManagerUpdateTemplateOperator

airflow.contrib.operators.gcp_compute_operator.GceInstanceStartOperator

airflow.providers.google.cloud.operators.compute.GceInstanceStartOperator

airflow.contrib.operators.gcp_compute_operator.GceInstanceStopOperator

airflow.providers.google.cloud.operators.compute.GceInstanceStopOperator

airflow.contrib.operators.gcp_compute_operator.GceInstanceTemplateCopyOperator

airflow.providers.google.cloud.operators.compute.GceInstanceTemplateCopyOperator

airflow.contrib.operators.gcp_compute_operator.GceSetMachineTypeOperator

airflow.providers.google.cloud.operators.compute.GceSetMachineTypeOperator

airflow.contrib.operators.gcp_container_operator.GKEClusterCreateOperator

airflow.providers.google.cloud.operators.kubernetes_engine.GKECreateClusterOperator

airflow.contrib.operators.gcp_container_operator.GKEClusterDeleteOperator

airflow.providers.google.cloud.operators.kubernetes_engine.GKEDeleteClusterOperator

airflow.contrib.operators.gcp_container_operator.GKEPodOperator

airflow.providers.google.cloud.operators.kubernetes_engine.GKEStartPodOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPCancelDLPJobOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPCancelDLPJobOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPCreateDLPJobOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPCreateDLPJobOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPCreateDeidentifyTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPCreateDeidentifyTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPCreateInspectTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPCreateInspectTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPCreateJobTriggerOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPCreateJobTriggerOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPCreateStoredInfoTypeOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPCreateStoredInfoTypeOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPDeidentifyContentOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPDeidentifyContentOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPDeleteDeidentifyTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteDeidentifyTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPDeleteDlpJobOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteDLPJobOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPDeleteInspectTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteInspectTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPDeleteJobTriggerOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteJobTriggerOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPDeleteStoredInfoTypeOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPDeleteStoredInfoTypeOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPGetDeidentifyTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPGetDeidentifyTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPGetDlpJobOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPGetDLPJobOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPGetInspectTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPGetInspectTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPGetJobTripperOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPGetJobTriggerOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPGetStoredInfoTypeOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPGetStoredInfoTypeOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPInspectContentOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPInspectContentOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPListDeidentifyTemplatesOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPListDeidentifyTemplatesOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPListDlpJobsOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPListDLPJobsOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPListInfoTypesOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPListInfoTypesOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPListInspectTemplatesOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPListInspectTemplatesOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPListJobTriggersOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPListJobTriggersOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPListStoredInfoTypesOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPListStoredInfoTypesOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPRedactImageOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPRedactImageOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPReidentifyContentOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPReidentifyContentOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPUpdateDeidentifyTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateDeidentifyTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPUpdateInspectTemplateOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateInspectTemplateOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPUpdateJobTriggerOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateJobTriggerOperator

airflow.contrib.operators.gcp_dlp_operator.CloudDLPUpdateStoredInfoTypeOperator

airflow.providers.google.cloud.operators.dlp.CloudDLPUpdateStoredInfoTypeOperator

airflow.contrib.operators.gcp_function_operator.GcfFunctionDeleteOperator

airflow.providers.google.cloud.operators.functions.GcfFunctionDeleteOperator

airflow.contrib.operators.gcp_function_operator.GcfFunctionDeployOperator

airflow.providers.google.cloud.operators.functions.GcfFunctionDeployOperator

airflow.contrib.operators.gcp_natural_language_operator.CloudNaturalLanguageAnalyzeEntitiesOperator

airflow.providers.google.cloud.operators.natural_language.CloudNaturalLanguageAnalyzeEntitiesOperator

airflow.contrib.operators.gcp_natural_language_operator.CloudNaturalLanguageAnalyzeEntitySentimentOperator

airflow.providers.google.cloud.operators.natural_language.CloudNaturalLanguageAnalyzeEntitySentimentOperator

airflow.contrib.operators.gcp_natural_language_operator.CloudNaturalLanguageAnalyzeSentimentOperator

airflow.providers.google.cloud.operators.natural_language.CloudNaturalLanguageAnalyzeSentimentOperator

airflow.contrib.operators.gcp_natural_language_operator.CloudNaturalLanguageClassifyTextOperator

airflow.providers.google.cloud.operators.natural_language.CloudNaturalLanguageClassifyTextOperator

airflow.contrib.operators.gcp_spanner_operator.CloudSpannerInstanceDatabaseDeleteOperator

airflow.providers.google.cloud.operators.spanner.SpannerDeleteDatabaseInstanceOperator

airflow.contrib.operators.gcp_spanner_operator.CloudSpannerInstanceDatabaseDeployOperator

airflow.providers.google.cloud.operators.spanner.SpannerDeployDatabaseInstanceOperator

airflow.contrib.operators.gcp_spanner_operator.CloudSpannerInstanceDatabaseQueryOperator

airflow.providers.google.cloud.operators.spanner.SpannerQueryDatabaseInstanceOperator

airflow.contrib.operators.gcp_spanner_operator.CloudSpannerInstanceDatabaseUpdateOperator

airflow.providers.google.cloud.operators.spanner.SpannerUpdateDatabaseInstanceOperator

airflow.contrib.operators.gcp_spanner_operator.CloudSpannerInstanceDeleteOperator

airflow.providers.google.cloud.operators.spanner.SpannerDeleteInstanceOperator

airflow.contrib.operators.gcp_spanner_operator.CloudSpannerInstanceDeployOperator

airflow.providers.google.cloud.operators.spanner.SpannerDeployInstanceOperator

airflow.contrib.operators.gcp_speech_to_text_operator.GcpSpeechToTextRecognizeSpeechOperator

airflow.providers.google.cloud.operators.speech_to_text.CloudSpeechToTextRecognizeSpeechOperator

airflow.contrib.operators.gcp_text_to_speech_operator.GcpTextToSpeechSynthesizeOperator

airflow.providers.google.cloud.operators.text_to_speech.CloudTextToSpeechSynthesizeOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceJobCreateOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceCreateJobOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceJobDeleteOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceDeleteJobOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceJobUpdateOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceUpdateJobOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceOperationCancelOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceCancelOperationOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceOperationGetOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceGetOperationOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceOperationPauseOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServicePauseOperationOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceOperationResumeOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceResumeOperationOperator

airflow.contrib.operators.gcp_transfer_operator.GcpTransferServiceOperationsListOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceListOperationsOperator

airflow.contrib.operators.gcp_transfer_operator.GoogleCloudStorageToGoogleCloudStorageTransferOperator

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceGCSToGCSOperator

airflow.contrib.operators.gcp_translate_operator.CloudTranslateTextOperator

airflow.providers.google.cloud.operators.translate.CloudTranslateTextOperator

airflow.contrib.operators.gcp_translate_speech_operator.GcpTranslateSpeechOperator

airflow.providers.google.cloud.operators.translate_speech.GcpTranslateSpeechOperator

airflow.contrib.operators.gcp_video_intelligence_operator.CloudVideoIntelligenceDetectVideoExplicitContentOperator

airflow.providers.google.cloud.operators.video_intelligence.CloudVideoIntelligenceDetectVideoExplicitContentOperator

airflow.contrib.operators.gcp_video_intelligence_operator.CloudVideoIntelligenceDetectVideoLabelsOperator

airflow.providers.google.cloud.operators.video_intelligence.CloudVideoIntelligenceDetectVideoLabelsOperator

airflow.contrib.operators.gcp_video_intelligence_operator.CloudVideoIntelligenceDetectVideoShotsOperator

airflow.providers.google.cloud.operators.video_intelligence.CloudVideoIntelligenceDetectVideoShotsOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionAddProductToProductSetOperator

airflow.providers.google.cloud.operators.vision.CloudVisionAddProductToProductSetOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionAnnotateImageOperator

airflow.providers.google.cloud.operators.vision.CloudVisionImageAnnotateOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionDetectDocumentTextOperator

airflow.providers.google.cloud.operators.vision.CloudVisionTextDetectOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionDetectImageLabelsOperator

airflow.providers.google.cloud.operators.vision.CloudVisionDetectImageLabelsOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionDetectImageSafeSearchOperator

airflow.providers.google.cloud.operators.vision.CloudVisionDetectImageSafeSearchOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionDetectTextOperator

airflow.providers.google.cloud.operators.vision.CloudVisionDetectTextOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductCreateOperator

airflow.providers.google.cloud.operators.vision.CloudVisionCreateProductOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductDeleteOperator

airflow.providers.google.cloud.operators.vision.CloudVisionDeleteProductOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductGetOperator

airflow.providers.google.cloud.operators.vision.CloudVisionGetProductOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductSetCreateOperator

airflow.providers.google.cloud.operators.vision.CloudVisionCreateProductSetOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductSetDeleteOperator

airflow.providers.google.cloud.operators.vision.CloudVisionDeleteProductSetOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductSetGetOperator

airflow.providers.google.cloud.operators.vision.CloudVisionGetProductSetOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductSetUpdateOperator

airflow.providers.google.cloud.operators.vision.CloudVisionUpdateProductSetOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionProductUpdateOperator

airflow.providers.google.cloud.operators.vision.CloudVisionUpdateProductOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionReferenceImageCreateOperator

airflow.providers.google.cloud.operators.vision.CloudVisionCreateReferenceImageOperator

airflow.contrib.operators.gcp_vision_operator.CloudVisionRemoveProductFromProductSetOperator

airflow.providers.google.cloud.operators.vision.CloudVisionRemoveProductFromProductSetOperator

airflow.contrib.operators.gcs_acl_operator.GoogleCloudStorageBucketCreateAclEntryOperator

airflow.providers.google.cloud.operators.gcs.GCSBucketCreateAclEntryOperator

airflow.contrib.operators.gcs_acl_operator.GoogleCloudStorageObjectCreateAclEntryOperator

airflow.providers.google.cloud.operators.gcs.GCSObjectCreateAclEntryOperator

airflow.contrib.operators.gcs_delete_operator.GoogleCloudStorageDeleteOperator

airflow.providers.google.cloud.operators.gcs.GCSDeleteObjectsOperator

airflow.contrib.operators.gcs_download_operator.GoogleCloudStorageDownloadOperator

airflow.providers.google.cloud.operators.gcs.GCSToLocalFilesystemOperator

airflow.contrib.operators.gcs_list_operator.GoogleCloudStorageListOperator

airflow.providers.google.cloud.operators.gcs.GCSListObjectsOperator

airflow.contrib.operators.gcs_operator.GoogleCloudStorageCreateBucketOperator

airflow.providers.google.cloud.operators.gcs.GCSCreateBucketOperator

airflow.contrib.operators.gcs_to_bq.GoogleCloudStorageToBigQueryOperator

airflow.operators.gcs_to_bq.GoogleCloudStorageToBigQueryOperator

airflow.contrib.operators.gcs_to_gcs.GoogleCloudStorageToGoogleCloudStorageOperator

airflow.operators.gcs_to_gcs.GoogleCloudStorageToGoogleCloudStorageOperator

airflow.contrib.operators.gcs_to_s3.GoogleCloudStorageToS3Operator

airflow.operators.gcs_to_s3.GCSToS3Operator

airflow.contrib.operators.mlengine_operator.MLEngineBatchPredictionOperator

airflow.providers.google.cloud.operators.mlengine.MLEngineStartBatchPredictionJobOperator

airflow.contrib.operators.mlengine_operator.MLEngineModelOperator

airflow.providers.google.cloud.operators.mlengine.MLEngineManageModelOperator

airflow.contrib.operators.mlengine_operator.MLEngineTrainingOperator

airflow.providers.google.cloud.operators.mlengine.MLEngineStartTrainingJobOperator

airflow.contrib.operators.mlengine_operator.MLEngineVersionOperator

airflow.providers.google.cloud.operators.mlengine.MLEngineManageVersionOperator

airflow.contrib.operators.mssql_to_gcs.MsSqlToGoogleCloudStorageOperator

airflow.operators.mssql_to_gcs.MsSqlToGoogleCloudStorageOperator

airflow.contrib.operators.mysql_to_gcs.MySqlToGoogleCloudStorageOperator

airflow.operators.mysql_to_gcs.MySqlToGoogleCloudStorageOperator

airflow.contrib.operators.postgres_to_gcs_operator.PostgresToGoogleCloudStorageOperator

airflow.operators.postgres_to_gcs.PostgresToGoogleCloudStorageOperator

airflow.contrib.operators.pubsub_operator.PubSubPublishOperator

airflow.providers.google.cloud.operators.pubsub.PubSubPublishMessageOperator

airflow.contrib.operators.pubsub_operator.PubSubSubscriptionCreateOperator

airflow.providers.google.cloud.operators.pubsub.PubSubCreateSubscriptionOperator

airflow.contrib.operators.pubsub_operator.PubSubSubscriptionDeleteOperator

airflow.providers.google.cloud.operators.pubsub.PubSubDeleteSubscriptionOperator

airflow.contrib.operators.pubsub_operator.PubSubTopicCreateOperator

airflow.providers.google.cloud.operators.pubsub.PubSubCreateTopicOperator

airflow.contrib.operators.pubsub_operator.PubSubTopicDeleteOperator

airflow.providers.google.cloud.operators.pubsub.PubSubDeleteTopicOperator

airflow.contrib.operators.sql_to_gcs.BaseSQLToGoogleCloudStorageOperator

airflow.operators.sql_to_gcs.BaseSQLToGoogleCloudStorageOperator

airflow.contrib.sensors.bigquery_sensor.BigQueryTableSensor

airflow.providers.google.cloud.sensors.bigquery.BigQueryTableExistenceSensor

airflow.contrib.sensors.gcp_transfer_sensor.GCPTransferServiceWaitForJobStatusSensor

airflow.providers.google.cloud.sensors.cloud_storage_transfer_service.DataTransferServiceJobStatusSensor

airflow.contrib.sensors.gcs_sensor.GoogleCloudStorageObjectSensor

airflow.providers.google.cloud.sensors.gcs.GCSObjectExistenceSensor

airflow.contrib.sensors.gcs_sensor.GoogleCloudStorageObjectUpdatedSensor

airflow.providers.google.cloud.sensors.gcs.GCSObjectUpdateSensor

airflow.contrib.sensors.gcs_sensor.GoogleCloudStoragePrefixSensor

airflow.providers.google.cloud.sensors.gcs.GCSObjectsWithPrefixExistenceSensor

airflow.contrib.sensors.gcs_sensor.GoogleCloudStorageUploadSessionCompleteSensor

airflow.providers.google.cloud.sensors.gcs.GCSUploadSessionCompleteSensor

airflow.contrib.sensors.pubsub_sensor.PubSubPullSensor

airflow.providers.google.cloud.sensors.pubsub.PubSubPullSensor

統一 Google Cloud 的預設連線 ID

之前,並非所有與 Google Cloud 相關的 Hook 和 Operator 都使用 google_cloud_default 作為預設連線 ID。 目前只有一個預設變體。 諸如 google_cloud_storage_defaultbigquery_defaultgoogle_cloud_datastore_default 等值已被棄用。 資料庫中現有相關連線的配置已保留。 要使用那些已棄用的 GCP 連線 ID,您需要將它們的連線 ID 顯式傳遞到 Operator/Hook 中。 否則,預設情況下,google_cloud_default 將用作 GCP 的連線 ID。

airflow.providers.google.cloud.hooks.dataflow.DataflowHook
airflow.providers.google.cloud.operators.dataflow.DataflowCreateJavaJobOperator
airflow.providers.google.cloud.operators.dataflow.DataflowTemplatedJobStartOperator
airflow.providers.google.cloud.operators.dataflow.DataflowCreatePythonJobOperator

為了在 GCP 的 Hook 和 Operator 中一致地使用 project_id 引數,我們做了以下更改

  • 更改了 DataflowHook.start_python_dataflow 中的引數順序。 使用

    帶有位置引數可能會中斷。

  • 更改了 DataflowHook.is_job_dataflow_running 中的引數順序。 使用

    帶有位置引數可能會中斷。

  • 更改了 DataflowHook.cancel_job 中的引數順序。 使用

    帶有位置引數可能會中斷。

  • 向 DataflowCreateJavaJobOperator 建構函式添加了可選的 project_id 引數。

    建構函式。

  • 向 DataflowTemplatedJobStartOperator 添加了可選的 project_id 引數

    建構函式。

  • 向 DataflowCreatePythonJobOperator 添加了可選的 project_id 引數

    建構函式。

airflow.providers.google.cloud.sensors.gcs.GCSUploadSessionCompleteSensor

為了在處理底層 GCS Bucket 中物件的更改時提供更精確的控制,此感測器現在已更改建構函式。

  • 舊的行為:此建構函式曾經可選地接受 previous_num_objects: int

  • 新的替換建構函式 kwarg: previous_objects: Optional[Set[str]]

大多數使用者不會指定此引數,因為儲存桶最初是空的,並且使用者希望將所有檔案都視為新的。

更新此感測器用法的示例:之前呼叫以下函式的使用者:

GCSUploadSessionCompleteSensor(bucket='my_bucket', prefix='my_prefix', previous_num_objects=1)

現在應該呼叫:

GCSUploadSessionCompleteSensor(bucket='my_bucket', prefix='my_prefix', previous_num_objects={'.keep'})

其中 '.keep' 是字首下的單個檔案,感測器不應將其視為新的。

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor
airflow.providers.google.cloud.hooks.bigquery.BigQueryHook

為了簡化 BigQuery 運算子(無需使用 Cursor)並標準化所有 GCP 整合方法中 hook 的用法,來自 BiqQueryBaseCursor 的方法已移至 BigQueryHook。由於保留了向後相容性,仍然可以透過 Cursor 物件使用它們,但會引發 DeprecationWarning。以下方法已移動:

舊路徑

新路徑

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.cancel_query

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.cancel_query

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.create_empty_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.create_empty_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.create_empty_table

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.create_empty_table

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.create_external_table

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.create_external_table

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.delete_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.delete_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.get_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_dataset_tables

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.get_dataset_tables

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_dataset_tables_list

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.get_dataset_tables_list

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_datasets_list

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.get_datasets_list

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_schema

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.get_schema

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_tabledata

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.get_tabledata

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.insert_all

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.insert_all

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.patch_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.patch_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.patch_table

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.patch_table

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.poll_job_complete

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.poll_job_complete

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_copy

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_copy

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_extract

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_extract

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_grant_dataset_view_access

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_grant_dataset_view_access

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_load

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_load

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_query

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_query

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_table_delete

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_table_delete

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_table_upsert

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_table_upsert

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_with_configuration

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.run_with_configuration

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.update_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook.update_dataset

airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor

由於 BigQuery 是 GCP 的一部分,因此可以透過使用 airflow.providers.google.common.hooks.base.GoogleBaseHook.catch_http_exception 裝飾器處理異常來簡化程式碼。但是,它會更改以下方法引發的異常:

  • airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.run_table_delete 丟擲 AirflowException 而不是 Exception

  • airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.create_empty_dataset 丟擲 AirflowException 而不是 ValueError

  • airflow.providers.google.cloud.hooks.bigquery.BigQueryBaseCursor.get_dataset 丟擲 AirflowException 而不是 ValueError

airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyTableOperator
airflow.providers.google.cloud.operators.bigquery.BigQueryCreateEmptyDatasetOperator

已將冪等性新增到 BigQueryCreateEmptyTableOperatorBigQueryCreateEmptyDatasetOperator。但為此,從 BigQueryHookcreate_empty_datasetcreate_empty_table 方法中刪除了 try / except 子句。

airflow.providers.google.cloud.hooks.dataflow.DataflowHook
airflow.providers.google.cloud.hooks.mlengine.MLEngineHook
airflow.providers.google.cloud.hooks.pubsub.PubSubHook

GCP 運算子中的更改意味著這些運算子的 GCP Hook 現在在所有使用 project_id 的方法中都需要關鍵字引數,而不是位置引數。如果使用位置引數呼叫這些方法,將會丟擲一個解釋性的異常。

其他 GCP hook 不受影響。

airflow.providers.google.cloud.hooks.pubsub.PubSubHook
airflow.providers.google.cloud.operators.pubsub.PubSubTopicCreateOperator
airflow.providers.google.cloud.operators.pubsub.PubSubSubscriptionCreateOperator
airflow.providers.google.cloud.operators.pubsub.PubSubTopicDeleteOperator
airflow.providers.google.cloud.operators.pubsub.PubSubSubscriptionDeleteOperator
airflow.providers.google.cloud.operators.pubsub.PubSubPublishOperator
airflow.providers.google.cloud.sensors.pubsub.PubSubPullSensor

PubSubPublishOperatorPubSubHook.publish 方法中,訊息中的 data 欄位應為位元組串(UTF-8 編碼),而不是 base64 編碼的字串。

由於 GCP 運算子和 hook 中的引數標準化,諸如 projecttopic_project 之類的引數已被棄用,並將被引數 project_id 替代。 在 PubSubHook.create_subscription hook 方法中,引數 subscription_projectsubscription_project_id 替換。 模板欄位已相應更新,舊的可能無法正常工作。

現在需要將僅關鍵字的引數傳遞給 PubSub hook。

這些更改不向後相容。

airflow.providers.google.cloud.operators.kubernetes_engine.GKEStartPodOperator

GKEPodOperator 中的 gcp_conn_id 引數是必需的。 在以前的版本中,可以將 None 值傳遞給 GKEStartPodOperator 運算子中的 gcp_conn_id,這會導致根據 應用程式預設憑據策略確定憑據。

現在,此引數需要一個值。 要恢復以前的行為,請配置連線而不指定服務帳戶。

有關連線管理的詳細資訊,請訪問:Google Cloud 連線

airflow.providers.google.cloud.hooks.gcs.GCSHook
  • 以下引數已在 GCSHook 的所有方法中替換:

    • bucket 更改為 bucket_name

    • object 更改為 object_name

  • 為了保持一致性,GoogleCloudStorageHook.list 中的 maxResults 引數已重新命名為 max_results

airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPigJobOperator
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHiveJobOperator
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkSqlJobOperator
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitSparkJobOperator
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitHadoopJobOperator
airflow.providers.google.cloud.operators.dataproc.DataprocSubmitPySparkJobOperator

Dataproc 相關 Operator (DataprocXXXOperator) 的 'properties' 和 'jars' 屬性已從 dataproc_xxxx_propertiesdataproc_xxx_jars 重新命名為 dataproc_propertiesdataproc_jars。 dataproc_properties 和 dataproc_jars 的引數。

airflow.providers.google.cloud.operators.cloud_storage_transfer_service.CloudDataTransferServiceCreateJobOperator

為了獲得 pylint 相容性,CloudDataTransferServiceCreateJobOperator 中的 filter 引數已重新命名為 request_filter

airflow.providers.google.cloud.hooks.cloud_storage_transfer_service.CloudDataTransferServiceHook

為了獲得 pylint 相容性,CloudDataTransferServiceHook.list_transfer_jobCloudDataTransferServiceHook.list_transfer_operations 中的 filter 引數已重新命名為 request_filter

airflow.providers.google.cloud.hooks.bigquery.BigQueryHook

通常,所有 hook 方法都使用 @GoogleBaseHook.fallback_to_default_project_id 進行裝飾,因此 hook 的引數只能透過關鍵字引數傳遞。

  • create_empty_table 方法現在接受 table_resource 引數。 如果提供了此引數,則忽略所有其他引數。

  • 如果引數在 dataset_reference 中傳遞,並且作為方法引數傳遞,則 create_empty_dataset 現在將使用 dataset_reference 中的值,而不是引發錯誤。 此外,dataset_reference 的驗證是使用 Dataset.from_api_repr 完成的。 異常和日誌訊息已更改。

  • update_dataset 現在需要新的 fields 引數(重大更改)

  • delete_dataset 具有新的簽名(dataset_id, project_id, …),之前的簽名是 (project_id, dataset_id, …)(重大更改)

  • get_tabledata 返回行列表,而不是 dict 格式的 API 響應。 此方法已被棄用,推薦使用 list_rows。(重大更改)

airflow.providers.google.cloud.hooks.cloud_build.CloudBuildHook
airflow.providers.google.cloud.operators.cloud_build.CloudBuildCreateBuildOperator
已刪除 api_version,因為我們將 CloudBuildHook 從使用

Discovery API 遷移到原生 google-cloud-build python 庫,所以不再使用該引數。

CloudBuildCreateBuildOperator 中的 body 引數已被棄用。

相反,您應該使用 build 引數傳遞 body。

airflow.providers.google.cloud.hooks.dataflow.DataflowHook.start_python_dataflow
airflow.providers.google.cloud.hooks.dataflow.DataflowHook.start_python_dataflow
airflow.providers.google.cloud.operators.dataflow.DataflowCreatePythonJobOperator

將 python3 作為 Dataflow Hooks/Operators 的預設直譯器更改

現在,DataFlow Hooks/Operators 的 py_interpreter 引數已從 python2 更改為 python3。

airflow.providers.google.common.hooks.base_google.GoogleBaseHook

為了簡化程式碼,decorator provide_gcp_credential_file 已從內部類移出。

您應該編寫 @GoogleBaseHook.provide_gcp_credential_file,而不是 @GoogleBaseHook._Decorators.provide_gcp_credential_file

airflow.providers.google.cloud.operators.dataproc.DataprocCreateClusterOperator

強烈建議 Dataproc 的磁碟大小為 1TB+,以獲得足夠的吞吐量:https://cloud.google.com/compute/docs/disks/performance

因此,DataprocCreateClusterOperatormaster_disk_size 的預設值已從 500GB 更改為 1TB。

生成叢集配置

如果您是從 Airflow 1.10.x 升級並且未使用 CLUSTER_CONFIG,則可以使用 airflow.providers.google.cloud.operators.dataproc.ClusterGeneratormake() 輕鬆生成配置

如果您使用的是舊 API 中的 metadata 引數,這將特別有用,有關詳細資訊,請參閱 AIRFLOW-16911

例如。 您的叢集建立在 v1.10.x 中可能如下所示

path = f"gs://goog-dataproc-initialization-actions-us-central1/python/pip-install.sh"

create_cluster = DataprocClusterCreateOperator(
    task_id="create_dataproc_cluster",
    cluster_name="test",
    project_id="test",
    zone="us-central1-a",
    region="us-central1",
    master_machine_type="n1-standard-4",
    worker_machine_type="n1-standard-4",
    num_workers=2,
    storage_bucket="test_bucket",
    init_actions_uris=[path],
    metadata={"PIP_PACKAGES": "pyyaml requests pandas openpyxl"},
)

升級到 v2.x.x 並使用 CLUSTER_CONFIG 後,它將如下所示

path = f"gs://goog-dataproc-initialization-actions-us-central1/python/pip-install.sh"

CLUSTER_CONFIG = ClusterGenerator(
    project_id="test",
    zone="us-central1-a",
    master_machine_type="n1-standard-4",
    worker_machine_type="n1-standard-4",
    num_workers=2,
    storage_bucket="test",
    init_actions_uris=[path],
    metadata={"PIP_PACKAGES": "pyyaml requests pandas openpyxl"},
).make()

create_cluster_operator = DataprocClusterCreateOperator(
    task_id="create_dataproc_cluster",
    cluster_name="test",
    project_id="test",
    region="us-central1",
    cluster_config=CLUSTER_CONFIG,
)
airflow.providers.google.cloud.operators.bigquery.BigQueryGetDatasetTablesOperator

我們更改了 BigQueryGetDatasetTablesOperator 的簽名。

之前

def __init__(
    dataset_id: str,
    dataset_resource: dict,
    # ...
): ...

之後

def __init__(
    dataset_resource: dict,
    dataset_id: Optional[str] = None,
    # ...
): ...

amazon 提供程式包中的更改

我們努力確保不會有影響終端使用者的更改,以及您的 Python 檔案,但此版本可能包含需要更改您的配置、DAG 檔案或其他整合(例如自定義運算子)的更改。

此處僅描述此提供程式獨有的更改。您仍然應該注意對核心(包括核心運算子)所做的更改,因為它們會影響此提供程式的整合行為。

本節描述了已進行的更改,以及如果您使用與 Amazon 服務(包括 Amazon Web Service - AWS)整合的運算子或 hooks,則需要進行的更新。

AWS 元件的遷移

AIP-21 中所決定,所有 AWS 元件(hooks、運算子、感測器、示例 DAG)將分組在一起。 遷移後的元件保持向後相容,但從舊模組匯入時會引發 DeprecationWarning。 遷移的元件有:

舊路徑

新路徑

airflow.hooks.S3_hook.S3Hook

airflow.providers.amazon.aws.hooks.s3.S3Hook

airflow.contrib.hooks.aws_athena_hook.AWSAthenaHook

airflow.providers.amazon.aws.hooks.athena.AWSAthenaHook

airflow.contrib.hooks.aws_lambda_hook.AwsLambdaHook

airflow.providers.amazon.aws.hooks.lambda_function.AwsLambdaHook

airflow.contrib.hooks.aws_sqs_hook.SQSHook

airflow.providers.amazon.aws.hooks.sqs.SQSHook

airflow.contrib.hooks.aws_sns_hook.AwsSnsHook

airflow.providers.amazon.aws.hooks.sns.AwsSnsHook

airflow.contrib.operators.aws_athena_operator.AWSAthenaOperator

airflow.providers.amazon.aws.operators.athena.AWSAthenaOperator

airflow.contrib.operators.awsbatch.AWSBatchOperator

airflow.providers.amazon.aws.operators.batch.AwsBatchOperator

airflow.contrib.operators.awsbatch.BatchProtocol

airflow.providers.amazon.aws.hooks.batch_client.AwsBatchProtocol

AWSBatchOperator 上的私有屬性和方法

airflow.providers.amazon.aws.hooks.batch_client.AwsBatchClient

n/a

airflow.providers.amazon.aws.hooks.batch_waiters.AwsBatchWaiters

airflow.contrib.operators.aws_sqs_publish_operator.SQSPublishOperator

airflow.providers.amazon.aws.operators.sqs.SQSPublishOperator

airflow.contrib.operators.aws_sns_publish_operator.SnsPublishOperator

airflow.providers.amazon.aws.operators.sns.SnsPublishOperator

airflow.contrib.sensors.aws_athena_sensor.AthenaSensor

airflow.providers.amazon.aws.sensors.athena.AthenaSensor

airflow.contrib.sensors.aws_sqs_sensor.SQSSensor

airflow.providers.amazon.aws.sensors.sqs.SQSSensor

airflow.providers.amazon.aws.hooks.emr.EmrHook
airflow.providers.amazon.aws.operators.emr_add_steps.EmrAddStepsOperator
airflow.providers.amazon.aws.operators.emr_create_job_flow.EmrCreateJobFlowOperator
airflow.providers.amazon.aws.operators.emr_terminate_job_flow.EmrTerminateJobFlowOperator

在以前的版本中,某些 emr 運算子中的 aws_conn_id 的預設值錯誤地設定為 's3_default' 而不是 'aws_default'。 這導致 EmrStepSensor 無法找到其相應的 emr 叢集。 隨著 EmrAddStepsOperator、EmrTerminateJobFlowOperator 和 EmrCreateJobFlowOperator 的新更改,此問題已解決。

airflow.providers.amazon.aws.operators.batch.AwsBatchOperator

AwsBatchOperator 已被重構,提取出一個 AwsBatchClient (並繼承它)。這些更改大多是向後相容的,並闡明瞭這些類的公共 API;AwsBatchOperator 上的一些用於輪詢作業狀態的私有方法已被重新定位和重新命名,以便在 AwsBatchClient 上公開新的公共方法 (並透過繼承在 AwsBatchOperator 上公開)。AwsBatchOperator 例項上的幾個作業屬性已重新命名;這些屬性主要用作私有屬性,但它們已在公共 API 中公開,因此任何對它們的使用都需要按如下方式更新

  • AwsBatchOperator().jobId -> AwsBatchOperator().job_id

  • AwsBatchOperator().jobName -> AwsBatchOperator().job_name

AwsBatchOperator 獲取了一個新選項,用於定義等待作業狀態更改的自定義模型。AwsBatchOperator 可以使用新的 waiters 引數(AwsBatchWaiters 的例項),來指定將使用自定義作業 waiters 監視批處理作業。有關詳細資訊,請參閱最新的 API 文件。

airflow.providers.amazon.aws.sensors.athena.AthenaSensor

將引數 max_retires 替換為 max_retries 以修復拼寫錯誤。

airflow.providers.amazon.aws.hooks.s3.S3Hook

注意:check_for_prefix 的引數順序已更改。bucket_name 現在是可選的。它會回退到 connection schema 屬性。 由於該方法現在在鍵列表長度 > 1000 時發出多個 API 請求,因此 delete_objects 現在返回 None 而不是響應。

其他 provider 包中的更改

我們努力確保不會發生可能影響終端使用者及其 Python 檔案的更改,但此版本可能包含需要更改配置、DAG 檔案或其他整合(例如自定義運算子)的更改。

此處僅描述 provider 特有的更改。您仍應注意對核心(包括核心運算子)所做的更改,因為它們可能會影響此 provider 的整合行為。

本節描述了所做的更改,以及如果您使用 airflow.providers 包中的任何程式碼,您需要如何進行更新。

更改了 S3Hooklist_prefixeslist_keys 方法的返回型別

以前,當沒有結果時,list_prefixeslist_keys 方法返回 None。此行為已更改為在這種情況下返回空列表而不是 None

已移除 HipChat 整合

HipChat 已達到生命週期終止,不再可用。

有關更多資訊,請參閱 https://community.atlassian.com/t5/Stride-articles/Stride-and-Hipchat-Cloud-have-reached-End-of-Life-updated/ba-p/940248

airflow.providers.salesforce.hooks.salesforce.SalesforceHook

將引數 sandbox 替換為 domain。根據 simple-salesforce 包中的更改。

sign_in 函式重新命名為 get_conn

airflow.providers.apache.pinot.hooks.pinot.PinotAdminHook.create_segment

為了與 pylint 相容,在 PinotAdminHook 函式 create_segment 中,將引數名稱從 format 重新命名為 segment_format

airflow.providers.apache.hive.hooks.hive.HiveMetastoreHook.get_partitions

為了與 pylint 相容,在 HiveMetastoreHook 函式 get_partitions 中,將引數名稱從 filter 重新命名為 partition_filter

airflow.providers.ftp.hooks.ftp.FTPHook.list_directory

為了與 pylint 相容,移除 FTPHook 函式 list_directory 中不必要的引數 nlst

airflow.providers.postgres.hooks.postgres.PostgresHook.copy_expert

為了與 pylint 相容,移除 PostgresHook 函式 copy_expert 中不必要的引數 open

airflow.providers.opsgenie.operators.opsgenie_alert.OpsgenieAlertOperator

為了與 pylint 相容,在 OpsgenieAlertOperator 中,將引數名稱從 visibleTo 更改為 visible_to

airflow.providers.imap.hooks.imap.ImapHook
airflow.providers.imap.sensors.imap_attachment.ImapAttachmentSensor

ImapHook

  • has_mail_attachmentretrieve_mail_attachmentsdownload_mail_attachments 的引數順序已更改。

  • 已為每一個添加了一個新的 mail_filter 引數。

airflow.providers.http.hooks.http.HttpHook

HTTPHook 現在預設是安全的:verify=True (之前: verify=False)。這可以透過使用 extra_options 引數作為 {'verify': False} 來覆蓋。

airflow.providers.cloudant.hooks.cloudant.CloudantHook
  • 將 cloudant 版本從 >=0.5.9,<2.0 升級到 >=2.0

  • 移除了 connection 中 schema 屬性的使用

  • 移除了 db 函式,因為資料庫物件也可以透過呼叫 cloudant_session['database_name'] 來檢索

例如

from airflow.providers.cloudant.hooks.cloudant import CloudantHook

with CloudantHook().get_conn() as cloudant_session:
    database = cloudant_session["database_name"]

有關如何使用新 cloudant 版本的更多資訊,請參閱 docs

airflow.providers.snowflake

初始化 Snowflake hook 或 operator 時,無論您是否指定了 snowflake_conn_id 的值,所使用的值始終為 snowflake_conn_id。 現在,為了保持一致性,預設的 snowflake_conn_id 值已切換為 snowflake_default,並且將在指定時被正確覆蓋。

其他更改

此版本還包括不屬於上述任何部分的更改。

標準化 “extra” requirements

我們標準化了 Extras 名稱,並將 provider 包名稱與主 airflow extras 同步。

我們在 2.0 中棄用了一些 extras。

已棄用的 extras

新的 extras

atlas

apache.atlas

aws

amazon

azure

microsoft.azure

azure_blob_storage

microsoft.azure

azure_data_lake

microsoft.azure

azure_cosmos

microsoft.azure

azure_container_instances

microsoft.azure

cassandra

apache.cassandra

druid

apache.druid

gcp

google

gcp_api

google

hdfs

apache.hdfs

hive

apache.hive

kubernetes

cncf.kubernetes

mssql

microsoft.mssql

pinot

apache.pinot

webhdfs

apache.webhdfs

winrm

apache.winrm

例如

如果您想安裝 Apache Atlas 的整合,請使用 pip install apache-airflow[apache.atlas],而不是 pip install apache-airflow[atlas]

注意!

如果您想安裝 Microsoft Azure 的整合,那麼不要使用

pip install 'apache-airflow[azure_blob_storage,azure_data_lake,azure_cosmos,azure_container_instances]'

而應該執行 pip install 'apache-airflow[microsoft.azure]'

如果您想安裝 Amazon Web Services 的整合,請執行 pip install 'apache-airflow[aws]',而不是 pip install 'apache-airflow[s3,emr]'

已棄用的 extras 將在 3.0 版本中刪除。

簡化端點 /dag_stats 和 /task_stats 的響應負載

端點 /dag_stats/task_stats 的響應有助於 UI 獲取關於 DAG 和 Task 的簡要統計資訊。 之前的格式如下:

{
    "example_http_operator": [
        {
            "state": "success",
            "count": 0,
            "dag_id": "example_http_operator",
            "color": "green"
        },
        {
            "state": "running",
            "count": 0,
            "dag_id": "example_http_operator",
            "color": "lime"
        }
    ]
}

dag_id 在負載中重複出現,這使得響應負載不必要地增大。

現在 dag_id 不會在負載中重複出現,響應格式如下:

{
    "example_http_operator": [
        {
            "state": "success",
            "count": 0,
            "color": "green"
        },
        {
            "state": "running",
            "count": 0,
            "color": "lime"
        }
    ]
}

此條目是否有幫助?