Airflow 트리거 문제 해결

Cloud Composer 1 | Cloud Composer 2

이 페이지에서는 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 라이브러리를 사용해야 합니다. Python 코드의 awaitasync 키워드가 잘못 사용되는 등 트리거의 커스텀 구현이 asyncio 계약을 제대로 준수하지 못할 수 있습니다.

    해결책: 경고에 의해 보고된 코드를 검사하고 비동기 작업이 올바르게 구현되었는지 확인합니다.

너무 많은 트리거

지연된 태스크 수는 환경의 Monitoring 대시보드에도 표시되는 task_count 측정항목에 표시됩니다. 각 트리거는 메모리를 사용하는 외부 리소스 연결과 같은 일부 리소스를 만듭니다.

Monitoring 대시보드에 표시되는 지연된 작업
그림 1. Monitoring 대시보드에 표시된 지연된 작업(확대하려면 클릭)

메모리와 CPU 소비의 그래프는 하트비트 누락으로 인해 활성 프로브가 실패하기 때문에 리소스 부족으로 인해 다시 시작됨을 나타냅니다.

리소스 부족으로 인한 트리거 다시 시작
그림 2. 리소스 부족으로 인한 트리거 다시 시작(확대하려면 클릭)

해결책: 이 문제를 해결하려면 트리거에 리소스를 더 할당하고 동시에 실행되는 지연된 태스크 수를 줄이거나 사용자 환경에서 트리거 수를 늘립니다.

콜백 실행 중 Airflow 작업자 비정상 종료

트리거가 실행을 완료하면 컨트롤이 실행 슬롯을 사용하여 콜백 메서드를 실행하는 Airflow 작업자로 돌아갑니다. 이 단계는 Celery Executor에 의해 제어되므로 해당 구성 및 리소스 한도(예: parallelism 또는 worker_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에서 찾아보기 > 트리거 페이지를 확인합니다(Admin 역할 필요).

해결책:

트리거가 사용 중지된 후 태스크가 지연된 상태로 유지

트리거가 사용 중지되면 지연된 상태에 있는 태스크는 제한 시간에 도달할 때까지 이 상태로 유지됩니다. 이 제한 시간은 Airflow와 DAG 구성에 따라 무한할 수 있습니다.

다음 해결 방법 중 하나를 사용하세요.

  • 수동으로 태스크를 실패로 표시합니다.
  • 트리거를 사용 설정하여 태스크를 완료합니다.

환경에서 지연된 연산자나 작업을 실행하지 않고 모든 지연된 태스크가 완료된 경우에만 트리거를 사용 중지하는 것이 좋습니다.

다음 단계