AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
我該如何對在 Amazon MWAA 環境中,卡在「已排入佇列」狀態的任務問題進行疑難排解?
我正在 Amazon Managed Workflows for Apache Airflow (Amazon MWAA) 中執行工作流程,但我的任務卡在「已排入佇列」狀態。這些任務無法進一步進入「執行中」狀態。
簡短說明
由於以下原因,Amazon MWAA 中的任務可能會卡在已排入佇列狀態:
- 環境已達到並行任務的最大數量。
- MWAA 環境中的 Airflow 組態選項設定不正確。
- 沒有足夠的記憶體或 CPU 來執行工作者上的任務。
當執行任務的正常工作流程發生故障時,任務就會卡在已排入佇列狀態。Apache Airflow 工作者可能會不堪負荷,無法在指定時間內做出回應。發生這種情況時,任務將保留在 Amazon Simple Queue Service (Amazon SQS) 佇列中,直到 12 小時後達到預設可見度逾時。如果您設定了重試,那麼 Apache Airflow 排程器將重試該任務。
解決方法
在進行疑難排解之前,請確定您的環境資源是否已達到最大負載,或是否遇到與工作者相關的問題。使用 Amazon CloudWatch 檢查您環境的工作者日誌以及 CPUUtilization 和 MemoryUtilization 指標。
檢查環境是否達到最大並行任務數
當 Amazon MWAA 集區已滿且環境為佇列添加更多任務時,您的環境將達到最大並行任務數。若要解決此問題,請增加環境中的工作者數量或變更環境類別大小。
若要確定是否必須增加環境中的工作者數量,請完成以下步驟:
- 開啟 CloudWatch console (CloudWatch 主控台)。
- 在導覽窗格中,選擇 Metrics (指標),然後選擇 All Metrics (所有指標)。
- 選擇 Browse (瀏覽) 索引標籤,選取您環境所在的 AWS 區域,然後搜尋您環境的名稱。
- 在 AWS Namespaces (AWS 命名空間) 區段中,選擇 MWAA < Queue (MWAA < 佇列)。
- 選取 QueuedTasks和RunningTasks。
- 在圖表中,找到活動最多的時間段,然後將兩個指標的總數相加。
**注意:**總和是該時間段內的任務總數。 - 確定環境的預設並行等級。
**注意:**例如,mw1.small 環境中每個工作者有 5 個並行任務。 - 將任務總數除以預設並行等級任務數。
- 用該數字減去您為環境設定的最大工作者數量。
**注意:**如果結果為正數,則必須新增工作者來完成目前並行任務的數量。
若要增加環境中的工作者數量或更改環境類別大小,請完成以下步驟:
- 開啟 Amazon MWAA console (Amazon MWAA 主控台)。
- 選取您的環境,選擇 Edit (編輯),然後選擇 Next (下一步)。
- 在 Environment Class (環境類別) 區段中,執行下列動作:
增加您在步驟 9 中確定的最大工作者數量。
另外,將最小工作者數設定為工作負載在活動最少的時間段所需的值。
**注意:**您的環境最多只能新增 25 個工作者。如果您需要超過 25 個工作者,請在 Environment class (環境類別) 下選擇更大的規模。 - 如果增加環境類別大小,則還應設定工作負載所需的最大和最小工作者數量。
如果您最佳化了工作者數量,但仍無法滿足您的工作負載,請執行以下操作:
- 使用可延遲運算子取代 Apache Airflow 感應器。如需詳細資訊,請參閱 Apache Airflow 網站上的可延遲運算子和觸發程序。
- 錯開執行開始時間,並在有向無環圖 (DAG) 的 schedule_interval 之間保持較小的時間間隔。以區塊形式排程 DAG。
- 如果您使用調用和監視特定外部函數的自訂程式碼,請將任務分割為兩個任務。為調用建立一個任務,並建立另一個任務作為可延遲運算子來監視該函數。
檢查 Airflow 組態選項是否設定不正確
若要檢查您的 Airflow 組態選項,請完成以下步驟:
- 開啟 MWAA console (MWAA 主控台)。
- 選擇 Environments (環境),然後選取您的 MWAA 環境。
- 在 Airflow Configuration options (Airflow 組態選項) 區段中,選取 core.parallelism 和 celery.worker_autoscale。
如果設定了 core.parallelism,則移除所有手動設定的 core.parallelism 選項,以便 Amazon MWAA 可以動態設定組態。Amazon MWAA 會透過 (maxWorkers * maxCeleryWorkers) / schedulers * 1.5 計算動態預設組態。如果您使用自動擴展並手動設定值,則在最大負載期間可能會出現使用率不足的問題。
將 celery.worker_autoscale 組態選項的值與預設並行等級進行比較。如果您沒有修改 celery.worker_autoscale 組態選項,請將預設並行等級乘以您為環境設定的最大工作者數量。
如果 celery.worker_autoscale 值不小心設得比預設值還低,請使用 CloudWatch 指標監控工作者的 CPU 和記憶體使用量。如果在最大負載期間資源值為 20% 至 60%,請將 celery.worker_autoscale 的數值增加。使用小的增量,這樣您就不會過度使用工作者容器。
如果您未設定 celery.worker_autoscale 值或保留了預設值,請監控工作者的 CPU 和記憶體使用量。如果您環境的指標太高,請降低 celery.worker_autoscale 值。如果最大負載時環境為 20% 至 60%,則可增加最大值。
檢查工作者是否因過度使用而失敗
當 MWAA 工作者容器上的每個 Celery 工作者都有任務並且處於最大負載時,工作者可能會過度使用並導致失敗。
當 Celery 工作者當下未在 MWAA 工作容器中使用時,會主動輪詢任務。根據正在執行的任務和定義其程式碼的複雜性,工作者可能會過度使用,甚至有可能當機。當 MWAA 工作者容器上的每個 Celery 工作者都有任務並且處於最大負載下時,就會發生這種情況。
若要判斷工作程序是否過度使用並發生故障,請完成以下步驟:
- 開啟 CloudWatch console (CloudWatch 主控台)。
- 在導覽窗格中,選擇 Metrics (指標),然後選擇 All metrics (所有指標)。
- 選擇 Browse (瀏覽) 索引標籤,選取您環境所在的 AWS 區域,然後搜尋您環境的名稱。
- 在 AWS Namespaces (AWS 命名空間) 區段中,選擇 MWAA < Queue (MWAA < 佇列),然後選取 ApproximateAgeOfOldestTask。
- 將時間範圍擴大到 4 至 6 週。
**注意:**40,000 秒或更長的峰值表示任務卡在 Amazon SQS 佇列中,且工作者因過度使用而失敗。此外,Celery 工作者無法將失敗寫入事件緩衝區,因為系統已強制終止其運作。
您也可以使用 CloudWatch Insights ,讓任務卡在 Amazon SQS 佇列時發出警示。
若要建立警示,請完成以下步驟:
-
開啟 CloudWatch console (CloudWatch 主控台)。
-
在導覽窗格中,選擇 Logs (日誌),然後選擇 Logs Insights。
-
指定 4 至 6 週的時間範圍。
-
在 Selection criteria (選取條件) 功能表中,選取適合您 MWAA 環境的排程器日誌群組。
-
在查詢區段中輸入下列查詢:
fields _@timestamp_, _@message_, _@logStream_, _@log_ | filter _@message_ like /Was the task terminated externally?/ | sort _@timestamp_ desc | limit 10000以下是排程器在接收到先前已排入佇列的任務時,傳送的範例日誌:
[[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 terminated externally?[0m
減少運算或記憶體密集型工作負載
**注意:**仔細考慮以下清單。並非所有因素都適用於每種使用案例。如果需要更多協助,請聯絡 AWS Support。
若要減少環境中的運算或記憶體密集型工作負載,請執行以下動作:
- 請確定您的 DAG 程式碼不包含擷取、轉換和載入 (ETL) 指令碼、資料移動指示、AI 或 ML 管道,或其他運算或記憶體密集型工作負載。
- 撰寫 DAG 程式碼時,請遵循 Apache Airflow 最佳實務。請確定頂層程式碼最小化,並且僅匯出所需的程式碼。如需詳細資訊,請參閱 Apache Airflow 網站上的最佳實務。
- 最佳化 DAG 程式碼。對任何感測器、鉤子,或自訂、擴充或繼承的運算子進行記憶體使用分析,以找出可能的問題區域。
如果您的資源仍然過度使用,請採取以下動作:
- 降低 celery.worker_autoscale 的預設值設定。將 celery.worker_autoscale 值減少幾位數,然後監控環境 24-48 小時。繼續降低 celery.worker_autoscale 的值,直到達到最佳水準。
注意:當您降低 celery.worker_autoscale 值時,整體任務集區會縮小,並導致更多項目停留在佇列狀態中更長時間。為了解決這個問題,您還必須增加最低工作者數量。 - 另外,再次完成檢查環境是否達到最大並行任務數區段中的步驟,以減少每個工作者的並行任務數。
相關資訊
針對 Amazon MWAA 上的 Apache Airflow 進行效能調整
Apache Airflow 網站上的組態參考
- 語言
- 中文 (繁體)
