跳至內容

我該如何對在 Amazon MWAA 環境中,卡在「已排入佇列」狀態的任務問題進行疑難排解?

3 分的閱讀內容
0

我正在 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 集區已滿且環境為佇列添加更多任務時,您的環境將達到最大並行任務數。若要解決此問題,請增加環境中的工作者數量或變更環境類別大小。

若要確定是否必須增加環境中的工作者數量,請完成以下步驟:

  1. 開啟 CloudWatch console (CloudWatch 主控台)。
  2. 在導覽窗格中,選擇 Metrics (指標),然後選擇 All Metrics (所有指標)。
  3. 選擇 Browse (瀏覽) 索引標籤,選取您環境所在的 AWS 區域,然後搜尋您環境的名稱。
  4. AWS Namespaces (AWS 命名空間) 區段中,選擇 MWAA < Queue (MWAA < 佇列)。
  5. 選取 QueuedTasksRunningTasks
  6. 在圖表中,找到活動最多的時間段,然後將兩個指標的總數相加。
    **注意:**總和是該時間段內的任務總數。
  7. 確定環境的預設並行等級
    **注意:**例如,mw1.small 環境中每個工作者有 5 個並行任務。
  8. 將任務總數除以預設並行等級任務數。
  9. 用該數字減去您為環境設定的最大工作者數量
    **注意:**如果結果為正數,則必須新增工作者來完成目前並行任務的數量。

若要增加環境中的工作者數量或更改環境類別大小,請完成以下步驟:

  1. 開啟 Amazon MWAA console (Amazon MWAA 主控台)。
  2. 選取您的環境,選擇 Edit (編輯),然後選擇 Next (下一步)。
  3. Environment Class (環境類別) 區段中,執行下列動作:
    增加您在步驟 9 中確定的最大工作者數量
    另外,將最小工作者數設定為工作負載在活動最少的時間段所需的值。
    **注意:**您的環境最多只能新增 25 個工作者。如果您需要超過 25 個工作者,請在 Environment class (環境類別) 下選擇更大的規模。
  4. 如果增加環境類別大小,則還應設定工作負載所需的最大和最小工作者數量。

如果您最佳化了工作者數量,但仍無法滿足您的工作負載,請執行以下操作:

  • 使用可延遲運算子取代 Apache Airflow 感應器。如需詳細資訊,請參閱 Apache Airflow 網站上的可延遲運算子和觸發程序
  • 錯開執行開始時間,並在有向無環圖 (DAG) 的 schedule_interval 之間保持較小的時間間隔。以區塊形式排程 DAG。
  • 如果您使用調用和監視特定外部函數的自訂程式碼,請將任務分割為兩個任務。為調用建立一個任務,並建立另一個任務作為可延遲運算子來監視該函數。

檢查 Airflow 組態選項是否設定不正確

若要檢查您的 Airflow 組態選項,請完成以下步驟:

  1. 開啟 MWAA console (MWAA 主控台)。
  2. 選擇 Environments (環境),然後選取您的 MWAA 環境。
  3. Airflow Configuration options (Airflow 組態選項) 區段中,選取 core.parallelismcelery.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 工作者都有任務並且處於最大負載下時,就會發生這種情況。

若要判斷工作程序是否過度使用並發生故障,請完成以下步驟:

  1. 開啟 CloudWatch console (CloudWatch 主控台)。
  2. 在導覽窗格中,選擇 Metrics (指標),然後選擇 All metrics (所有指標)。
  3. 選擇 Browse (瀏覽) 索引標籤,選取您環境所在的 AWS 區域,然後搜尋您環境的名稱。
  4. AWS Namespaces (AWS 命名空間) 區段中,選擇 MWAA < Queue (MWAA < 佇列),然後選取 ApproximateAgeOfOldestTask
  5. 將時間範圍擴大到 4 至 6 週。
    **注意:**40,000 秒或更長的峰值表示任務卡在 Amazon SQS 佇列中,且工作者因過度使用而失敗。此外,Celery 工作者無法將失敗寫入事件緩衝區,因為系統已強制終止其運作。

您也可以使用 CloudWatch Insights ,讓任務卡在 Amazon SQS 佇列時發出警示。

若要建立警示,請完成以下步驟:

  1. 開啟 CloudWatch console (CloudWatch 主控台)。

  2. 在導覽窗格中,選擇 Logs (日誌),然後選擇 Logs Insights

  3. 指定 4 至 6 週的時間範圍。

  4. Selection criteria (選取條件) 功能表中,選取適合您 MWAA 環境的排程器日誌群組。

  5. 在查詢區段中輸入下列查詢:

    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 網站上的組態參考