排解 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 執行作業可能會標示為 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 Monitoring 頁面檢查 DAG 解析時間:

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

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

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

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

    Composer 監控分頁中的「DAG runs」部分會顯示環境中 DAG 的健康狀態指標

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

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

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

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

  3. 前往「記錄」分頁,然後從「所有記錄」導覽樹狀結構中選取「DAG 處理器管理工具」部分。

  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 的時間長度值。 如果值很大,可能表示其中一個 DAG 的實作方式不夠理想。從輸出資料表,您可以找出剖析時間較長的 DAG。

排解 DAG 剖析時的問題

以下各節說明 DAG 剖析時發生的一些常見問題,以及可能的修正方式。

執行緒數量有限

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

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

  • 覆寫 parsing_processes 參數

    區段 附註
    scheduler parsing_processes NUMBER_OF_CPUs_IN_SCHEDULER - 1 請將 NUMBER_OF_CPUs_IN_SCHEDULER 改為排程器中的 CPU 數量

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

如要提升 DAG 處理器的效能,可以略過 DAG 資料夾中不必要的檔案。DAG 處理器會忽略 .airflowignore 檔案中指定的檔案和資料夾。

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

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

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

Airflow 處理已暫停的 DAG

Airflow 使用者會暫停 DAG,避免執行 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 的逾時時間:

如果 DAG 未顯示在 Airflow UI 或 DAG UI 中,請按照下列步驟操作:

  • 如果 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 的全域區段中執行這類作業。

  • 增加排程器的 CPU 和記憶體資源,加快運作速度。

  • 調整排程器數量

  • 增加 DAG 處理器程序數量,加快剖析速度。方法是提高 [scheduler]parsing_process 的值。

  • 降低 DAG 剖析頻率

  • 降低 Airflow 資料庫的負載

後續步驟