Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3
Halaman ini memberikan langkah-langkah pemecahan masalah dan informasi untuk masalah alur kerja umum.
Banyak masalah eksekusi DAG disebabkan oleh performa lingkungan yang tidak optimal. Anda dapat mengoptimalkan lingkungan dengan mengikuti panduan Mengoptimalkan performa dan biaya lingkungan.
Beberapa masalah eksekusi DAG mungkin disebabkan oleh penjadwal Airflow yang tidak berfungsi dengan benar atau optimal. Ikuti petunjuk pemecahan masalah Penjadwal untuk menyelesaikan masalah ini.
Memecahkan masalah alur kerja
Untuk memulai pemecahan masalah:
Periksa log Airflow.
Anda dapat meningkatkan tingkat logging Airflow dengan mengganti opsi konfigurasi Airflow berikut.
Bagian Kunci Nilai logging
logging_level
Nilai defaultnya adalah INFO
. Tetapkan keDEBUG
untuk mendapatkan lebih banyak informasi dalam pesan log.Periksa Dasbor Monitoring.
Tinjau Cloud Monitoring.
Di konsol Google Cloud, periksa error di halaman untuk komponen lingkungan Anda.
Di antarmuka web Airflow, periksa Tampilan Grafik DAG untuk instance tugas yang gagal.
Bagian Kunci Nilai webserver
dag_orientation
LR
,TB
,RL
, atauBT
Men-debug kegagalan operator
Untuk men-debug kegagalan operator:
- Periksa error khusus tugas.
- Periksa log Airflow.
- Tinjau Cloud Monitoring.
- Periksa log khusus operator.
- Perbaiki error.
- Upload DAG ke folder
/dags
. - Di antarmuka web Airflow, hapus status sebelumnya untuk DAG.
- Lanjutkan atau jalankan DAG.
Memecahkan masalah eksekusi tugas
Airflow adalah sistem terdistribusi dengan banyak entitas seperti penjadwal, eksekutor, pekerja yang berkomunikasi satu sama lain melalui antrean tugas dan database Airflow serta mengirim sinyal (seperti SIGTERM). Diagram berikut menunjukkan ringkasan interkoneksi antara komponen Airflow.
Dalam sistem terdistribusi seperti Airflow, mungkin ada beberapa masalah konektivitas jaringan, atau infrastruktur yang mendasarinya mungkin mengalami masalah yang terputus-putus; hal ini dapat menyebabkan situasi saat tugas dapat gagal dan dijadwalkan ulang untuk dieksekusi, atau tugas mungkin tidak berhasil diselesaikan (misalnya, tugas Zombie, atau tugas yang macet dalam eksekusi). Airflow memiliki mekanisme untuk menangani situasi tersebut dan melanjutkan fungsi normal secara otomatis. Bagian berikut menjelaskan masalah umum yang terjadi selama eksekusi tugas oleh Airflow: Tugas zombie, Poison Pills, dan sinyal SIGTERM.
Memecahkan masalah tugas Zombie
Airflow mendeteksi dua jenis ketidakcocokan antara tugas dan proses yang menjalankan tugas:
Tugas zombie adalah tugas yang seharusnya berjalan, tetapi tidak berjalan. Hal ini dapat terjadi jika proses tugas dihentikan atau tidak merespons, jika pekerja Airflow tidak melaporkan status tugas tepat waktu karena kelebihan beban, atau jika VM tempat tugas dieksekusi dimatikan. Airflow menemukan tugas tersebut secara berkala, dan gagal atau mencoba ulang tugas, bergantung pada setelan tugas.
Menemukan tugas zombie
resource.type="cloud_composer_environment" resource.labels.environment_name="ENVIRONMENT_NAME" log_id("airflow-scheduler") textPayload:"Detected zombie job"
Tugas yang tidak mati adalah tugas yang tidak seharusnya berjalan. Airflow menemukan tugas tersebut secara berkala dan menghentikannya.
Bagian berikut menjelaskan alasan dan solusi paling umum untuk tugas Zombie.
Pekerja Airflow kehabisan memori
Setiap pekerja Airflow dapat menjalankan hingga [celery]worker_concurrency
instance tugas
secara bersamaan. Jika konsumsi memori kumulatif dari instance tugas tersebut melebihi batas memori untuk pekerja Airflow, proses acak di dalamnya akan dihentikan untuk mengosongkan resource.
Terkadang, kekurangan memori pada pekerja Airflow dapat menyebabkan paket yang salah format dikirim selama sesi SQL Alchemy ke database, ke server DNS, atau ke layanan lain yang dipanggil oleh DAG. Dalam hal ini, ujung lain koneksi mungkin menolak atau membatalkan koneksi dari pekerja Airflow. Contoh:
"UNKNOWN:Error received from peer
{created_time:"2024-11-31T10:09:52.217738071+00:00", grpc_status:14,
grpc_message:"failed to connect to all addresses; last error: UNKNOWN:
ipv4:<ip address>:443: handshaker shutdown"}"
Menemukan peristiwa kehabisan memori pekerja Airflow
resource.type="k8s_node" resource.labels.cluster_name="GKE_CLUSTER_NAME" log_id("events") jsonPayload.message:"Killed process" jsonPayload.message:("airflow task" OR "celeryd")
Solusi:
Optimalkan tugas agar menggunakan lebih sedikit memori, misalnya, dengan menghindari kode tingkat atas.
Turunkan
[celery]worker_concurrency
.Meningkatkan memori untuk pekerja Airflow untuk menampung perubahan
[celery]worker_concurrency
.Di Cloud Composer 2 versi sebelum 2.6.0, update
[celery]worker_concurrency
menggunakan formula saat ini jika nilai ini lebih rendah.
Pekerja Airflow dikeluarkan
Penghapusan pod adalah bagian yang normal saat menjalankan workload di Kubernetes. GKE mengeluarkan pod jika kehabisan penyimpanan atau untuk mengosongkan resource untuk workload dengan prioritas yang lebih tinggi.
Menemukan penghapusan pekerja Airflow
resource.type="k8s_pod" resource.labels.cluster_name="GKE_CLUSTER_NAME" resource.labels.pod_name:"airflow-worker" log_id("events") jsonPayload.reason="Evicted"
Solusi:
- Jika penghapusan disebabkan oleh kurangnya penyimpanan, Anda dapat mengurangi penggunaan
penyimpanan atau menghapus file sementara segera setelah tidak diperlukan.
Sebagai alternatif, Anda dapat
meningkatkan penyimpanan yang tersedia atau menjalankan
workload di pod khusus dengan
KubernetesPodOperator
.
Pekerja alur data dihentikan
Pekerja Airflow mungkin dihapus secara eksternal. Jika tugas yang sedang berjalan tidak selesai selama periode penghentian yang wajar, tugas tersebut akan terganggu dan mungkin akhirnya terdeteksi sebagai zombie.
Menemukan penghentian pod pekerja Airflow
resource.type="k8s_cluster" resource.labels.cluster_name="GKE_CLUSTER_NAME" protoPayload.methodName:"pods.delete" protoPayload.response.metadata.name:"airflow-worker"
Kemungkinan skenario dan solusi:
Worker Airflow dimulai ulang selama modifikasi lingkungan, seperti upgrade atau penginstalan paket:
Menemukan modifikasi lingkungan Composer
resource.type="cloud_composer_environment" resource.labels.environment_name="ENVIRONMENT_NAME" log_id("cloudaudit.googleapis.com%2Factivity")
Anda dapat melakukan operasi tersebut saat tidak ada tugas penting yang berjalan atau mengaktifkan percobaan ulang tugas.
Berbagai komponen mungkin tidak tersedia untuk sementara selama operasi pemeliharaan.
Mempelajari operasi pemeliharaan GKE
resource.type="gke_nodepool" resource.labels.cluster_name="GKE_CLUSTER_NAME" protoPayload.metadata.operationType="UPGRADE_NODES"
Anda dapat menentukan masa pemeliharaan untuk meminimalkan
tumpang-tindih dengan eksekusi tugas penting.
Di Cloud Composer 2 versi sebelum 2.4.5, pekerja Airflow yang dihentikan mungkin mengabaikan sinyal SIGTERM dan terus menjalankan tugas:
Mempelajari penskalaan ke bawah dengan penskalaan otomatis Composer
resource.type="cloud_composer_environment" resource.labels.environment_name="ENVIRONMENT_NAME" log_id("airflow-worker-set") textPayload:"Workers deleted"
Anda dapat mengupgrade ke versi Cloud Composer yang lebih baru tempat masalah ini diperbaiki.
Pekerja Airflow mengalami beban berat
Jumlah resource CPU dan memori yang tersedia untuk pekerja Airflow dibatasi oleh konfigurasi lingkungan. Jika penggunaan resource mendekati batas, hal ini dapat menyebabkan pertentangan resource dan penundaan yang tidak perlu selama eksekusi tugas. Dalam situasi ekstrem, jika resource tidak tersedia selama jangka waktu yang lebih lama, hal ini dapat menyebabkan tugas zombie.
Solusi:
- Pantau penggunaan CPU dan memori pekerja, lalu sesuaikan agar tidak melebihi 80%.
Database Airflow mengalami beban berat
Database digunakan oleh berbagai komponen Airflow untuk berkomunikasi satu sama lain dan, khususnya, untuk menyimpan heartbeat instance tugas. Kekurangan resource di database menyebabkan waktu kueri yang lebih lama dan dapat memengaruhi eksekusi tugas.
Terkadang, error berikut muncul di log pekerja Airflow:
(psycopg2.OperationalError) connection to server at <IP address>,
port 3306 failed: server closed the connection unexpectedly
This probably means the server terminated abnormally before or while
processing the request.
Solusi:
- Hindari penggunaan banyak petunjuk
Variables.get
dalam kode DAG tingkat teratas Anda. Sebagai gantinya, gunakan template Jinja untuk mengambil nilai variabel Airflow. - Optimalkan (kurangi) penggunaan petunjuk xcom_push dan xcom_pull di Template Jinja dalam kode DAG tingkat atas.
- Pertimbangkan untuk mengupgrade ke ukuran lingkungan yang lebih besar (Sedang atau Besar).
- Menurunkan jumlah penjadwal
- Menurunkan frekuensi penguraian DAG.
- Memantau penggunaan CPU dan memori database.
Database Airflow tidak tersedia untuk sementara
Pekerja Airflow mungkin memerlukan waktu untuk mendeteksi dan menangani error terputus-putus dengan baik, seperti masalah konektivitas sementara. Hal ini mungkin melebihi batas deteksi zombie default.
Menemukan waktu tunggu heartbeat Airflow
resource.type="cloud_composer_environment" resource.labels.environment_name="ENVIRONMENT_NAME" log_id("airflow-worker") textPayload:"Heartbeat time limit exceeded"
Solusi:
Tingkatkan waktu tunggu untuk tugas zombie dan ganti nilai opsi konfigurasi Airflow
[scheduler]scheduler_zombie_task_threshold
:Bagian Kunci Nilai Catatan scheduler
scheduler_zombie_task_threshold
Waktu tunggu baru (dalam detik) Nilai defaultnya adalah 300
Memecahkan Masalah Poison Pill
Poison Pill adalah mekanisme yang digunakan oleh Airflow untuk menonaktifkan tugas Airflow.
Airflow menggunakan Poison Pill dalam situasi berikut:
- Saat penjadwal menghentikan tugas yang tidak selesai tepat waktu.
- Saat tugas habis waktu tunggunya atau dieksekusi terlalu lama.
Saat Airflow menggunakan Poison Pill, Anda dapat melihat entri log berikut dalam log pekerja Airflow yang menjalankan tugas:
INFO - Subtask ... WARNING - State of this instance has been externally set
to success. Taking the poison pill.
INFO - Subtask ... INFO - Sending Signals.SIGTERM to GPID <X>
INFO - Subtask ... ERROR - Received SIGTERM. Terminating subprocesses.
Kemungkinan solusi:
Periksa kode tugas untuk menemukan error yang mungkin menyebabkannya berjalan terlalu lama.
Tingkatkan CPU dan memori untuk pekerja Airflow, sehingga tugas dieksekusi lebih cepat.
Tingkatkan nilai opsi konfigurasi Airflow
[celery_broker_transport_options]visibility-timeout
.Akibatnya, penjadwal menunggu lebih lama hingga tugas selesai, sebelum menganggap tugas tersebut sebagai tugas Zombie. Opsi ini sangat berguna untuk tugas yang memakan waktu berjam-jam. Jika nilainya terlalu rendah (misalnya, 3 jam), penjadwal akan menganggap tugas yang berjalan selama 5 atau 6 jam sebagai "macet" (tugas Zombie).
Tingkatkan nilai opsi konfigurasi Airflow
[core]killed_task_cleanup_time
.Nilai yang lebih lama memberi pekerja Airflow lebih banyak waktu untuk menyelesaikan tugas mereka dengan baik. Jika nilainya terlalu rendah, tugas Airflow mungkin terganggu secara tiba-tiba, tanpa cukup waktu untuk menyelesaikan tugasnya dengan baik.
Memecahkan masalah sinyal SIGTERM
Sinyal SIGTERM digunakan oleh Linux, Kubernetes, penjadwal Airflow, dan Celery untuk menghentikan proses yang bertanggung jawab untuk menjalankan pekerja Airflow atau tugas Airflow.
Mungkin ada beberapa alasan mengapa sinyal SIGTERM dikirim di lingkungan:
Tugas menjadi tugas Zombie dan harus dihentikan.
Penjadwal menemukan duplikat tugas dan mengirimkan sinyal Poison Pill dan SIGTERM ke tugas untuk menghentikannya.
Dalam Penskalaan Otomatis Pod Horizontal, Platform Kontrol GKE mengirim sinyal SIGTERM untuk menghapus Pod yang tidak lagi diperlukan.
Penjadwal dapat mengirim sinyal SIGTERM ke proses DagFileProcessorManager. Sinyal SIGTERM tersebut digunakan oleh Penjadwal untuk mengelola siklus proses DagFileProcessorManager dan dapat diabaikan dengan aman.
Contoh:
Launched DagFileProcessorManager with pid: 353002 Sending Signals.SIGTERM to group 353002. PIDs of all processes in the group: [] Sending the signal Signals.SIGTERM to group 353002 Sending the signal Signals.SIGTERM to process 353002 as process group is missing.
Kondisi perlombaan antara callback heartbeat dan callback keluar di local_task_job, yang memantau eksekusi tugas. Jika heartbeat mendeteksi bahwa tugas ditandai sebagai berhasil, heartbeat tidak dapat membedakan apakah tugas itu sendiri berhasil atau Airflow diberi tahu untuk menganggap tugas berhasil. Meskipun demikian, tindakan ini akan menghentikan runner tugas, tanpa menunggu tugas keluar.
Sinyal SIGTERM tersebut dapat diabaikan dengan aman. Tugas sudah dalam status berhasil dan eksekusi DAG yang berjalan secara keseluruhan tidak akan dipengaruhi.
Entri log
Received SIGTERM.
adalah satu-satunya perbedaan antara keluar reguler dan penghentian tugas dalam status berhasil.Komponen Airflow menggunakan lebih banyak resource (CPU, memori) daripada yang diizinkan oleh node cluster.
Layanan GKE melakukan operasi pemeliharaan dan mengirim sinyal SIGTERM ke Pod yang berjalan di node yang akan diupgrade.
Saat instance tugas dihentikan dengan SIGTERM, Anda dapat melihat entri log berikut dalam log pekerja Airflow yang menjalankan tugas:
{local_task_job.py:211} WARNING - State of this instance has been externally set to queued. Terminating instance. {taskinstance.py:1411} ERROR - Received SIGTERM. Terminating subprocesses. {taskinstance.py:1703} ERROR - Task failed with exception
Kemungkinan solusi:
Masalah ini terjadi saat VM yang menjalankan tugas kehabisan memori. Hal ini tidak terkait dengan konfigurasi Airflow, tetapi dengan jumlah memori yang tersedia untuk VM.
Di Cloud Composer 2, Anda dapat menetapkan lebih banyak resource CPU dan memori ke pekerja Airflow.
Anda dapat menurunkan nilai opsi konfigurasi Airflow serentak
[celery]worker_concurrency
. Opsi ini menentukan jumlah tugas yang dijalankan secara serentak oleh pekerja Airflow tertentu.
Untuk mengetahui informasi selengkapnya tentang cara mengoptimalkan lingkungan, lihat Mengoptimalkan performa dan biaya lingkungan.
Kueri Cloud Logging untuk menemukan alasan dimulai ulang atau dihapusnya Pod
Lingkungan Cloud Composer menggunakan cluster GKE sebagai lapisan infrastruktur komputasi. Di bagian ini, Anda dapat menemukan kueri berguna yang dapat membantu menemukan alasan pekerja Airflow atau penjadwal Airflow dimulai ulang atau dihapus.
Kueri yang ditampilkan lebih lanjut dapat disesuaikan dengan cara berikut:
Anda dapat menentukan linimasa yang diperlukan di Cloud Logging. Misalnya, 6 jam terakhir, 3 hari, atau Anda dapat menentukan rentang waktu kustom.
Anda harus menentukan nama cluster lingkungan di CLUSTER_NAME.
Anda dapat membatasi penelusuran ke Pod tertentu dengan menambahkan POD_NAME.
Menemukan penampung yang dimulai ulang
resource.type="k8s_node" log_id("kubelet") jsonPayload.MESSAGE:"will be restarted" resource.labels.cluster_name="CLUSTER_NAME"
Kueri alternatif untuk membatasi hasil ke Pod tertentu:
resource.type="k8s_node" log_id("kubelet") jsonPayload.MESSAGE:"will be restarted" resource.labels.cluster_name="CLUSTER_NAME" "POD_NAME"
Menemukan penonaktifan penampung sebagai akibat dari peristiwa Kehabisan Memori
resource.type="k8s_node" log_id("events") (jsonPayload.reason:("OOMKilling" OR "SystemOOM") OR jsonPayload.message:("OOM encountered" OR "out of memory")) severity=WARNING resource.labels.cluster_name="CLUSTER_NAME"
Kueri alternatif untuk membatasi hasil ke Pod tertentu:
resource.type="k8s_node" log_id("events") (jsonPayload.reason:("OOMKilling" OR "SystemOOM") OR jsonPayload.message:("OOM encountered" OR "out of memory")) severity=WARNING resource.labels.cluster_name="CLUSTER_NAME" "POD_NAME"
Menemukan penampung yang berhenti dieksekusi
resource.type="k8s_node" log_id("kubelet") jsonPayload.MESSAGE:"ContainerDied" severity=DEFAULT resource.labels.cluster_name="CLUSTER_NAME"
Kueri alternatif untuk membatasi hasil ke Pod tertentu:
resource.type="k8s_node" log_id("kubelet") jsonPayload.MESSAGE:"ContainerDied" severity=DEFAULT resource.labels.cluster_name="CLUSTER_NAME" "POD_NAME"
Dampak operasi update atau upgrade pada eksekusi tugas Airflow
Operasi update atau upgrade akan mengganggu tugas Airflow yang sedang dijalankan, kecuali jika tugas dijalankan dalam mode yang dapat ditangguhkan.
Sebaiknya lakukan operasi ini jika Anda mengharapkan dampak minimal pada eksekusi tugas Airflow dan siapkan mekanisme percobaan ulang yang sesuai di DAG dan tugas Anda.
Masalah umum
Bagian berikut menjelaskan gejala dan kemungkinan perbaikan untuk beberapa masalah DAG umum.
Tugas Airflow terganggu oleh Negsignal.SIGKILL
Terkadang, tugas Anda mungkin menggunakan lebih banyak memori daripada yang dialokasikan pekerja Airflow.
Dalam situasi seperti itu, proses tersebut mungkin terganggu oleh Negsignal.SIGKILL
. Sistem
mengirim sinyal ini untuk menghindari penggunaan memori lebih lanjut yang dapat memengaruhi
eksekusi tugas Airflow lainnya. Di log pekerja Airflow, Anda mungkin melihat
entri log berikut:
{local_task_job.py:102} INFO - Task exited with return code Negsignal.SIGKILL
Negsignal.SIGKILL
juga dapat muncul sebagai kode -9
.
Kemungkinan solusi:
worker_concurrency
pekerja Airflow yang lebih rendah.Meningkatkan jumlah memori yang tersedia untuk pekerja Airflow.
Kelola tugas yang membutuhkan banyak resource di Cloud Composer menggunakan KubernetesPodOperator atau GKEStartPodOperator untuk isolasi tugas dan alokasi resource yang disesuaikan.
Optimalkan tugas Anda agar menggunakan lebih sedikit memori.
Tugas gagal tanpa menampilkan log karena error penguraian DAG
Terkadang mungkin ada error DAG yang halus yang menyebabkan situasi saat
penjadwal Airflow dapat menjadwalkan tugas untuk dieksekusi, pemroses DAG dapat
menguraikan file DAG, tetapi pekerja Airflow gagal menjalankan tugas
dari DAG karena ada error pemrograman dalam file DAG. Hal ini dapat
menyebabkan situasi saat tugas Airflow ditandai sebagai Failed
dan tidak ada
log dari eksekusinya.
Solusi:
Verifikasi di log pekerja Airflow bahwa tidak ada error yang ditampilkan oleh pekerja Airflow yang terkait dengan DAG yang hilang atau error penguraian DAG.
Meningkatkan parameter yang terkait dengan penguraian DAG:
Tingkatkan dagbag-import-timeout setidaknya 120 detik (atau lebih, jika diperlukan).
Tingkatkan dag-file-processor-timeout menjadi minimal 180 detik (atau lebih, jika diperlukan). Nilai ini harus lebih tinggi dari
dagbag-import-timeout
.
Lihat juga Memeriksa log Pemroses DAG.
Tugas gagal tanpa menampilkan log karena tekanan resource
Gejala: selama eksekusi tugas, subproses pekerja Airflow yang bertanggung jawab untuk eksekusi tugas Airflow terputus secara tiba-tiba. Error yang terlihat di log pekerja Airflow mungkin terlihat mirip dengan yang di bawah ini:
...
File "/opt/python3.8/lib/python3.8/site-packages/celery/app/trace.py", line 412, in trace_task R = retval = fun(*args, **kwargs) File "/opt/python3.8/lib/python3.8/site-packages/celery/app/trace.py", line 704, in __protected_call__ return self.run(*args, **kwargs) File "/opt/python3.8/lib/python3.8/site-packages/airflow/executors/celery_executor.py", line 88, in execute_command _execute_in_fork(command_to_exec) File "/opt/python3.8/lib/python3.8/site-packages/airflow/executors/celery_executor.py", line 99, in _execute_in_fork
raise AirflowException('Celery command failed on host: ' + get_hostname())airflow.exceptions.AirflowException: Celery command failed on host: airflow-worker-9qg9x
...
Solusi:
Di Cloud Composer 2, tingkatkan batas memori untuk pekerja Airflow.
Jika lingkungan Anda juga menghasilkan tugas zombie, lihat Memecahkan masalah Tugas zombie.
Untuk tutorial tentang cara men-debug masalah kehabisan memori, lihat Men-debug masalah kehabisan memori dan kehabisan penyimpanan DAG.
Tugas gagal tanpa menampilkan log karena penghapusan Pod
Pod Google Kubernetes Engine tunduk pada Siklus Proses Pod Kubernetes dan pengusiran Pod. Lonjakan tugas adalah penyebab paling umum untuk penghapusan Pod di Cloud Composer.
Penghapusan Pod dapat terjadi saat Pod tertentu menggunakan resource node secara berlebihan, secara relatif terhadap ekspektasi penggunaan resource yang dikonfigurasi untuk node. Misalnya, pengusiran dapat terjadi saat beberapa tugas yang membutuhkan banyak memori berjalan di Pod, dan beban gabungannya menyebabkan node tempat Pod ini berjalan melebihi batas konsumsi memori.
Jika Pod pekerja Airflow dihapus, semua instance tugas yang berjalan di Pod tersebut akan terganggu, dan kemudian ditandai sebagai gagal oleh Airflow.
Log dibuffer. Jika Pod pekerja dihapus sebelum buffering dihapus, log tidak akan ditampilkan. Kegagalan tugas tanpa log adalah indikasi bahwa pekerja Airflow dimulai ulang karena kehabisan memori (OOM). Beberapa log mungkin ada di Cloud Logging meskipun log Airflow tidak ditampilkan.
Untuk melihat log:
Di konsol Google Cloud, buka halaman Environments.
Di daftar lingkungan, klik nama lingkungan Anda. Halaman Environment details akan terbuka.
Buka tab Logs.
Lihat log setiap pekerja Airflow di bagian Semua log > Log Airflow > Pekerja.
Gejala:
Di konsol Google Cloud, buka halaman Workloads.
Jika ada
airflow-worker
Pod yang menampilkanEvicted
, klik setiap pod yang dihapus dan cari pesanThe node was low on resource: memory
di bagian atas jendela.
Solusi:
Meningkatkan batas memori untuk pekerja Airflow.
Periksa log dari pod
airflow-worker
untuk mengetahui kemungkinan penyebab penghapusan. Untuk mengetahui informasi selengkapnya tentang mengambil log dari setiap Pod, lihat Memecahkan masalah terkait workload yang di-deploy.Pastikan tugas dalam DAG bersifat idempoten dan dapat dicoba ulang.
Hindari mendownload file yang tidak perlu ke sistem file lokal pekerja Airflow.
Pekerja Airflow memiliki kapasitas sistem file lokal yang terbatas. Pekerja Airflow dapat memiliki penyimpanan dari 1 GB hingga 10 GB. Saat ruang penyimpanan habis, Pod pekerja Airflow akan dihapus oleh Bidang Kontrol GKE. Tindakan ini akan membuat semua tugas yang dijalankan pekerja yang dikeluarkan gagal.
Contoh operasi yang bermasalah:
- Mendownload file atau objek dan menyimpannya secara lokal di pekerja Airflow. Sebagai gantinya, simpan objek ini langsung di layanan yang sesuai seperti bucket Cloud Storage.
- Mengakses objek besar di folder
/data
dari pekerja Airflow. Pekerja Airflow mendownload objek ke sistem file lokalnya. Sebagai gantinya, terapkan DAG Anda sehingga file besar diproses di luar Pod pekerja Airflow.
Waktu tunggu impor pemuatan DAG habis
Gejala:
- Di antarmuka web Airflow, di bagian atas halaman daftar DAG, kotak pemberitahuan
merah akan menampilkan
Broken DAG: [/path/to/dagfile] Timeout
. Di Cloud Monitoring: Log
airflow-scheduler
berisi entri yang mirip dengan:ERROR - Process timed out
ERROR - Failed to import: /path/to/dagfile
AirflowTaskTimeout: Timeout
Perbaikan:
Ganti opsi konfigurasi Airflow
dag_file_processor_timeout
dan berikan lebih banyak waktu untuk penguraian DAG:
Bagian | Kunci | Nilai |
---|---|---|
core |
dag_file_processor_timeout |
Nilai waktu tunggu baru |
Eksekusi DAG tidak berakhir dalam waktu yang diharapkan
Gejala:
Terkadang, operasi DAG tidak berakhir karena tugas Airflow macet dan operasi DAG berlangsung lebih lama dari yang diharapkan. Dalam kondisi normal, tugas Airflow tidak akan terus-menerus berada dalam status antrean atau berjalan, karena Airflow memiliki prosedur waktu tunggu dan pembersihan yang membantu menghindari situasi ini.
Perbaikan:
Gunakan parameter
dagrun_timeout
untuk DAG. Misalnya:dagrun_timeout=timedelta(minutes=120)
Akibatnya, setiap operasi jalankan DAG harus selesai dalam waktu tunggu operasi jalankan DAG. Tugas yang belum selesai ditandai sebagaiFailed
atauUpstream Failed
. Untuk informasi selengkapnya tentang status tugas Airflow, lihat dokumentasi Apache Airflow.Gunakan parameter task execution timeout untuk menentukan waktu tunggu default bagi tugas yang berjalan berdasarkan operator Apache Airflow.
Operasi DAG tidak dieksekusi
Gejala:
Jika tanggal jadwal untuk DAG ditetapkan secara dinamis, hal ini dapat menyebabkan berbagai efek samping yang tidak terduga. Contoh:
Eksekusi DAG selalu di masa mendatang, dan DAG tidak pernah dieksekusi.
Operasi DAG sebelumnya ditandai sebagai dieksekusi dan berhasil meskipun tidak dieksekusi.
Informasi selengkapnya tersedia di dokumentasi Apache Airflow.
Kemungkinan solusi:
Ikuti rekomendasi dalam dokumentasi Apache Airflow.
Menetapkan
start_date
statis untuk DAG. Sebagai opsi, Anda dapat menggunakancatchup=False
untuk menonaktifkan DAG yang berjalan untuk tanggal sebelumnya.Hindari penggunaan
datetime.now()
ataudays_ago(<number of days>)
kecuali jika Anda mengetahui efek samping dari pendekatan ini.
Peningkatan traffic jaringan ke dan dari database Airflow
Jumlah jaringan traffic antara cluster GKE lingkungan Anda dan database Airflow bergantung pada jumlah DAG, jumlah tugas dalam DAG, dan cara DAG mengakses data dalam database Airflow. Faktor-faktor berikut dapat memengaruhi penggunaan jaringan:
Kueri ke database Airflow. Jika DAG Anda melakukan banyak kueri, DAG tersebut akan menghasilkan traffic dalam jumlah besar. Contoh: memeriksa status tugas sebelum melanjutkan tugas lainnya, membuat kueri tabel XCom, membuang konten database Airflow.
Jumlah tugas yang besar. Makin banyak tugas yang dijadwalkan, makin banyak traffic jaringan yang dihasilkan. Pertimbangan ini berlaku untuk jumlah total tugas dalam DAG dan frekuensi penjadwalan. Saat menjadwalkan DAG berjalan, penjadwal Airflow akan membuat kueri ke database Airflow dan menghasilkan traffic.
Antarmuka web Airflow menghasilkan traffic jaringan karena membuat kueri ke database Airflow. Menggunakan halaman dengan grafik, tugas, dan diagram secara intensif dapat menghasilkan traffic jaringan dalam jumlah besar.
DAG membuat server web Airflow error atau menyebabkannya menampilkan error '502 gateway timeout'
Kegagalan server web dapat terjadi karena beberapa alasan. Periksa log airflow-webserver di Cloud Logging untuk menentukan penyebab error 502 gateway timeout
.
Menangani banyak DAG dan plugin di folder dags dan plugin
Isi folder /dags
dan /plugins
disinkronkan dari
bucket lingkungan Anda ke sistem file lokal pekerja dan
penjadwal Airflow.
Makin banyak data yang disimpan di folder ini, makin lama waktu yang diperlukan untuk melakukan sinkronisasi. Untuk mengatasi situasi tersebut:
Batasi jumlah file dalam folder
/dags
dan/plugins
. Hanya simpan file minimum yang diperlukan.Meningkatkan ruang disk yang tersedia untuk penjadwal dan pekerja Airflow.
Meningkatkan CPU dan memori penjadwal dan pekerja Airflow, sehingga operasi sinkronisasi dilakukan lebih cepat.
Jika DAG berjumlah sangat besar, bagi DAG menjadi beberapa batch, kompresi ke dalam arsip zip, lalu deploy arsip ini ke folder
/dags
. Pendekatan ini mempercepat proses sinkronisasi DAG. Komponen Airflow akan mengekstrak arsip zip sebelum memproses DAG.Membuat DAG secara terprogram juga dapat menjadi metode untuk membatasi jumlah file DAG yang disimpan di folder
/dags
. Lihat bagian tentang DAG Terprogram untuk menghindari masalah terkait penjadwalan dan eksekusi DAG yang dihasilkan secara terprogram.
Jangan menjadwalkan DAG yang dibuat secara terprogram secara bersamaan
Membuat objek DAG secara terprogram dari file DAG adalah metode yang efisien untuk menulis banyak DAG serupa yang hanya memiliki perbedaan kecil.
Sebaiknya jangan segera menjadwalkan semua DAG tersebut untuk dieksekusi. Ada kemungkinan besar bahwa pekerja Airflow tidak memiliki resource CPU dan memori yang memadai untuk menjalankan semua tugas yang dijadwalkan secara bersamaan.
Untuk menghindari masalah terkait penjadwalan DAG terprogram:
- Tingkatkan konkurensi pekerja dan tingkatkan skala lingkungan Anda, sehingga dapat menjalankan lebih banyak tugas secara bersamaan.
- Buat DAG dengan cara mendistribusikan jadwalnya secara merata dari waktu ke waktu, untuk menghindari penjadwalan ratusan tugas secara bersamaan, sehingga pekerja Airflow memiliki waktu untuk menjalankan semua tugas terjadwal.
Error 504 saat mengakses server web Airflow
Lihat Error 504 saat mengakses UI Airflow.
Koneksi ke server Postgres terputus selama pengecualian kueri ditampilkan selama eksekusi tugas atau tepat setelahnya
Pengecualian Lost connection to Postgres server during query
sering terjadi jika kondisi berikut terpenuhi:
- DAG Anda menggunakan
PythonOperator
atau operator kustom. - DAG Anda membuat kueri ke database Airflow.
Jika beberapa kueri dibuat dari fungsi yang dapat dipanggil, traceback mungkin
menunjuk ke baris self.refresh_from_db(lock_for_update=True)
dalam
kode Airflow secara tidak benar; ini adalah kueri database pertama setelah eksekusi tugas. Penyebab
sebenarnya dari pengecualian terjadi sebelum ini, saat sesi SQLAlchemy
tidak ditutup dengan benar.
Sesi SQLAlchemy dicakup ke thread dan dibuat dalam sesi fungsi callable yang nantinya dapat dilanjutkan di dalam kode Airflow. Jika ada penundaan yang signifikan antara kueri dalam satu sesi, koneksi mungkin sudah ditutup oleh server Postgres. Waktu tunggu koneksi di lingkungan Cloud Composer ditetapkan ke sekitar 10 menit.
Solusi:
- Gunakan dekorator
airflow.utils.db.provide_session
. Dekorator ini memberikan sesi yang valid ke database Airflow dalam parametersession
dan menutup sesi dengan benar di akhir fungsi. - Jangan gunakan satu fungsi yang berjalan lama. Sebagai gantinya, pindahkan semua kueri database
ke fungsi terpisah, sehingga ada beberapa fungsi dengan
dekorator
airflow.utils.db.provide_session
. Dalam hal ini, sesi akan otomatis ditutup setelah mengambil hasil kueri.
Mengontrol waktu eksekusi DAG, tugas, dan eksekusi paralel DAG yang sama
Jika ingin mengontrol durasi eksekusi satu DAG untuk DAG tertentu, Anda dapat menggunakan parameter DAG dagrun_timeout
untuk melakukannya. Misalnya, jika Anda ingin satu DAG berjalan (terlepas dari apakah eksekusi selesai dengan sukses atau gagal) tidak boleh berlangsung lebih dari 1 jam, tetapkan parameter ini ke 3600 detik.
Anda juga dapat mengontrol berapa lama Anda mengizinkan satu tugas Airflow berlangsung. Untuk melakukannya, Anda dapat menggunakan execution_timeout
.
Jika ingin mengontrol jumlah DAG aktif yang ingin Anda miliki untuk
DAG tertentu, Anda dapat menggunakan [core]max-active-runs-per-dag
opsi konfigurasi Airflow untuk melakukannya.
Jika Anda hanya ingin menjalankan satu instance DAG pada waktu tertentu, tetapkan
parameter max-active-runs-per-dag
ke 1
.
Masalah yang memengaruhi sinkronisasi DAG dan plugin ke penjadwal, pekerja, dan server web
Cloud Composer menyinkronkan konten folder /dags
dan /plugins
kepada penjadwal dan pekerja. Objek tertentu di folder /dags
dan /plugins
mungkin mencegah sinkronisasi ini berfungsi dengan benar atau memperlambatnya.
Folder
/dags
disinkronkan ke penjadwal dan pekerja.Folder ini tidak disinkronkan ke server web.
Folder
/plugins
disinkronkan ke penjadwal, pekerja, dan server web.
Anda mungkin mengalami masalah berikut:
Anda mengupload file yang dikompresi dengan gzip yang menggunakan transcoding kompresi ke folder
/dags
dan/plugins
. Hal ini biasanya terjadi jika Anda menggunakan flag--gzip-local-all
dalam perintahgcloud storage cp
untuk mengupload data ke bucket.Solusi: Hapus objek yang menggunakan transcoding kompresi dan upload ulang ke bucket.
Salah satu objek diberi nama '.'—objek tersebut tidak disinkronkan ke penjadwal dan pekerja, dan mungkin berhenti menyinkronkan sama sekali.
Solusi: Ganti nama objek.
Folder dan file Python DAG memiliki nama yang sama, misalnya
a.py
. Dalam hal ini, file DAG tidak disinkronkan dengan benar ke komponen Airflow.Solusi: Hapus folder yang memiliki nama yang sama dengan file Python DAG.
Salah satu objek dalam folder
/dags
atau/plugins
berisi simbol/
di akhir nama objek. Objek tersebut dapat mengganggu proses sinkronisasi karena simbol/
berarti objek adalah folder, bukan file.Solusi: Hapus simbol
/
dari nama objek yang bermasalah.Jangan menyimpan file yang tidak perlu di folder
/dags
dan/plugins
.Terkadang DAG dan plugin yang Anda terapkan dilengkapi dengan file tambahan, seperti file yang menyimpan pengujian untuk komponen ini. File ini disinkronkan ke pekerja dan penjadwal serta memengaruhi waktu yang diperlukan untuk menyalin file ini ke penjadwal, pekerja, dan server web.
Solusi: Jangan menyimpan file tambahan dan tidak perlu di folder
/dags
dan/plugins
.
Selesai [Errno 21] Adalah direktori: error '/home/airflow/gcs/dags/...' dihasilkan oleh penjadwal dan pekerja
Masalah ini terjadi karena objek dapat memiliki namespace yang tumpang-tindih di Cloud Storage, sementara pada saat yang sama, penjadwal dan pekerja menggunakan sistem file tradisional. Misalnya, Anda dapat menambahkan folder dan objek dengan nama yang sama ke bucket lingkungan. Saat bucket disinkronkan ke penjadwal dan pekerja lingkungan, error ini akan muncul, yang dapat menyebabkan kegagalan tugas.
Untuk memperbaiki masalah ini, pastikan tidak ada namespace yang tumpang-tindih di bucket lingkungan. Misalnya, jika /dags/misc
(file) dan
/dags/misc/example_file.txt
(file lain) berada dalam bucket, error akan
dibuat oleh penjadwal.
Gangguan sementara saat terhubung ke DB Metadata Airflow
Cloud Composer berjalan di atas infrastruktur terdistribusi. Artinya, dari waktu ke waktu, beberapa masalah sementara mungkin muncul dan dapat mengganggu eksekusi tugas Airflow Anda.
Dalam situasi seperti itu, Anda mungkin melihat pesan error berikut di log pekerja Airflow:
"Can't connect to Postgres server on 'airflow-sqlproxy-service.default.svc.cluster.local' (111)"
atau
"Can't connect to Postgres server on 'airflow-sqlproxy-service.default.svc.cluster.local' (104)"
Masalah yang terputus-putus tersebut mungkin juga disebabkan oleh operasi pemeliharaan yang dilakukan untuk lingkungan Cloud Composer Anda.
Biasanya, error tersebut bersifat intermiten dan jika tugas Airflow bersifat idempotent dan Anda telah mengonfigurasi percobaan ulang, error tersebut tidak akan memengaruhi Anda. Anda juga dapat mempertimbangkan untuk menentukan masa pemeliharaan.
Salah satu alasan tambahan untuk error tersebut mungkin adalah kurangnya resource di cluster lingkungan Anda. Dalam kasus seperti itu, Anda dapat menskalakan atau mengoptimalkan lingkungan seperti yang dijelaskan dalam petunjuk Menskalakan lingkungan atau Mengoptimalkan lingkungan.
Operasi DAG ditandai sebagai berhasil, tetapi tidak memiliki tugas yang dieksekusi
Jika execution_date
operasi DAG lebih awal dari start_date
DAG, Anda mungkin melihat operasi DAG yang tidak memiliki operasi tugas, tetapi masih ditandai sebagai berhasil.
Penyebab
Situasi ini mungkin terjadi dalam salah satu kasus berikut:
Ketidakcocokan disebabkan oleh perbedaan zona waktu antara
execution_date
danstart_date
DAG. Hal ini dapat terjadi, misalnya, saat menggunakanpendulum.parse(...)
untuk menetapkanstart_date
.start_date
DAG ditetapkan ke nilai dinamis, misalnyaairflow.utils.dates.days_ago(1)
Solusi
Pastikan
execution_date
danstart_date
menggunakan zona waktu yang sama.Tentukan
start_date
statis dan gabungkan dengancatchup=False
untuk menghindari menjalankan DAG dengan tanggal mulai sebelumnya.
DAG tidak terlihat di UI Airflow atau UI DAG dan penjadwal tidak menjadwalkannya
Pemroses DAG mengurai setiap DAG sebelum dapat dijadwalkan oleh penjadwal dan sebelum DAG terlihat di UI Airflow atau UI DAG.
Opsi konfigurasi Airflow berikut menentukan waktu tunggu untuk mengurai DAG:
[core]dagrun_import_timeout
menentukan berapa banyak waktu yang diperlukan pemroses DAG untuk mengurai satu DAG.[core]dag_file_processor_timeout
menentukan jumlah total waktu yang dapat dihabiskan pemroses DAG untuk mengurai semua DAG.
Jika DAG tidak terlihat di UI Airflow atau UI DAG:
Periksa log pemroses DAG apakah pemroses DAG dapat memproses DAG Anda dengan benar. Jika terjadi masalah, Anda mungkin melihat entri log berikut di log penjadwal atau pemroses 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.
Periksa log penjadwal untuk melihat apakah penjadwal berfungsi dengan benar. Jika terjadi masalah, Anda mungkin melihat entri log berikut di log penjadwal:
DagFileProcessorManager (PID=732) last sent a heartbeat 240.09 seconds ago! Restarting it Process timed out, PID: 68496
Solusi:
Perbaiki semua error penguraian DAG. Prosesor DAG menguraikan beberapa DAG, dan dalam kasus yang jarang terjadi, error penguraian satu DAG dapat berdampak negatif pada penguraian DAG lainnya.
Jika penguraian DAG Anda memerlukan waktu lebih dari jumlah detik yang ditentukan dalam
[core]dagrun_import_timeout
, tingkatkan waktu tunggu ini.Jika penguraian semua DAG Anda memerlukan waktu lebih dari jumlah detik yang ditentukan dalam
[core]dag_file_processor_timeout
, tingkatkan waktu tunggu ini.Jika DAG Anda memerlukan waktu lama untuk diuraikan, hal ini juga dapat berarti bahwa DAG tidak diterapkan dengan cara yang optimal. Misalnya, jika membaca banyak variabel lingkungan, atau melakukan panggilan ke layanan eksternal atau database Airflow. Sebisa mungkin, hindari melakukan operasi tersebut di bagian global DAG.
Tingkatkan resource CPU dan memori untuk Penjadwal agar dapat bekerja lebih cepat.
Meningkatkan jumlah proses pemroses DAG sehingga penguraian dapat dilakukan lebih cepat. Anda dapat melakukannya dengan meningkatkan nilai
[scheduler]parsing_process
.
Gejala database Airflow yang mengalami beban berat
Untuk informasi selengkapnya, lihat Gejala Database Airflow yang mengalami tekanan beban.