架構概觀

Airflow 是一個平台,讓您建置和執行工作流程。工作流程以 DAG (有向無環圖)(有向無環圖)表示,並包含稱為 任務 的個別工作單元,這些任務根據相依性和資料流進行安排。

An example Airflow DAG, rendered in Graph

DAG (有向無環圖) 指定任務之間的相依性,這定義了執行任務的順序。任務描述要做什麼,無論是提取資料、執行分析、觸發其他系統等等。

Airflow 本身與您運行的內容無關——它很樂意協調和運行任何內容,無論是透過我們供應商之一的高階支援,還是直接使用 shell 或 Python 運算子 作為命令。

Airflow 組件

Airflow 的架構包含多個組件。以下章節描述每個組件的功能,以及它們是否是基本 Airflow 安裝的必要組件,或是實現更佳 Airflow 擴展性、效能和可擴展性的選用組件。

必要組件

最簡化的 Airflow 安裝包含以下組件

  • 排程器,它處理觸發排定的工作流程,以及將 任務 提交給執行器以執行。執行器排程器的組態屬性,而不是單獨的組件,並且在排程器進程中運行。有多種現成的執行器可用,您也可以編寫自己的執行器。

  • 網頁伺服器,它提供方便的使用者介面,用於檢查、觸發和偵錯 DAG (有向無環圖) 和任務的行為。

  • DAG 檔案的資料夾,排程器會讀取這些檔案,以了解要運行的任務以及何時運行它們。

  • 元數據資料庫,airflow 組件使用它來儲存工作流程和任務的狀態。設定元數據資料庫在 設定資料庫後端 中描述,並且是 Airflow 運作所必需的。

選用組件

某些 Airflow 組件是選用的,可以讓您的 Airflow 具有更佳的擴展性、可擴展性和效能

  • 選用的工作節點,它執行排程器給它的任務。在基本安裝中,工作節點可能是排程器的一部分,而不是單獨的組件。它可以作為 CeleryExecutor 中的長時間運行的進程運行,或者作為 KubernetesExecutor 中的 POD 運行。

  • 選用的觸發器,它在 asyncio 事件迴圈中執行延遲任務。在不使用延遲任務的基本安裝中,觸發器不是必要的。有關延遲任務的更多資訊,請參閱 可延遲運算子 & 觸發器

  • 選用的DAG 處理器,它解析 DAG 檔案並將它們序列化到元數據資料庫中。預設情況下,DAG 處理器進程是排程器的一部分,但為了可擴展性和安全性原因,它可以作為單獨的組件運行。如果存在DAG 處理器,則排程器不需要直接讀取 DAG 檔案。有關處理 DAG 檔案的更多資訊,請參閱 DAG 檔案處理

  • 選用的 外掛程式資料夾。外掛程式是一種擴展 Airflow 功能的方式(類似於已安裝的套件)。排程器DAG 處理器觸發器網頁伺服器會讀取外掛程式。有關外掛程式的更多資訊,請參閱 外掛程式

部署 Airflow 組件

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

它們可以在其 Python 環境中安裝額外的已安裝套件。例如,這對於安裝自訂運算子或感測器,或使用自訂外掛程式擴展 Airflow 功能非常有用。

雖然 Airflow 可以在單一機器上運行,並且可以使用僅部署排程器網頁伺服器的簡單安裝,但 Airflow 的設計旨在實現可擴展性和安全性,並且能夠在分散式環境中運行——在分散式環境中,各種組件可以在不同的機器上運行,具有不同的安全邊界,並且可以透過運行上述組件的多個實例來擴展。

組件的分離也提高了安全性,透過將組件彼此隔離,並允許執行不同的任務。例如,將 DAG 處理器排程器 分離,可以確保 排程器 無法存取 DAG 檔案,並且無法執行 DAG 作者 提供的程式碼。

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

  • 部署管理員 - 安裝和設定 Airflow 並管理部署的人員

  • DAG 作者 - 編寫 DAG (有向無環圖) 並將其提交給 Airflow 的人員

  • 操作使用者 - 觸發 DAG (有向無環圖) 和任務並監控其執行的人員

架構圖

下圖顯示了部署 Airflow 的不同方式——從簡單的「單一機器」和單人部署,逐步到具有獨立組件、獨立使用者角色以及最終具有更隔離的安全邊界的更複雜部署。

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

  • 棕色實線 代表 DAG 檔案 提交和同步

  • 藍色實線 代表部署和存取已安裝套件外掛程式

  • 黑色虛線 代表 排程器(透過執行器)對工作節點的控制流程

  • 黑色實線 代表存取使用者介面以管理工作流程的執行

  • 紅色虛線 代表所有組件存取元數據資料庫

