本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
疑難排解:在 Apache 氣流 v2 中的 DAG、操作員、連線和其他問題
本頁的主題說明 Apache Airflow v2 Python 相依性、自訂外掛程式、DAG、操作員、連線、任務和 Web 伺服器問題的解決方案,您可能會遇到的 Apache 氣流環境的 Amazon 受管工作流程。
連線
下列主題說明您在使用 Apache Airflow 連線或使用其他AWS資料庫時可能收到的錯誤。
我無法連線至 Secrets Manager 式
建議下列步驟:
-
瞭解如何在中為 Apache 氣流連線和變數建立密鑰使用 AWS Secrets Manager 密碼設定 Apache 氣流連線。
-
瞭解如何在中針對 Apache 氣流變數 (
test-variable
) 使用密鑰使用密鑰AWS Secrets Manager對於一個阿帕奇氣流變量。 -
在中了解如何使用密鑰進行 Apache 氣流連接 (
myconn
)使用秘密金鑰AWS Secrets Manager對於一個阿帕奇氣流連接。
如何在我的執行角色策略中配置secretsmanager:ResourceTag/<tag-key>
Secret 管理器條件或資源限制?
注意
適用於 Apache 氣流 2.0 版及更早版本。
目前,您無法使用環境執行角色中的條件金鑰或其他資源限制來限制 Secrets Manager 密碼的存取,這是因為 Apache Airflow 中存在已知問題所致。
我無法連線至雪花
建議下列步驟:
-
使用 aws-mwaa-local-runner
on 在本機測試您的 DAG、自訂外掛程式和 Python 相依性GitHub。 -
將下列項目新增至您環境的 requirements.txt。
apache-airflow-providers-snowflake==1.3.0
-
將下列匯入新增至您的 DAG:
from airflow.providers.snowflake.operators.snowflake import SnowflakeOperator
確保 Apache Airflow 連線物件包含下列索引鍵/值組:
-
連接埠 ID:雪花 _ 連接
-
連接器類型:雪花
-
主持人:<my account>. <my region if not us-west-2>. 雪花計算 .com
-
綱要:<my schema>
-
登入:<my user name>
-
密碼:
-
連接埠:<port, if any>
-
額外:
{ "account": "<my account>", "warehouse": "<my warehouse>", "database": "<my database>", "region": "<my region if not using us-west-2 otherwise omit this line>" }
例如:
>>> import json >>> from airflow.models.connection import Connection >>> myconn = Connection( ... conn_id='snowflake_conn', ... conn_type='Snowflake', ... host='
YOUR_ACCOUNT
.YOUR_REGION
.snowflakecomputing.com', ... schema='YOUR_SCHEMA
' ... login='YOUR_USERNAME
', ... password='YOUR_PASSWORD
', ... port='YOUR_PORT
' ... extra=json.dumps(dict(account='YOUR_ACCOUNT
', warehouse='YOUR_WAREHOUSE
', database='YOUR_DB_OPTION
', region='YOUR_REGION
')), ... )
我在氣流使用者介面中看不到我的連線
阿帕奇氣流提供了 Apache 氣流用戶界面中的連接模板。它使用它來生成連接 URI 字符串,而不管連接類型如何。如果 Apache Airflow UI 中沒有連線範本,則可以使用替代連線範本來產生連線 URI 字串,例如使用 HTTP 連線範本。
建議下列步驟:
-
在 Apache 氣流使用者介面中檢視亞馬遜 MWAA 提供的連線類型,位於在 Amazon MWAA 環境上安裝的 Apache 氣流供應商套件。
-
檢視在 CLI 中建立 Apache 氣流連線的命令阿帕奇氣流 CLI 命令參考。
-
了解如何在 Apache 氣流使用者介面中互換使用連線範本,以便在 Amazon MWAA 上的 Apache 氣流使用者介面中無法使用的連線類型連線類型概觀。
Web 伺服器
下列主題說明您在 Amazon MWAA 上針對 Apache 氣流網頁伺服器可能收到的錯誤。
我看到存取網頁伺服器時發生 5xx 錯誤
建議下列步驟:
-
檢查 Apache Airflow 組態選項。確認您指定為 Apache 氣流組態選項的索引鍵值配對 (例如AWS Secrets Manager) 已正確設定。如需進一步了解,請參閱 我無法連線至 Secrets Manager 式。
-
檢查
requirements.txt
。確認您的氣流「額外」套件和其他程式庫與requirements.txt
您的 Apache 氣流版本相容。 -
探索在文件中指定 Python 依賴關係的方
requirements.txt
法,請參閱在 requirements.txt 中 Python 理依賴關係。
我看到「調度程序似乎沒有運行」錯誤
如果排程器似乎沒有在執行中,或數小時前收到最後一個「心跳」,您的 DAG 可能不會出現在 Apache Airflow 中,而且不會排定新工作。
建議下列步驟:
-
確認您的 VPC 安全群組允許對連接埠進行輸入存取
5432
。需要此連接埠才能連接到您環境的 Amazon Aurora PostgreSQL 中繼資料資料庫。添加此規則後,請給 Amazon MWAA 幾分鐘,錯誤應該消失。如需進一步了解,請參閱 Amazon MWAA 上 VPC 中的安全性。注意
-
Aurora PostgreSQL 中繼資料庫是亞馬遜 MWAA 服務架構的一部分,在您的AWS 帳戶.
-
資料庫相關錯誤通常是排程器失敗的徵兆,而不是根本原因。
-
-
如果排程器未執行,可能是由於許多因素,例如相依性安裝失敗或排程器過載。在記錄檔中檢視對應的CloudWatch記錄群組,確認您的 DAG、外掛程式和需求是否正常運作。如需進一步了解,請參閱 針對 Apache 氣流的 Amazon 受管工作流程監控和指標。
任務
下列主題說明您在環境中針對 Apache Airflow 工作可能收到的錯誤。
我看到我的任務卡住或沒有完成
如果您的 Apache 氣流任務「卡住」或未完成,我們建議您執行以下步驟:
-
可能有大量的定義 DAG。減少 DAG 的數目,並執行環境的更新 (例如變更記錄層級) 以強制重設。
-
氣流會剖析 DAG 是否已啟用。如果您使用的環境容量超過 50%,您可能會開始壓倒 Apache 氣流排程器。這會導致CloudWatch量度中的「總剖析時間」較長,或是CloudWatch記錄檔中的 DAG 處理時間過長。還有其他方法可將 Apache Airflow 組態設定最佳化,這些組態不在本指南的討論範圍內。
-
若要深入瞭解我們建議調整環境效能的最佳做法,請參閱Amazon MWAA 上阿帕奇氣流的性能調整。
-
-
佇列中可能有大量工作。這通常會顯示為處於「無」狀態的大量工作 (而且正在增加),或在中排入佇列的工作和/或擱置中的工作中顯示為大量工作CloudWatch。這種情況可能是由於下列原因而發生:
-
如果要執行的工作數量超過環境所能執行的容量,和/或在自動調度資源有時間偵測工作並部署其他 Worker 之前排入佇列的大量工作。
-
如果要執行的工作數量超過具有執行容量的環境,建議您減少 DAG 同時執行的工作數量,和/或增加 Apache Airflow Worker 的最小值。
-
如果在自動調度資源有足夠時間偵測和部署其他工作者之前,有大量工作已排入佇列中,我們建議您進行驚人的工作部署和/或增加 Apache Airflow Worker 的最小值。
-
您可以使用AWS Command Line Interface (AWS CLI) 中的更新環境命令來變更在您環境中執行的 Worker 數目下限或上限。
aws mwaa update-environment --name MyEnvironmentName --min-workers 2 --max-workers 10
-
若要深入瞭解我們建議調整環境效能的最佳做法,請參閱Amazon MWAA 上阿帕奇氣流的性能調整。
-
-
執行中可能會刪除某些工作,這些工作會顯示為工作記錄,而在 Apache Airflow 中沒有進一步指示的情況下停止。這種情況可能是由於下列原因而發生:
-
如果有一個短暫的時刻,其中 1)當前任務超過當前的環境容量,然後是 2)幾分鐘沒有任務執行或排隊,那麼 3)新的任務被排隊。
-
Amazon MWAA 透過新增其他工作程式,自動調度資源回應第一個案例。在第二個案例中,它會移除其他 Worker。某些正在排入佇列的工作可能會導致 Worker 在移除程序中,而且會在刪除容器時結束。
-
我們建議您增加環境中的最少員工數量。另一個選項是調整 DAG 和工作的時間,以確保這些案例不會發生。
-
您還可以將最小工作人員設置為等於環境中最大工作人員,以有效地禁用自動調度資源。使用AWS Command Line Interface (AWS CLI) 中的更新環境命令,藉由將 Worker 的最小和最大數目設定為相同,以停用自動調度資源。
aws mwaa update-environment --name MyEnvironmentName --min-workers 5 --max-workers 5
-
若要深入瞭解我們建議調整環境效能的最佳做法,請參閱Amazon MWAA 上阿帕奇氣流的性能調整。
-
-
如果您的任務處於「正在運行」狀態,您也可以清除任務或將其標記為成功或失敗。這可讓您的環境自動調度資源元件縮減環境中執行的 Worker 數目。以下圖片顯示了擱淺工作的範例。
-
選擇擱淺工作的圓形,然後選取 [清除] (如圖所示)。這可讓 Amazon MWAA 縮減工作者的規模;否則,Amazon MWAA 無法判斷哪些 DAG 已啟用或停用,如果仍有佇列的任務,也無法縮小規模。
-
-
若要深入瞭解 Apache 氣流工作生命週期,請參閱 Apache 氣流參考指南中的概念
。
CLI
下列主題說明您在中執行 Airflow CLI 命令時可能收到的錯誤AWS Command Line Interface。
在 CLI 中觸發 DAG 時,我看到「503」錯誤
氣流 CLI 在 Apache 氣流網頁伺服器上執行,該伺服器的並行性有限。通常最多可同時執行 4 個 CLI 命令。
為什麼dags backfill
阿帕奇氣流 CLI 命令失敗? 有沒有解決方法?
注意
以下內容僅適用於 Apache Airflow v2.0.2 環境。
與其他 Apache 氣流 CLIbackfill
命令一樣,命令會在處理任何 DAG 之前在本機剖析所有 DAG,而不論 CLI 作業適用於哪個 DAG。在使用 Apache Airflow v2.0.2 的 Amazon MWAA 環境中,由於 CLI 命令執行時尚未在網頁伺服器上安裝外掛程式和需求,因此剖析作業會失敗,且不會叫用backfill
作業。如果您的環境中沒有任何要求或插件,則backfill
操作將成功。
為了能夠運行backfill
CLI 命令,我們建議在 bash 運算符中調用它。在 bash 運算符中,backfill
從 Worker 啟動,允許 DAG 成功解析,因為所有必要的需求和 PLGUIN 都可用並已安裝。以下範例顯示如何使用建立 DAG,BashOperator
以執行backfill
。
from airflow import DAG from airflow.operators.bash_operator import BashOperator from airflow.utils.dates import days_ago with DAG(dag_id="backfill_dag", schedule_interval=None, catchup=False, start_date=days_ago(1)) as dag: cli_command = BashOperator( task_id="bash_command", bash_command="airflow dags backfill my_dag_id" )
電信業者
下列主題說明使用運算子時可能收到的錯誤。
我使用 S3 轉換運算符收到PermissionError: [Errno 13] Permission denied
錯誤
如果您嘗試使用 S3Transform 運算子執行 shell 指令碼,並且收到PermissionError: [Errno 13] Permission denied
錯誤訊息,我們建議您執行下列步驟。下列步驟假設您有現有的 plugins.zip 檔案。如果您要建立新的 plugins.zip,請參閱安裝自定義插件。
-
使用 aws-mwaa-local-runner
on 在本機測試您的 DAG、自訂外掛程式和 Python 相依性GitHub。 -
創建您的「轉換」腳本。
#!/bin/bash cp $1 $2
-
(可選) macOS 和 Linux 使用者可能需要執行下列命令,以確保指令碼可執行。
chmod 777 transform_test.sh
-
將指令碼新增到您的 plugins.zip 中。
zip plugins.zip transform_test.sh
-
請按照將 plugins.zip 上傳到 Amazon S3 中的步驟進行操作。
-
請依照在亞馬遜 MWAA 主控台上指定 plugins.zip 版本中的步驟進行。
-
建立下列 DAG。
from airflow import DAG from airflow.providers.amazon.aws.operators.s3_file_transform import S3FileTransformOperator from airflow.utils.dates import days_ago import os DAG_ID = os.path.basename(__file__).replace(".py", "") with DAG (dag_id=DAG_ID, schedule_interval=None, catchup=False, start_date=days_ago(1)) as dag: file_transform = S3FileTransformOperator( task_id='file_transform', transform_script='/usr/local/airflow/plugins/transform_test.sh', source_s3_key='s3://
YOUR_S3_BUCKET
/files/input.txt', dest_s3_key='s3://YOUR_S3_BUCKET
/files/output.txt' ) -
請依照將 DAG 程式碼上傳至 Amazon S3 中的步驟進行。