Airflow Summit 2025 將於 10 月 7-9 日舉行。立即註冊可享早鳥票優惠!

架構概述

Airflow 是一個允許您構建和執行*工作流*的平臺。工作流由一個 DAG(有向無環圖)表示,包含稱為 任務 的獨立工作單元,這些單元根據依賴關係和資料流進行安排。

An example Airflow DAG, rendered in Graph

DAG 指定了任務之間的依賴關係,定義了任務的執行順序。任務描述了要做什麼,無論是獲取資料、執行分析、觸發其他系統等等。

Airflow 本身與您執行的內容無關——它可以愉快地編排和執行任何內容,無論是透過我們提供商的高階支援,還是直接使用 Shell 或 Python Operator 作為命令。

Airflow 元件

Airflow 的架構由多個元件組成。以下部分描述了每個元件的功能,以及它們是 Airflow 最基本安裝所需的必需元件,還是為了實現更好的 Airflow 擴充套件性、效能和可伸縮性而提供的可選元件。

必需元件

最基本的 Airflow 安裝包括以下元件

  • 一個 排程器 (scheduler),它負責觸發排程的工作流,並將 任務 (Task) 提交給 Executor 執行。Executor 是*排程器*的一個配置屬性,而不是一個獨立的元件,它執行在排程器程序內部。有多種 Executor 可供選擇,您也可以編寫自己的 Executor。

  • 一個*DAG 處理器 (dag processor)*,它解析 DAG 檔案並將其序列化到*元資料資料庫*中。有關處理 DAG 檔案的更多資訊,請參見 DAG 檔案處理

  • 一個*Web 伺服器 (webserver)*,它提供了一個方便的使用者介面來檢查、觸發和除錯 DAGs 和任務的行為。

  • 一個*DAG 檔案*資料夾,供*排程器*讀取,以確定要執行哪些任務以及何時執行。

  • 一個*元資料資料庫 (metadata database)*,Airflow 元件用它來儲存工作流和任務的狀態。有關設定元資料資料庫的資訊,請參見 設定資料庫後端,這是 Airflow 工作的必需步驟。

可選元件

一些 Airflow 元件是可選的,可以提高 Airflow 的擴充套件性、可伸縮性和效能

  • 可選的*工作程序 (worker)*,它執行排程器分配給它的任務。在基本安裝中,工作程序可能是排程器的一部分,而不是一個獨立的元件。它可以在 CeleryExecutor 中作為常駐程序執行,或者在 KubernetesExecutor 中作為 Pod 執行。

  • 可選的*觸發器 (triggerer)*,它在 asyncio 事件迴圈中執行延遲任務。在不使用延遲任務的基本安裝中,觸發器不是必需的。有關延遲任務的更多資訊,請參見 可延遲 Operator & 觸發器

  • 可選的*外掛 (plugins)*資料夾。外掛是一種擴充套件 Airflow 功能的方式(類似於安裝的軟體包)。外掛由*排程器*、*DAG 處理器*、*觸發器*和*Web 伺服器*讀取。有關外掛的更多資訊,請參見 外掛

部署 Airflow 元件

所有元件都是 Python 應用程式,可以使用各種部署機制進行部署。

它們可以在其 Python 環境中安裝額外的*已安裝軟體包 (installed packages)*。例如,這對於安裝自定義 Operator 或 Sensor,或使用自定義外掛擴充套件 Airflow 功能非常有用。

雖然 Airflow 可以在單臺機器上透過僅部署*排程器*和*Web 伺服器*的簡單安裝執行,但 Airflow 設計為可伸縮且安全,並且能夠在分散式環境中執行——其中各種元件可以在不同的機器上執行,具有不同的安全邊界,並且可以透過執行上述元件的多個例項來進行伸縮。

元件的分離也有助於提高安全性,透過將元件彼此隔離並允許執行不同的任務。例如,將*DAG 處理器*與*排程器*分離可以確保排程器無法訪問*DAG 檔案*,也無法執行由*DAG 作者 (DAG author)*提供的程式碼。

此外,雖然單個人可以執行和管理 Airflow 安裝,但在更復雜的設定中,Airflow 部署可能涉及與系統不同部分互動的各種使用者角色,這是安全 Airflow 部署的重要方面。這些角色在 Airflow 安全模型 中有詳細描述,通常包括:

  • 部署管理器 (Deployment Manager) - 負責安裝和配置 Airflow 並管理部署的人員

  • DAG 作者 (DAG author) - 編寫 DAGs 並將其提交到 Airflow 的人員

  • 運維使用者 (Operations User) - 觸發 DAGs 和任務並監控其執行的人員

架構圖

下圖展示了 Airflow 的不同部署方式——從簡單的“單機”和單人部署,逐步演變為具有獨立元件、獨立使用者角色以及最終具有更隔離安全邊界的更復雜部署。

下圖中不同連線型別的含義如下

  • 棕色實線 表示*DAG 檔案*的提交和同步

  • 藍色實線 表示部署和訪問*已安裝軟體包*和*外掛*

  • 黑色虛線 表示*排程器*透過 Executor 對*工作程序*的控制流

  • 黑色實線 表示訪問 UI 管理工作流的執行

  • 紅色虛線 表示所有元件訪問*元資料資料庫*

基本 Airflow 部署

這是最簡單的 Airflow 部署,通常在單臺機器上操作和管理。這種部署通常使用 LocalExecutor,其中*排程器*和*工作程序*在同一個 Python 程序中,並且*排程器*直接從本地檔案系統讀取*DAG 檔案*。*Web 伺服器*與*排程器*在同一臺機器上執行。沒有*觸發器*元件,這意味著無法進行任務延遲。