基本 Airflow 部署

這是 Airflow 最簡單的部署,通常在單一機器上操作和管理。這種部署通常使用 LocalExecutor,其中排程器工作節點位於同一個 Python 進程中,並且 DAG 檔案排程器 直接從本機檔案系統讀取。網頁伺服器排程器在同一部機器上運行。沒有觸發器組件,這表示任務延遲是不可能的。

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

../_images/diagram_basic_airflow_architecture.png

如果您想在簡單的單一機器設定中在單一機器上運行 Airflow,您可以跳過下面更複雜的圖表,直接前往 工作負載 章節。

分散式 Airflow 架構

這是 Airflow 的架構,其中 Airflow 的組件分佈在多部機器之間,並引入了各種使用者角色——部署管理員DAG 作者操作使用者。您可以在 Airflow 安全模型 中閱讀有關這些各種角色的更多資訊。

在分散式部署的情況下,重要的是要考慮組件的安全性方面。網頁伺服器無法直接存取 DAG 檔案。使用者介面 程式碼 標籤中的程式碼是從元數據資料庫讀取的。網頁伺服器無法執行 DAG 作者 提交的任何程式碼。它只能執行由 部署管理員 安裝為已安裝套件外掛程式的程式碼。操作使用者 只能存取使用者介面,並且只能觸發 DAG (有向無環圖) 和任務,但無法撰寫 DAG (有向無環圖)。

DAG 檔案 需要在所有使用它們的組件(排程器觸發器工作節點)之間同步。DAG 檔案 可以透過各種機制同步——關於 DAG 如何同步的典型方式在我們的 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 (有向無環圖) 透過一系列 任務 運行,您將看到三種常見的任務類型

  • 運算子,預定義的任務,您可以快速地將它們串在一起以建置 DAG (有向無環圖) 的大部分部分。

  • 感測器,運算子的特殊子類別,完全是關於等待外部事件發生。

  • TaskFlow 修飾的 @task,這是一個封裝為任務的自訂 Python 函數。

在內部,這些實際上都是 Airflow 的 BaseOperator 的子類別,並且任務和運算子的概念在某種程度上是可互換的,但將它們視為單獨的概念很有用——本質上,運算子和感測器是範本,當您在 DAG 檔案中呼叫一個時,您正在建立一個任務。

控制流程

DAG (有向無環圖) 被設計為多次運行,並且它們的多個運行可以並行發生。DAG (有向無環圖) 是參數化的,始終包含它們「運行的」間隔(資料間隔),但也包含其他選用參數。

任務 彼此之間宣告了相依性。您將在 DAG (有向無環圖) 中看到使用 >><< 運算子

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 如何計算出運行任務的順序。預設情況下,任務將等待其所有上游任務成功完成後再運行,但可以使用 分支僅最新觸發規則 等功能自訂此行為。

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

  • XComs (跨組件溝通)(「跨組件溝通」),一個系統,您可以在其中讓任務推送和提取少量元數據。

  • 從儲存服務(您可以運行的服務,或公有雲的一部分)上傳和下載大型檔案

  • TaskFlow API 自動透過隱含的 XComs (跨組件溝通) 在任務之間傳遞資料

Airflow 會在空間可用時將任務發送到工作節點上運行,因此無法保證 DAG (有向無環圖) 中的所有任務都會在同一個工作節點或同一部機器上運行。

當您建置 DAG (有向無環圖) 時,它們很可能會變得非常複雜,因此 Airflow 提供了幾種機制來使此過程更具永續性——子 DAG (有向無環圖) 讓您可以建立可以嵌入到其他 DAG (有向無環圖) 中的「可重複使用」的 DAG (有向無環圖),而 任務群組 讓您可以在使用者介面中視覺化地將任務分組。

還有一些功能可以讓您輕鬆預先組態設定對中央資源(例如資料儲存區)的存取,形式為 連線 & Hook,並透過 Pools (資源池) 限制並行性。

使用者介面

Airflow 配備使用者介面,可讓您查看 DAG (有向無環圖) 及其任務正在執行的操作、觸發 DAG (有向無環圖) 的運行、查看日誌,以及對 DAG (有向無環圖) 的問題進行一些有限的偵錯和解決。

../_images/dags.png

它通常是查看整個 Airflow 安裝狀態的最佳方式,以及深入了解個別 DAG (有向無環圖) 以查看其佈局、每個任務的狀態以及每個任務的日誌。

此條目是否有幫助?