排解 DAG 處理器問題

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

本頁僅討論與 DAG 檔案處理相關的問題。如要瞭解排程工作的問題,請參閱「排解 Airflow 排程器問題」。

排解工作流程問題

檢查 DAG 處理器記錄檔

如果 DAG 很複雜,DAG 處理器可能無法剖析所有 DAG。這可能會導致許多問題,並出現以下症狀。

症狀:

  • 如果 DAG 處理器在剖析 DAG 時遇到問題,可能會導致以下問題同時發生。如果 DAG 是動態產生的,這些問題可能會比靜態 DAG 更嚴重。

  • Airflow UI 和 DAG UI 中不會顯示 DAG。

  • 未排定執行 DAG。

  • DAG 處理器記錄檔中出現錯誤,例如:

    dag-processor-manager [2023-04-21 21:10:44,510] {manager.py:1144} ERROR -
    Processor for /home/airflow/gcs/dags/dag-example.py with PID 68311 started
    at 2023-04-21T21:09:53.772793+00:00 has timed out, killing it.
    

    dag-processor-manager [2023-04-26 06:18:34,860] {manager.py:948} ERROR -
    Processor for /home/airflow/gcs/dags/dag-example.py exited with return
    code 1.
    
  • DAG 處理器發生問題,導致重新啟動。

  • 已排定執行的 Airflow 工作會取消,且無法剖析的 DAG 的 DAG 執行作業可能會標示為 failed。例如:

    airflow-scheduler Failed to get task '<TaskInstance: dag-example.task1--1
    manual__2023-04-17T10:02:03.137439+00:00 [removed]>' for dag
    'dag-example'. Marking it as removed.
    

解決方法:

  • 增加 DAG 剖析相關參數:

  • 修正或移除會導致 DAG 處理器發生問題的 DAG。

檢查 DAG 剖析時間

如要確認問題是否發生在 DAG 剖析期間,請按照下列步驟操作。

主控台

在 Google Cloud 控制台中,您可以使用「Monitoring」頁面和「Logs」分頁檢查 DAG 剖析時間。

透過 Cloud Composer 監控頁面檢查 DAG 剖析時間:

  1. 前往 Google Cloud 控制台的「Environments」頁面。

    [前往「環境」][console-list-env]

  2. 在環境清單中,按一下環境名稱。系統會開啟「監控」頁面。

  3. 在「監控」分頁中,查看「DAG 執行作業」部分的「剖析所有 DAG 檔案的總時間」圖表,找出可能的問題。

    Composer 監控分頁中的 DAG 執行作業部分會顯示環境中 DAG 的健康指標

使用「Cloud Composer 記錄檔」分頁檢查 DAG 剖析時間:

  1. 前往 Google Cloud 控制台的「Environments」頁面。

    [前往「環境」][console-list-env]

  2. 在環境清單中,按一下環境名稱。系統會開啟「監控」頁面。

  3. 前往「Logs」分頁,然後從「All Logs」導覽樹狀圖中選取「DAG processor manager」部分。

  4. 查看 dag-processor-manager 記錄,找出可能的問題。

    DAG 處理器記錄會顯示 DAG 剖析時間

gcloud

使用 dags report 指令查看所有 DAG 的剖析時間。

gcloud composer environments run ENVIRONMENT_NAME \
    --location LOCATION \
    dags report

取代:

  • ENVIRONMENT_NAME 替換為環境的名稱。
  • LOCATION 改成環境所在的地區。

指令輸出結果類似以下格式:

Executing within the following Kubernetes cluster namespace: composer-2-0-31-airflow-2-3-3
file                  | duration       | dag_num | task_num | dags
======================+================+=========+==========+===================
/manydagsbig.py       | 0:00:00.038334 | 2       | 10       | serial-0,serial-0
/airflow_monitoring.py| 0:00:00.001620 | 1       | 1        | airflow_monitoring

查看表格中列出的每個 DAG 的 duration 值。如果值偏高,可能表示某個 DAG 並未以最佳方式實作。您可以從輸出表格中找出哪些 DAG 的剖析時間過長。

排解 DAG 剖析期間的問題

以下各節說明 DAG 剖析期間的常見問題及其可能的修正方式。

執行緒數量有限

如果允許 DAG 處理器管理員只使用有限數量的執行緒,可能會影響 DAG 剖析時間。