這種安裝通常不區分使用者角色——部署、配置、操作、編寫和維護都由同一個人完成,元件之間沒有安全邊界。

../_images/diagram_basic_airflow_architecture.png

如果您想在單臺機器上以簡單的單機設定執行 Airflow,可以跳過下面更復雜的圖表,直接轉到 工作負載 部分。

分散式 Airflow 架構

這是 Airflow 的分散式架構,Airflow 的元件分佈在多臺機器上,並引入了各種使用者角色——*部署管理器*、*DAG 作者*、*運維使用者*。您可以在 Airflow 安全模型 中閱讀有關這些不同角色的更多資訊。

在分散式部署的情況下,考慮元件的安全性方面非常重要。*Web 伺服器*無法直接訪問*DAG 檔案*。UI 中“程式碼”選項卡中的程式碼是從*元資料資料庫*中讀取的。*Web 伺服器*無法執行由*DAG 作者*提交的任何程式碼。它只能執行由*部署管理器*安裝為*已安裝軟體包*或*外掛*的程式碼。*運維使用者*只能訪問 UI,並且只能觸發 DAGs 和任務,但不能編寫 DAGs。

*DAG 檔案*需要在所有使用它們的元件之間同步——*排程器*、*觸發器*和*工作程序*。*DAG 檔案*可以透過各種機制進行同步——有關 DAGs 如何同步的典型方法在我們的 Helm Chart 文件中的 管理 DAG 檔案 中有描述。Helm Chart 是在 K8S 叢集中部署 Airflow 的一種方式。

../_images/diagram_distributed_airflow_architecture.png

DAG 處理分離架構

在更復雜的安裝中,如果安全性與隔離性非常重要,您還會看到獨立的*DAG 處理器*元件,它允許將*排程器*與訪問*DAG 檔案*分開。如果部署重點是解析任務之間的隔離,這種架構就很適合。雖然 Airflow 尚未完全支援多租戶功能,但它可用於確保*DAG 作者*提供的程式碼永遠不會在排程器的上下文中執行。

../_images/diagram_dag_processor_airflow_architecture.png

注意

當 DAG 檔案更改時,可能會出現排程器和工作程序看到不同版本的 DAG 的情況,直到兩個元件都同步完成。您可以透過確保在部署期間停用 DAG,並在完成後重新啟用來避免此問題。如果需要,可以配置 DAG 資料夾的同步和掃描頻率。如果您更改配置,請確保您清楚自己在做什麼。

工作負載

DAG 透過一系列 任務 執行,您會看到三種常見的任務型別:

  • Operator,預定義的任務,您可以快速將它們串聯起來構建大部分 DAG。

  • Sensor,Operator 的一個特殊子類,專門用於等待外部事件發生。

  • 一個由 TaskFlow 裝飾器 @task 標記的任務,它是一個打包成任務的自定義 Python 函式。

在內部,這些實際上都是 Airflow 的 BaseOperator 的子類,Task 和 Operator 的概念在某種程度上可以互換,但將它們視為獨立的概覽很有用——本質上,Operator 和 Sensor 是*模板*,當您在 DAG 檔案中呼叫其中一個時,您正在建立一個 Task。

控制流

DAGs 被設計為可以多次執行,並且可以並行進行多次執行。DAGs 是引數化的,總是包含它們“執行的”時間間隔(資料間隔),但也包含其他可選引數。

任務 之間聲明瞭依賴關係。您會在 DAG 中看到這一點,例如使用 >><< Operator

first_task >> [second_task, third_task]
fourth_task << third_task

或者,使用 set_upstreamset_downstream 方法。

first_task.set_downstream([second_task, third_task])
fourth_task.set_upstream(third_task)

這些依賴關係構成了圖的“邊”,也是 Airflow 如何確定任務執行順序的方式。預設情況下,一個任務會等待其所有上游任務成功後才會執行,但可以使用諸如 分支 (Branching)只執行最新 (LatestOnly)觸發規則 (Trigger Rules) 等功能進行定製。

在任務之間傳遞資料,您有三個選項

  • XComs(“跨任務通訊”),一個系統,任務可以在其中推送和拉取少量元資料。

  • 從儲存服務(無論是您自己執行的還是公共雲的一部分)上傳和下載大檔案

  • TaskFlow API 透過隱式的 XComs 自動在任務之間傳遞資料

Airflow 會在*工作程序*空間可用時將任務傳送給它們執行,因此無法保證 DAG 中的所有任務都在同一個工作程序或同一臺機器上執行。

隨著您構建 DAGs,它們可能會變得非常複雜,因此 Airflow 提供了幾種機制使其更易於維護,例如 TaskGroups 允許您在 UI 中直觀地對任務進行分組。

此外,還有一些功能允許您輕鬆預配置對中央資源(如資料儲存)的訪問,形式為 連線 & Hook (Connections & Hooks),以及透過 連線池 (Pools) 限制併發性。

使用者介面

Airflow 提供了一個使用者介面,您可以檢視 DAGs 及其任務的執行情況,觸發 DAG 執行,檢視日誌,並對 DAG 問題進行一些有限的除錯和解決。

../_images/dags.png

這通常是檢視整個 Airflow 安裝狀態的最佳方式,也可以深入檢視單個 DAGs,瞭解其佈局、每個任務的狀態以及每個任務的日誌。

此條目有幫助嗎?