Memecahkan masalah pemicu Airflow

Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3

Halaman ini menyediakan langkah-langkah pemecahan masalah dan informasi untuk masalah umum terkait pemicu Airflow.

Operasi pemblokiran pada pemicu

Tugas asinkron terkadang dapat diblokir di pemicu. Pada umumnya, masalah berasal dari resource pemicu yang tidak memadai atau masalah pada kode operator asinkron kustom.

Log pemicu menampilkan pesan peringatan yang dapat membantu Anda mengidentifikasi penyebab utama penurunan performa pemicu. Ada dua peringatan penting yang harus diperhatikan.

  1. Thread asinkron diblokir

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

    Peringatan ini menandakan masalah terkait performa karena banyaknya tugas asinkron.

    Solusi: Untuk mengatasi masalah ini, alokasikan lebih banyak resource ke pemicu, kurangi jumlah tugas tertunda yang dijalankan pada saat yang sama, atau tingkatkan jumlah pemicu di lingkungan Anda. Perlu diingat bahwa meskipun pemicu menangani tugas yang dapat ditangguhkan, pekerjalah yang bertanggung jawab untuk memulai dan pada akhirnya menyelesaikan setiap tugas. Jika Anda menyesuaikan jumlah pemicu, pertimbangkan juga untuk menskalakan jumlah instance worker.

  2. Tugas tertentu memblokir thread asinkron.

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

    Peringatan ini mengarah ke bagian kode operator tertentu yang dijalankan oleh Cloud Composer. Pemicu berdasarkan desain harus mengandalkan library asyncio untuk menjalankan operasi di latar belakang. Implementasi kustom pemicu dapat gagal mematuhi kontrak asyncio dengan benar (misalnya karena penggunaan kata kunci await dan async yang salah dalam kode Python).

    Solusi: Periksa kode yang dilaporkan oleh peringatan dan periksa apakah operasi asinkron diterapkan dengan benar.

Terlalu banyak pemicu

Jumlah tugas yang ditangguhkan dapat dilihat dalam metrik task_count, yang juga ditampilkan di dasbor Monitoring lingkungan Anda. Setiap pemicu membuat beberapa resource seperti koneksi ke resource eksternal, yang memakai memori.

Tugas yang ditangguhkan ditampilkan di dasbor Monitoring
Gambar 1. Tugas yang ditangguhkan ditampilkan di dasbor Monitoring (klik untuk memperbesar)

Grafik konsumsi memori dan CPU menunjukkan bahwa resource yang tidak mencukupi menyebabkan dimulai ulang karena pemeriksaan keaktifan gagal karena detak jantung yang hilang:

Pemicu memulai ulang karena resource tidak cukup
Gambar 2. Pemicu memulai ulang karena resource tidak memadai (klik untuk memperbesar)

Solusi: Untuk mengatasi masalah ini, alokasikan lebih banyak resource ke pemicu, kurangi jumlah tugas tertunda yang dijalankan pada saat yang sama, atau tingkatkan jumlah pemicu di lingkungan Anda.

Error pekerja Airflow selama eksekusi callback

Setelah pemicu menyelesaikan eksekusi, kontrol akan kembali ke worker Airflow, yang menjalankan metode callback menggunakan slot eksekusi. Fase ini dikontrol oleh Celery Executor dan, oleh karena itu, konfigurasi dan batas resource yang sesuai berlaku (seperti parallelism atau worker_concurrency).

Jika metode callback gagal dalam worker Airflow, worker gagal, atau pekerja yang menjalankan metode akan dimulai ulang, tugas akan ditandai sebagai FAILED. Dalam hal ini, operasi percobaan ulang akan mengeksekusi ulang seluruh tugas, bukan hanya metode callback.

Loop tanpa batas pada pemicu

Anda dapat menerapkan operator pemicu kustom sedemikian rupa sehingga sepenuhnya memblokir loop pemicu utama, sehingga hanya satu pemicu rusak yang dijalankan pada saat itu. Dalam hal ini, peringatan dibuat dalam log pemicu setelah pemicu bermasalah selesai.

Class pemicu tidak ditemukan

Karena folder DAG tidak disinkronkan dengan pemicu Airflow, kode pemicu inline tidak ada saat pemicu dieksekusi. Error ini dibuat di log tugas yang gagal:

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

Solusi: Impor kode yang tidak ada dari PyPI.

Pesan peringatan tentang pemicu di UI Airflow

Dalam beberapa kasus setelah pemicu dinonaktifkan, Anda mungkin melihat pesan peringatan berikut di UI Airflow:

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 dapat menampilkan pesan ini karena pemicu yang tidak lengkap tetap ada di database Airflow. Pesan ini biasanya berarti bahwa pemicu dinonaktifkan sebelum semua pemicu diselesaikan di lingkungan Anda.

Anda dapat melihat semua pemicu yang berjalan di lingkungan dengan memeriksa halaman Browse > Triggers di UI Airflow (peran Admin diperlukan).

Solusi:

Tugas tetap dalam status ditangguhkan setelah pemicu dinonaktifkan

Jika pemicu dinonaktifkan, tugas yang sudah dalam status ditangguhkan akan tetap dalam status ini hingga waktu tunggu tercapai. Waktu tunggu ini tidak terbatas, bergantung pada konfigurasi Airflow dan DAG.

Gunakan salah satu solusi berikut:

  • Tandai tugas secara manual sebagai gagal.
  • Aktifkan pemicu untuk menyelesaikan tugas.

Sebaiknya nonaktifkan pemicu hanya jika lingkungan Anda tidak menjalankan operator atau tugas yang ditangguhkan, dan semua tugas yang ditangguhkan akan diselesaikan.

Langkah selanjutnya