如要解決這個問題,請覆寫下列 Airflow 設定選項:

  • 覆寫 parsing_processes 參數

    區段 附註
    scheduler parsing_processes NUMBER_OF_CPUs_IN_DAG_PROCESSOR - 1 NUMBER_OF_CPUs_IN_DAG_PROCESSOR 替換為 DAG 處理器中的 CPU 數量

讓 DAG 處理器忽略不必要的檔案

您可以略過 DAG 資料夾中的不必要檔案,藉此改善 DAG 處理器的效能。DAG 處理器會忽略 .airflowignore 檔案中指定的檔案和資料夾。

如要讓 DAG 處理器忽略不必要的檔案,請按照下列步驟操作:

  1. 建立 .airflowignore 檔案。
  2. 在這個檔案中,列出應忽略的檔案和資料夾。
  3. 將這個檔案上傳至環境值區中的 /dags 資料夾。

如要進一步瞭解 .airflowignore 檔案格式,請參閱 Airflow 說明文件

Airflow 處理暫停的 DAG

Airflow 使用者會暫停 DAG 以避免執行。這樣可節省 Airflow 工作站的處理週期。

Airflow 會繼續剖析已暫停的 DAG。如果您真的想改善 DAG 處理器的效能,請使用 .airflowignore,或從 DAG 資料夾中刪除已暫停的 DAG。

一般問題

以下各節說明一些常見剖析問題的徵兆和可能修正方式。

DAG 負載匯入逾時

症狀:

  • 在 Airflow 網頁介面中,DAG 清單頁面頂端有一個紅色警示方塊顯示 Broken DAG: [/path/to/dagfile] Timeout
  • 在 Cloud Monitoring 中:airflow-scheduler 記錄檔包含類似以下的項目:

    • ERROR - Process timed out
    • ERROR - Failed to import: /path/to/dagfile
    • AirflowTaskTimeout: Timeout

修正方式:

覆寫 dag_file_processor_timeout Airflow 設定選項,並給予系統更多時間進行 DAG 剖析:

區段
core dag_file_processor_timeout 新逾時值

Airflow UI 或 DAG UI 中未顯示 DAG,且排程器未排定 DAG

DAG 處理器會剖析各個 DAG,接著排程器才能為 DAG 排程,並在 DAG 顯示在 Airflow UIDAG UI 中。

下列 Airflow 設定選項會定義 DAG 剖析的逾時值:

如果無法在 Airflow UI 或 DAG UI 中查看 DAG,請按照下列步驟操作:

  • 檢查 DAG 處理器記錄,確認 DAG 處理器是否能正確處理 DAG。如果發生問題,您可能會在 DAG 處理器或排程器記錄中看到下列記錄項目:

    [2020-12-03 03:06:45,672] {dag_processing.py:1334} ERROR - Processor for
    /usr/local/airflow/dags/example_dag.py with PID 21903 started at
    2020-12-03T03:05:55.442709+00:00 has timed out, killing it.
    
  • 檢查排程器記錄檔,確認排程器是否正常運作。發生問題時,您可能會在排程器記錄中看到下列記錄項目:

    DagFileProcessorManager (PID=732) last sent a heartbeat 240.09 seconds ago! Restarting it
    Process timed out, PID: 68496
    

解決方法

  • 修正所有 DAG 剖析錯誤。DAG 處理器會剖析多個 DAG,在少數情況下,一個 DAG 的剖析錯誤可能會對其他 DAG 的剖析作業造成負面影響。

  • 如果 DAG 的剖析時間超過 [core]dagbag_import_timeout 中定義的秒數,請增加這個逾時時間。

  • 如果剖析所有 DAG 的時間超過 [core]dag_file_processor_timeout 中定義的秒數,請增加這個逾時時間。

  • 如果 DAG 需要花費很長的時間進行剖析,也可能表示並未以最佳方式實作。例如,如果讀取許多環境變數,或執行對外部服務或 Airflow 資料庫的呼叫。請盡可能避免在 DAG 的全球性區段中執行這類作業。

  • 增加 DAG 處理器的 CPU 和記憶體資源,以便加快處理速度。

  • 降低 DAG 剖析頻率

  • 降低 Airflow 資料庫的負載

後續步驟