本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
故障診斷:DAGs、運算子、連線和其他問題
本頁面上的主題說明您在 Amazon Managed Workflows for Apache Airflow 環境中可能遇到的 Apache Airflow v2 和 v3 Python 相依性、自訂外掛程式、DAGs、運算子、連線、任務和 Web 伺服器問題的解決方法。
內容
連線
下列主題說明使用 Apache Airflow 連線或使用另一個 AWS 資料庫時可能收到的錯誤。
我無法連線至 Secrets Manager
建議下列步驟:
-
了解如何在 中建立 Apache Airflow 連線和變數的私密金鑰使用 AWS Secrets Manager 秘密設定 Apache Airflow 連線。
-
了解如何在 中使用 Apache Airflow 變數 (
test-variable) 的私密金鑰針對 AWS Secrets Manager Apache Airflow 變數在 中使用私密金鑰。 -
了解如何在 中使用 Apache Airflow 連線 (
myconn) 的私密金鑰在 中使用私密金鑰 AWS Secrets Manager 進行 Apache Airflow 連線。
如何在執行角色政策中設定secretsmanager:ResourceTag/<tag-key>秘密管理員條件或資源限制?
注意
適用於 Apache Airflow 2.0 版及更早版本。
目前,由於 Apache Airflow 中的已知問題,您無法在環境執行角色中使用條件金鑰或其他資源限制來限制對 Secrets Manager 秘密的存取。
我無法連線至 Snowflake
建議下列步驟:
-
在 GitHub 上使用 aws-mwaa-docker-images
,在本機測試您的 DAGs、自訂外掛程式和 Python 相依性。 -
將下列項目新增至您環境的 requirements.txt。
apache-airflow-providers-snowflake==1.3.0 -
將下列匯入新增至您的 DAG:
from airflow.providers.snowflake.operators.snowflake import SnowflakeOperator
確保 Apache Airflow 連線物件包含下列鍵值對:
-
Conn ID:nowflake_conn
-
Conn 類型:Snowflake
-
主機:<my account>.<my region if not us-west-2>.snowflakecomputing.com
-
結構描述:<my 結構描述>
-
登入:<我的使用者名稱>
-
密碼:*******
-
連接埠:<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='123456789012.us-east-1.snowflakecomputing.com', ... schema='YOUR_SCHEMA' ... login='YOUR_USERNAME', ... password='YOUR_PASSWORD', ... port='YOUR_PORT' ... extra=json.dumps(dict(account='123456789012', warehouse='YOUR_WAREHOUSE', database='YOUR_DB_OPTION', region='us-east-1')), ... )
我無法在 Airflow UI 中找到我的連線
Apache Airflow 在 Apache Airflow UI 中提供連線範本。無論連線類型為何,它都會使用此字串來產生連線 URI 字串。如果 Apache Airflow UI 中無法使用連線範本,則可以使用替代連線範本來產生連線 URI 字串,例如使用 HTTP 連線範本。
建議下列步驟:
-
在 的 Apache Airflow UI 中存取 Amazon MWAA 提供的連線類型安裝在 Amazon MWAA 環境上的 Apache Airflow 提供者套件。
-
存取命令,在 的 CLI 中建立 Apache Airflow 連線Apache Airflow CLI 命令參考。
-
了解如何針對 Amazon MWAA 上的 Apache Airflow UI 中無法使用的連線類型,交替使用 Apache Airflow UI 中的連線範本連線類型概觀。
Web 伺服器
下列主題說明 Amazon MWAA 上 Apache Airflow Web 伺服器可能收到的錯誤。
我在存取 Web 伺服器時收到 5xx 錯誤
建議下列步驟:
-
檢查 Apache Airflow 組態選項。確認您指定為 Apache Airflow 組態選項的鍵值對 AWS Secrets Manager已正確設定,例如 。若要進一步了解,請參閱 我無法連線至 Secrets Manager。
-
檢查
requirements.txt。確認 中列出的 Airflow "extras"requirements.txt套件和其他程式庫與您的 Apache Airflow 版本相容。 -
探索在
requirements.txt檔案中指定 Python 相依性的方法,請參閱 在 requirements.txt 中管理 Python 相依性。
我收到The scheduler does not seem to be running錯誤
如果排程器似乎未執行,或幾小時前收到最後一個「心跳」,您的 DAGs 可能不會列在 Apache Airflow 中,也不會排定新任務。
建議下列步驟:
-
確認您的 VPC 安全群組允許傳入存取連接埠
5432。需要此連接埠才能連線至您環境的 Amazon Aurora PostgreSQL 中繼資料資料庫。新增此規則後,請給 Amazon MWAA 幾分鐘的時間,錯誤可能會消失。若要進一步了解,請參閱 Amazon MWAA 上 VPC 的安全性。注意
-
Aurora PostgreSQL 中繼資料庫是 Amazon MWAA 服務架構的一部分,不適用於您的 AWS 帳戶。
-
資料庫相關錯誤通常是排程器失敗的徵狀,而不是根本原因。
-
-
如果排程器未執行,可能是因為相依性安裝失敗或排程器過載等多種因素。透過存取 CloudWatch Logs 中的對應日誌群組,確認您的 DAGs、外掛程式和需求正常運作。若要進一步了解,請參閱 Amazon Managed Workflows for Apache Airflow 的監控和指標。
任務
下列主題說明 環境中 Apache Airflow 任務可能收到的錯誤。
我讓任務停滯或未完成
如果您的 Apache Airflow 任務「卡住」或未完成,建議您執行下列步驟:
-
定義了大量 DAGs。減少 DAGs 數量並執行環境更新 (例如變更日誌層級),以強制重設。
-
無論是否啟用,氣流都會剖析 DAGs。如果您使用的是環境容量的 50% 以上,您可能會開始讓 Apache Airflow 排程器負擔過重。這會導致 CloudWatch 指標中的大量總剖析時間,或 CloudWatch Logs 中的長 DAG 處理時間。還有其他方法可以最佳化本指南範圍之外的 Apache Airflow 組態。
-
若要進一步了解我們建議調整環境效能的最佳實務,請參閱 Amazon MWAA 上 Apache Airflow 的效能調校。
-
-
佇列中可能會有大量任務。這通常顯示為大型 - 且不斷增加 -
None狀態中的任務數量,或Tasks PendingCloudWatch 中的Queued Tasks和/或 中的大量任務數量。發生這種情況的原因如下:-
如果執行的任務數量超過環境的容量,和/或在自動擴展有時間偵測任務並部署其他工作者之前排入佇列的大量任務。
-
如果執行的任務數量超過環境的容量,建議您減少 DAGs 同時執行的任務數量,和/或增加 Apache Airflow 工作者人數下限。
-
如果有許多任務在自動擴展有時間偵測和部署其他工作者之前排入佇列,我們建議交錯任務部署和/或增加 Apache Airflow 工作者人數下限。
-
您可以使用 AWS Command Line Interface (AWS CLI) 中的 update-environment 命令來變更在您環境中執行的工作者數量下限或上限。
aws mwaa update-environment --name MyEnvironmentName --min-workers 2 --max-workers 10 -
若要進一步了解我們建議調整環境效能的最佳實務,請參閱 Amazon MWAA 上 Apache Airflow 的效能調校。
-
-
如果您的任務卡在「執行中」狀態,您也可以清除任務或將其標記為成功或失敗。這可讓環境的自動擴展元件縮減您環境上執行的工作者數量。下圖描述了絞線任務的範例。
-
選擇絞線任務的圓圈,然後選取清除 (如圖所示)。這可讓 Amazon MWAA 縮減工作者規模;否則,Amazon MWAA 無法判斷要啟用或停用哪些 DAGs,如果仍有佇列的任務,則無法縮減規模。
-
-
請參閱《Apache Airflow 參考指南》中的概念
,進一步了解 Apache Airflow 任務生命週期。
我在 Airflow v3 中收到沒有日誌的任務失敗
如果您的 Apache Airflow 3 任務在沒有日誌的情況下失敗,請遵循下列步驟:
-
如果工作者日誌出現錯誤,例如任務失敗時
Task handler raised error: WorkerLostError('Worker exited prematurely: exitcode 15 Job: 12.'),這表示指派給任務的分叉工作者程序可能意外終止。若要解決此問題,請考慮使用相同的最小值和最大值來設定 celery.worker_autoscale。例如:
celery.worker_autoscale=5,5 # for mw1.small celery.worker_autoscale=10,10 # for mw1.medium celery.worker_autoscale=20,20 # for mw1.large這可確保工作者集區大小保持固定,防止工作者意外終止。
CLI
下列主題說明您在 中執行 Airflow CLI 命令時可能收到的錯誤 AWS Command Line Interface。
在 CLI 中觸發 DAG 時收到「503」錯誤
Airflow CLI 在 Apache Airflow Web 伺服器上執行,其並行有限。一般而言,最多可以同時執行 4 個 CLI 命令。
為什麼 dags backfill Apache Airflow CLI 命令會失敗? 是否有解決方法?
注意
以下僅適用於 Apache Airflow v2.0.2 環境。
與其他 Apache Airflow CLI 命令一樣, backfill命令會在本機剖析所有 DAGs,再處理任何 DAGs,無論 CLI 操作套用到哪個 DAG。在使用 Apache Airflow 2.0.2 版的 Amazon MWAA 環境中,因為在 CLI 命令執行時,外掛程式和需求尚未安裝在 Web 伺服器上、剖析操作失敗,而且未叫用 backfill操作。如果您在環境中沒有任何需求或外掛程式,backfill操作將會成功。
為了能夠執行 backfill CLI 命令,建議您在 bash 運算子中叫用它。在 bash 運算子中, 是從工作者backfill起始,允許 DAGs 成功剖析,因為所有必要的要求和 plguins 都可用並安裝。使用下列範例建立具有 的 DAGBashOperator,以執行 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" )
運算子
下列主題說明使用 Operators 時可能收到的錯誤。
我使用 S3Transform 運算子收到PermissionError: [Errno 13] Permission denied錯誤
如果您嘗試使用 S3Transform 運算子執行 shell 指令碼,且收到PermissionError: [Errno 13] Permission denied錯誤,建議您執行下列步驟。下列步驟假設您具有現有的 plugins.zip 檔案。如果您要建立新的 plugins.zip,請參閱 安裝自訂外掛程式。
-
在 GitHub 上使用 aws-mwaa-docker-images
,在本機測試您的 DAGs、自訂外掛程式和 Python 相依性。 -
建立您的「轉換」指令碼。
#!/bin/bash cp $1 $2 -
(選用) macOS 和 Linux 使用者可能需要執行下列命令,以確保指令碼可執行。
chmod 777 transform_test.sh -
將指令碼新增至您的 plugins.zip。
zip plugins.zip transform_test.sh -
請遵循上傳 plugins.zip 至 Amazon S3 中的步驟。
-
請遵循 Amazon 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://amzn-s3-demo-bucket/files/input.txt', dest_s3_key='s3://amzn-s3-demo-bucket/files/output.txt' ) -
請遵循將 DAG 程式碼上傳至 Amazon S3 中的步驟。