排解 Airflow 觸發器問題

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer„�

本頁面提供 Airflow 觸發器常見問題的疑難排解步驟和資訊。

觸發條件中的封鎖作業

非同步工作偶爾可能會在觸發器中遭到封鎖。 在大多數情況下,問題是出在觸發器資源不足,或是自訂非同步運算子程式碼有問題。

觸發器記錄會顯示任何警告訊息,協助您找出觸發器成效下滑的根本原因。請注意以下兩項重大警告。

  1. 非同步執行緒遭到封鎖

    Triggerer's async thread was blocked for 1.2 seconds, likely due to the highly utilized environment.
    

    如果非同步工作量過大,可能會導致效能問題,系統就會發出這項警告。

    解決方案:如要解決這個問題,請為觸發條件分配更多資源、減少同時執行的延後工作數量,或增加環境中的觸發條件數量。請注意,雖然觸發器會處理可延遲的工作,但負責啟動及最終完成每項工作的仍是工作人員。如果調整觸發器數量,也請考慮調整工作站執行個體數量

  2. 特定工作封鎖了非同步執行緒。

    WARNING - Executing <Task finished coro=<TriggerRunner.run_trigger() done, defined at /opt/***/***/jobs/my-custom-code.py:609> result=None> took 0.401 second
    

    這項警告是指 Cloud Composer 執行的特定運算子程式碼。依設計,觸發程序應依賴 asyncio 程式庫在背景執行作業。如果觸發條件的自訂實作方式無法正確遵守 asyncio 合約 (例如,Python 程式碼中 awaitasync 關鍵字的用法不正確),

    解決方案:檢查警告訊息回報的程式碼,確認非同步作業是否已正確導入。

觸發條件過多

您可以在 task_count 指標中查看延後執行的工作數量,環境的 Monitoring 資訊主頁也會顯示這項指標。每個觸發程序都會建立一些資源,例如外部資源的連線,這些資源會耗用記憶體。

Monitoring 資訊主頁顯示延後的任務
圖 1. 監控資訊主頁上顯示的延後工作 (按一下可放大)

記憶體和 CPU 消耗量圖表顯示,資源不足導致重新啟動,因為缺少心跳訊號,存活探查失敗:

資源不足,因此觸發器重新啟動
圖 2. 資源不足導致觸發器重新啟動 (按一下可放大圖片)

解決方法:如要解決這個問題,請為觸發條件分配更多資源、減少同時執行的延後工作數量,或增加環境中的觸發條件數量

回呼執行期間 Airflow 工作站當機

觸發程序執行完畢後,控制項會返回 Airflow 工作人員,後者會使用執行時段執行回呼方法。這個階段由 Celery Executor 控制,因此適用相應的設定和資源限制 (例如 parallelismworker_concurrency)。

如果回呼方法在 Airflow 工作站中失敗、工作站失敗,或執行該方法的工作站重新啟動,工作就會標示為 FAILED。在本例中,重試作業會重新執行整個工作,而不只是回呼方法。

觸發條件中的無限迴圈

您可以實作自訂觸發運算子,完全封鎖主要觸發器迴圈,這樣一次只會執行一個中斷的觸發器。在此情況下,有問題的觸發程序完成後,觸發程序記錄檔中會產生警告

找不到觸發條件類別

由於 DAG 資料夾未與 Airflow 觸發器同步,因此執行觸發程序時,系統會缺少內嵌的觸發程式碼。錯誤會產生在失敗工作的記錄中:

ImportError: Module "PACKAGE_NAME" does not define a "CLASS_NAME" attribute/
class

解決方法從 PyPI 匯入缺少的程式碼

Airflow UI 中有關觸發器的警告訊息

在某些情況下,停用觸發器後,Airflow UI 中可能會顯示下列警告訊息:

The triggerer does not appear to be running. Last heartbeat was received
4 hours ago. Triggers will not run, and any deferred operator will remain
deferred until it times out or fails.

Airflow 資料庫中仍有未完成的觸發程序,因此 Airflow 會顯示這則訊息。這則訊息通常表示觸發器在環境中的所有觸發程序完成前遭到停用。

如要查看環境中執行的所有觸發條件,請在 Airflow UI 中依序前往「Browse」>「Triggers」頁面 (需要 Admin 角色)。

解決方法

停用觸發器後,工作仍會處於延遲狀態

如果停用觸發器,已處於延遲狀態的工作會維持這個狀態,直到逾時為止。視 Airflow 和 DAG 設定而定,這個逾時時間可能無限期。

請使用下列其中一種解決方案:

  • 手動將工作標示為失敗。
  • 啟用觸發者來完成工作。

只有在環境未執行任何延遲運算子或工作,且所有延遲工作都已完成時,才建議停用觸發器。

後續步驟