我想追蹤 Amazon Managed Workflows for Apache Airflow (Amazon MWAA) 中的「任務是否從外部終止」錯誤。
簡短描述
當 Airflow 中繼資料資料庫和任務啟動器之間的任務狀態不同時,會發生「任務是否從外部終止」錯誤。以下是導致此錯誤的原因:
- 已達到 task_queued_timeout 值。預設值為 600 秒。如果是早期版本的 Apache Airflow,請查看 task_adoption_timeout 值。如需詳細資訊,請參閱 Apache Airflow 網站上的 task_queued_timeout_check_interval。
- 任務因工作者的資源使用率過高而失敗。
解決方法
檢查排程器日誌
請完成下列步驟:
-
開啟 Amazon CloudWatch console (Amazon CloudWatch 主控台)。
-
在導覽窗格中,選擇 Logs (日誌)。
-
選擇 Log groups (日誌群組)。
-
選擇您要檢視的日誌群組。
-
選擇 Search All LogStream (搜尋所有 LogStream)。
-
若要搜尋任務失敗的時間段,請更新時間間隔。此外,請使用您的任務 ID 篩選搜尋:
"example-dag-name.example-task-name manual__example-time-202X-XX-XXTXX:XX:XX.758774+00:00"
**注意:**將 example-dag-name 替換為您的有向無環圖 (DAG) 名稱,將 example-task-name 替換為您的任務名稱,並將 example-time 替換為您要使用的時間段。
-
在搜尋結果中,找出參考您任務的兩行日誌:
以下是佇列任務的範例:
[[34m**2024-01-17T11:19:07.487+0000**[0m] [34mscheduler_job_runner.py:[0m713 INFO[0m - Setting external_id for <TaskInstance: dag_name.task_name manual__202X-XX-XXTXX:XX:XX.758774+00:00[queued]> to 8b49b168-992d-4db6-bdc7-a143d55720c8[0m
以下是已停止任務的範例:
[[34m**2024-01-17T11:30:18.936+0000**[0m] [34mscheduler_job_runner.py:[0m771 ERROR[0m - Executor reports task instance <TaskInstance: dag_name.task_name manual__202X-XX-XXTXX:XX:XX.758774+00:00 [queued]> finished (failed) although the task says it's queued. (Info: None) Was the task killed externally?[0m
您可以對下列情況進行進一步疑難排解。
由於 task_queued_timeout,任務失敗
比較您排程任務的時間和任務停止時間的時間戳記。如果差值大於或等於 task_queued_timeout 值,表示您的任務在佇列時間過長。
若要解決此問題,請執行下列動作:
- 增加 task_queued_timeout 值,以便任務可以在佇列中等待更長時間而不會逾時。
- 升級到更高的環境類型,以增加每個工作容器中的 Celery 工作節點數量。環境上可執行的並行任務數為 maxWorkers * celery.worker_autoscale。
- 分散 DAG 和任務的負載。不要一次執行多個 DAG。
- 檢查排程器是否沒有超載。如果您的排程器超載,那麼任務可能無法按時排程。
**注意:**增加排程器數量可能會影響中繼資料庫的使用率和剖析時間。增加排程器數量可以提高高可用性(HA),但不會為任務排程增加更多資源。如果未達到 task_queued_timeout 的值,請檢查您的工作者日誌。
若要檢查您的工作者日誌,請完成下列步驟:
- 存取您的 Apache Airflow UI。
- 選擇一個 DAG。
- 選取 Graph (圖形)。
- 選擇任務執行。
- 選擇 Instance details (執行個體詳細資訊)。然後,記下任務的 external_executor_id 值。
- 開啟 Amazon CloudWatch console (Amazon CloudWatch 主控台)。
- 在導覽窗格中,選擇 Logs (日誌)。
- 選擇 Log groups (日誌群組)。
- 選擇您要檢視的日誌群組。
- 選擇 Search All LogStream (搜尋所有 LogStream)。
- 若要搜尋任務失敗的時間段,請更新時間間隔。
- 使用 external_executor_id 值篩選搜尋,以查看與工作者上的任務相關的日誌行。
- 識別與您任務相關的錯誤訊息。如需錯誤的詳細資訊,請選擇日誌串流的名稱。
任務因 CPU 或記憶體使用率過高而失敗
如果您收到下列錯誤訊息,表示您的工作者有資源使用率問題,例如 CPU 或 RAM 過高。因此,在工作者容器上執行的工作者處理程序會失敗並提早退出。
"[2023-07-26 13](tel:2023072613):00:49,356: ERROR/MainProcess] Task handler raised error: WorkerLostError('Worker exited prematurely: signal 15 (SIGTERM) Job: 1049.')"
若要對上述錯誤訊息進行疑難排解,請查看 CPUUtilization 和 MemoryUtilization 指標。如果指標持續處於高位或出現峰值,則表示您的 Amazon MWAA 工作者超載了。
若要解決工作者超載問題,請執行下列動作:
- 降低 celery.worker_autoscale 值,以減少在工作者上同時執行的任務數量。
- 使用更高層級的 Amazon MWAA 執行個體類別來獲得更多 RAM 和 vCPU。
- 重寫 DAG,將運算工作負載從 Amazon MWAA 卸載到其他運算平台。
相關資訊
Apache Airflow 網站上的最佳做法