Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3
Halaman ini menyediakan langkah-langkah pemecahan masalah dan informasi untuk alur kerja umum masalah performa.
Banyak masalah eksekusi DAG disebabkan oleh performa lingkungan yang tidak optimal. Anda dapat mengoptimalkan lingkungan Cloud Composer 2 dengan mengikuti topik Optimize performa lingkungan dan biaya kami.
Beberapa masalah eksekusi DAG mungkin disebabkan oleh scheduler Airflow tidak bekerja dengan benar atau optimal. Harap ikuti Petunjuk pemecahan masalah penjadwal untuk memecahkan masalah ini.
Alur kerja pemecahan masalah
Untuk mulai memecahkan masalah:
Periksa log Airflow.
Anda dapat meningkatkan level logging Airflow dengan mengganti mengikuti opsi konfigurasi Airflow.
Aliran udara 2
Bagian Kunci Nilai logging
logging_level
Nilai defaultnya adalah INFO
. Tetapkan keDEBUG
untuk mendapatkan lebih banyak panjang dalam pesan log.Aliran udara 1
Bagian Kunci Nilai core
logging_level
Nilai defaultnya adalah INFO
. Tetapkan keDEBUG
untuk mendapatkan lebih banyak panjang dalam pesan log.Periksa Dasbor Pemantauan.
Tinjau Cloud Monitoring.
Di Konsol Google Cloud, periksa error pada halaman untuk komponen lingkungan Anda.
Di antarmuka web Airflow, lihat 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 untuk tugas tertentu.
- Periksa log Airflow.
- Tinjau Cloud Monitoring.
- Periksa log khusus operator.
- Perbaiki error.
- Upload DAG ke folder
dags/
. - Di antarmuka web Airflow, menghapus status terdahulu untuk DAG.
- Melanjutkan atau menjalankan DAG.
Memecahkan masalah eksekusi tugas
Airflow adalah sistem terdistribusi dengan banyak entitas seperti penjadwal, eksekutor, pekerja yang berkomunikasi satu sama lain melalui task queue dan Airflow {i>database<i} dan mengirim sinyal (seperti SIGTERM). Diagram berikut menunjukkan ringkasan interkoneksi antarkomponen Airflow.
Dalam sistem terdistribusi seperti Airflow, mungkin ada beberapa konektivitas jaringan atau infrastruktur yang mendasarinya mungkin mengalami masalah sesekali; hal ini dapat mengarah pada situasi di mana tugas-tugas bisa gagal dan dijadwalkan ulang untuk eksekusi, atau tugas mungkin tidak berhasil diselesaikan (misalnya, Zombie tugas, atau tugas yang macet dalam eksekusi). Aliran udara memiliki mekanisme untuk menangani situasi tersebut dan secara otomatis melanjutkan fungsi normal. Mengikuti bagian ini menjelaskan masalah umum yang terjadi selama eksekusi tugas oleh Airflow: Tugas zombie, Pil Racun, dan sinyal SIGTERM.
Memecahkan masalah tugas Zombie
Airflow mendeteksi dua jenis ketidakcocokan antara tugas dan proses yang dijalankan tugas tersebut:
Tugas zombie adalah tugas yang seharusnya berjalan tetapi tidak sedang berjalan. Ini mungkin 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.
Temukan tugas zombie
resource.type="cloud_composer_environment" resource.labels.environment_name="ENVIRONMENT_NAME" log_id("airflow-scheduler") textPayload:"Detected zombie job"
Tugas undead adalah tugas yang tidak seharusnya berjalan. Penemuan Airflow tugas-tugas tersebut secara berkala dan menghentikannya.
Alasan dan solusi paling umum untuk tugas Zombie tercantum di bawah ini.
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 sumber daya.
Temukan 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:
Mengoptimalkan tugas untuk menghemat memori, misalnya dengan menghindari kode tingkat teratas;
Di Cloud Composer 2 versi yang lebih lama dari 2.6.0, update
[celery]worker_concurrency
menggunakan formula saat ini jika nilai ini lebih rendah;Di Cloud Composer 2, gunakan penggantian konfigurasi Airflow untuk mempertahankan
[celery]worker_concurrency
dan meningkatkan memori untuk worker Airflow;Di Cloud Composer 1, mengupgrade ke jenis mesin yang lebih besar;
Turunkan
[celery]worker_concurrency
.
Pekerja aliran udara dikeluarkan
Penghapusan pod adalah bagian yang normal saat menjalankan workload di Kubernetes. GKE mengeluarkan pod jika mereka kehabisan ruang penyimpanan atau sumber daya untuk beban kerja yang memiliki prioritas lebih tinggi.
Temukan penggusuran 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 penyimpanan
penggunaan atau menghapus file
sementara segera setelah tidak diperlukan.
Atau, Anda dapat
meningkatkan penyimpanan yang tersedia atau menjalankan
workload di pod khusus menggunakan
KubernetesPodOperator
.
Pekerja aliran udara dihentikan
Pekerja Airflow mungkin dihapus secara eksternal. Jika tugas yang sedang berjalan tidak diselesaikan selama masa penghentian halus, mereka akan terganggu dan dapat akhirnya terdeteksi sebagai zombie.
Mempelajari 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:
Pekerja aliran udara dimulai ulang selama modifikasi lingkungan, seperti upgrade atau instalasi paket:
Mempelajari modifikasi lingkungan Composer
resource.type="cloud_composer_environment" resource.labels.environment_name="ENVIRONMENT_NAME" log_id("cloudaudit.googleapis.com%2Factivity")
Anda dapat menjalankan operasi tersebut saat tidak ada tugas penting yang berjalan atau mengaktifkan percobaan ulang tugas.
Berbagai komponen mungkin tidak tersedia untuk sementara selama pemeliharaan operasi:
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 pelaksanaan tugas penting.
Di Cloud Composer 2 versi yang lebih lama dari 2.4.5, penghentian Airflow pekerja mungkin mengabaikan sinyal SIGTERM dan terus menjalankan tugas:
Pelajari penurunan skala berdasarkan 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 dengan telah diperbaiki.
Pekerja aliran udara dalam beban berat
Jumlah resource CPU dan memori yang tersedia untuk pekerja Airflow terbatas oleh konfigurasi lingkungan. Jika pemakaian mendekati batas, hal itu akan menyebabkan pertentangan sumber daya dan penundaan yang tidak perlu selama tugas dalam proses eksekusi. Dalam situasi ekstrem, ketika sumber daya kurang dalam jangka waktu yang lebih lama waktu tertentu, hal ini dapat menyebabkan tugas-tugas {i>zombie<i}.
Solusi:
- Pantau penggunaan CPU dan memori pekerja dan sesuaikan untuk menghindari melebihi 80%.
Database Airflow mengalami beban berat
{i>Database<i} digunakan oleh berbagai komponen Airflow untuk berkomunikasi satu sama lain dan, khususnya, untuk menyimpan detak jantung instance tugas. Kekurangan sumber daya di {i>database <i}akan menyebabkan waktu kueri yang lebih lama dan mungkin memengaruhi eksekusi tugas.
Solusi:
Database Airflow untuk sementara tidak tersedia
Pekerja Airflow mungkin memerlukan waktu untuk mendeteksi dan menangani panggilan terputus-putus dengan baik error, seperti masalah konektivitas sementara. Nilai ini mungkin melampaui nilai batas deteksi zombie.
Temukan waktu tunggu detak jantung 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 dari
[scheduler]scheduler_zombie_task_threshold
Opsi konfigurasi Airflow:Bagian Kunci Nilai Catatan scheduler
scheduler_zombie_task_threshold
Baru waktu tunggu habis (dalam detik) Default nilainya adalah 300
Memecahkan Masalah Pil Racun
Poison Pill adalah mekanisme yang digunakan oleh Airflow untuk menonaktifkan tugas Airflow.
Airflow menggunakan Pil Racun dalam situasi berikut:
- Ketika penjadwal menghentikan tugas yang tidak selesai tepat waktu.
- Saat waktu tunggu tugas habis atau dieksekusi terlalu lama.
Saat Airflow menggunakan Poison Pill, Anda dapat melihat entri log berikut di 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.
Solusi yang memungkinkan:
- Periksa kode tugas untuk menemukan error yang mungkin menyebabkannya berjalan terlalu lama.
- (Cloud Composer 2) Meningkatkan CPU dan memori untuk Airflow pekerja, sehingga tugas dapat dieksekusi lebih cepat.
Tingkatkan nilai Konfigurasi Airflow
[celery_broker_transport_options]visibility-timeout
sebelumnya.Akibatnya, {i>scheduler<i} menunggu lebih lama hingga tugas selesai, sebelum menganggap tugas tersebut sebagai tugas Zombie. Opsi ini terutama berguna untuk tugas yang memakan waktu dan berlangsung berjam-jam. Jika nilainya terlalu rendah (misalnya, 3 jam), maka penjadwal mempertimbangkan tugas yang berjalan selama 5 atau 6 jam sebagai "{i>hanging<i}" (Tugas zombie).
Tingkatkan nilai Airflow
[core]killed_task_cleanup_time
opsi konfigurasi.Nilai yang lebih lama memberikan lebih banyak waktu bagi pekerja Airflow untuk menyelesaikan tugas mereka dengan baik. Jika nilainya terlalu rendah, tugas Airflow mungkin terganggu tiba-tiba, tidak memiliki cukup waktu untuk menyelesaikan pekerjaan mereka dengan baik.
Memecahkan masalah sinyal SIGTERM
Sinyal SIGTERM digunakan oleh Linux, Kubernetes, penjadwal Airflow, dan Celery untuk menghentikan proses yang bertanggung jawab terhadap 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 dari tugas dan mengirim Poison Pill dan SIGTERM memberi sinyal ke tugas untuk menghentikannya.
Dalam Penskalaan Otomatis Pod Horizontal, GKE Bidang Kontrol mengirim sinyal SIGTERM untuk menghapus Pod yang tidak lagi diperlukan.
Scheduler 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 race antara callback detak jantung dan callback keluar dalam local_task_job, yang memantau eksekusi tugas. Jika detak jantung mendeteksi bahwa tugas ditandai sebagai berhasil, tidak dapat membedakan apakah tugas itu sendiri berhasil atau Airflow diminta untuk mempertimbangkan tugas tersebut berhasil. Meskipun demikian, ini akan menghentikan {i>task runner<i}, tanpa menunggu untuk keluar.
Sinyal SIGTERM tersebut dapat diabaikan dengan aman. Tugas ini sudah ada di berhasil dan eksekusi DAG secara keseluruhan tidak akan terdampak.
Entri log
Received SIGTERM.
adalah satu-satunya perbedaan antara entri reguler keluar 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 mengirimkan sinyal SIGTERM ke Pod yang berjalan pada node yang akan diupgrade. Saat instance tugas dihentikan dengan SIGTERM, Anda dapat melihat log berikut entri di 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
Solusi yang memungkinkan:
Masalah ini terjadi saat VM yang menjalankan tugas kehabisan memori. Ini bukan terkait dengan konfigurasi Airflow tetapi dengan jumlah memori yang tersedia untuk Pesan Suara.
Peningkatan memori bergantung pada versi Cloud Composer yang digunakan. Contoh:
Di Cloud Composer 2, Anda dapat menetapkan lebih banyak resource CPU dan memori ke Airflow pekerja.
Pada Cloud Composer 1, Anda dapat membuat ulang lingkungan menggunakan jenis mesin yang lebih berperforma tinggi.
Di kedua versi Cloud Composer, Anda dapat menurunkan nilai opsi konfigurasi Airflow serentak
[celery]worker_concurrency
. Opsi ini menentukan berapa banyak tugas yang dieksekusi secara serentak oleh suatu Pekerja aliran udara.
Untuk informasi selengkapnya tentang cara mengoptimalkan lingkungan Cloud Composer 2, lihat Mengoptimalkan performa dan biaya lingkungan
Kueri Cloud Logging untuk menemukan alasan Pod dimulai ulang atau dihapus
Lingkungan Cloud Composer menggunakan cluster GKE sebagai infrastruktur komputasi feedforward. Di bagian ini, Anda akan dapat menemukan kueri berguna yang dapat membantu untuk menemukan alasan pekerja Airflow atau scheduler Airflow dimulai ulang atau dihapus.
Kueri yang ditampilkan di bawah dapat disesuaikan dengan cara berikut:
Anda dapat menentukan linimasa yang menarik bagi Anda di Cloud Logging; misalnya, 6 jam, 3 hari terakhir, atau Anda dapat menentukan rentang waktu kustom
Anda harus menentukan antarmuka CLUSTER_NAME
Anda juga dapat membatasi pencarian ke Pod tertentu dengan menambahkan POD_NAME
Menemukan container 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 container akibat peristiwa Out-of-Memory
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 container 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 terhadap eksekusi tugas Airflow
Operasi update atau upgrade akan mengganggu pelaksanaan tugas Airflow yang saat ini sedang dijalankan, kecuali jika tugas dijalankan dalam mode yang dapat ditangguhkan.
Sebaiknya lakukan operasi ini jika Anda memperkirakan dampak yang ditimbulkan tentang eksekusi tugas Airflow dan menyiapkan mekanisme percobaan ulang yang sesuai di DAG dan tugas.
Memecahkan masalah tugas KubernetesExecutor
CeleryKubernetesExecutor adalah jenis eksekutor di Cloud Composer 3 yang dapat menggunakan CeleryExecutor dan KubernetesExecutor secara bersamaan baik.
Lihat halaman Menggunakan CeleryKubernetesExecutor untuk informasi selengkapnya informasi tentang tugas pemecahan masalah yang dijalankan dengan KubernetesExecutor.
Masalah umum
Bagian berikut ini menjelaskan gejala dan kemungkinan perbaikan untuk beberapa Masalah DAG.
Tugas Airflow terganggu oleh Negsignal.SIGKILL
Terkadang tugas Anda mungkin menggunakan lebih banyak memori daripada yang dialokasikan pekerja Airflow.
Dalam situasi seperti itu, project mungkin akan terganggu oleh Negsignal.SIGKILL
. Sistem
mengirimkan sinyal ini untuk menghindari
konsumsi memori lebih lanjut yang mungkin berdampak
pelaksanaan 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
dapat juga muncul sebagai kode -9
.
Solusi yang memungkinkan:
worker_concurrency
pekerja Airflow bawah.Pada kasus Cloud Composer 2, tingkatkan memori pekerja Airflow.
Pada kasus Cloud Composer 1, upgrade ke jenis mesin yang lebih besar yang digunakan cluster Cloud Composer.
Optimalkan tugas Anda untuk menggunakan lebih sedikit memori.
Kelola tugas yang menggunakan banyak resource di Cloud Composer menggunakan KubernetesPodOperator atau GKEStartPodOperator untuk isolasi tugas dan alokasi resource yang disesuaikan.
Tugas gagal tanpa memunculkan log karena error penguraian DAG
Terkadang mungkin ada {i>error<i} DAG
halus yang menyebabkan situasi di mana
Scheduler Airflow dan pemroses DAG dapat menjadwalkan tugas untuk dieksekusi
dan untuk mengurai file DAG (masing-masing), tetapi worker Airflow gagal menjalankan tugas
dari DAG tersebut karena ada error
pemrograman dalam file DAG python. Hal ini mungkin
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 dilaporkan oleh Pekerja Airflow terkait error penguraian DAG atau DAG yang tidak ada.
Meningkatkan parameter yang terkait dengan penguraian DAG:
Tambah dagbag-import-timeout setidaknya 120 detik (atau lebih, jika perlu).
Tambah dag-file-processor-timeout setidaknya 180 detik (atau lebih, jika perlu). Nilai ini harus lebih tinggi dari
dagbag-import-timeout
.
Lihat juga Memeriksa log Prosesor DAG.
Tugas gagal tanpa memunculkan log karena tekanan resource
Gejala: selama pelaksanaan tugas, subproses pekerja Airflow yang bertanggung jawab untuk eksekusi tugas Airflow tiba-tiba terganggu. 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 1, buat lingkungan baru dengan
jenis mesin yang lebih besar dari mesin saat ini
. Pertimbangkan untuk menambahkan lebih banyak node ke lingkungan dan menurunkan
[celery]worker_concurrency
untuk pekerja Anda. - 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 proses debug masalah memori habis, lihat Men-debug masalah DAG penyimpanan dan kehabisan memori.
Tugas gagal tanpa memunculkan log karena penghapusan Pod
Pod Google Kubernetes Engine tunduk kepada Siklus Proses Pod Kubernetes dan penghapusan pod. Tugas lonjakan dan penjadwalan pekerja bersama adalah dua penyebab paling umum penggusuran pod di Cloud Composer.
Pod dapat dihapus jika pod tertentu menggunakan resource node secara berlebihan, sesuai dengan ekspektasi konsumsi resource yang dikonfigurasi untuk node. Sebagai misalnya, penghapusan dapat terjadi ketika beberapa tugas yang menggunakan banyak memori berjalan di pod, dan beban gabungannya menyebabkan node tempat pod ini berjalan melebihi {i>memory memory limit<i}.
Jika pod pekerja Airflow dikeluarkan, semua instance tugas yang berjalan pada pod tersebut pod terganggu, lalu ditandai sebagai gagal oleh Airflow.
Log di-buffer. Jika pod pekerja dikeluarkan sebelum buffer dikosongkan, log tidak dimunculkan. Kegagalan tugas tanpa log adalah indikasi bahwa Airflow pekerja 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.
Pada daftar lingkungan, klik nama lingkungan Anda. Halaman Detail lingkungan akan terbuka.
Buka tab Logs.
Lihat log setiap pekerja di bagian All logs -> Log Airflow -> Pekerja -> (pekerja individual).
Eksekusi DAG dibatasi memori. Setiap eksekusi tugas dimulai dengan dua Airflow proses: eksekusi dan pemantauan tugas. Setiap node dapat memerlukan waktu hingga 6 tugas serentak (sekitar 12 proses yang dimuat dengan modul Airflow). Lebih banyak memori dapat digunakan, bergantung pada sifat DAG.
Gejala:
Di Konsol Google Cloud, buka halaman Workloads.
Jika ada
airflow-worker
pod yang menampilkanEvicted
, klik setiap pod yang dikeluarkan pod dan mencariThe node was low on resource: memory
di bagian atas jendela.
Perbaikan:
- Di Cloud Composer 1, buat lingkungan Cloud Composer baru dengan jenis mesin yang lebih besar dari mesin saat ini .
- Di Cloud Composer 2, tingkatkan batas memori untuk pekerja Airflow.
- Periksa log dari pod
airflow-worker
untuk melihat kemungkinan penyebab penghapusan. Untuk selengkapnya informasi tentang cara mengambil log dari masing-masing pod, lihat Memecahkan masalah terkait beban kerja yang di-deploy. - Pastikan tugas di DAG bersifat idempoten dan dapat dicoba lagi.
Hindari mendownload file yang tidak perlu ke sistem file lokal pekerja Airflow.
Pekerja Airflow memiliki kapasitas sistem file lokal yang terbatas. Misalnya, di Cloud Composer 2, pekerja dapat memiliki penyimpanan sebesar 1 GB hingga 10 GB. Jika ruang penyimpanan habis, pod pekerja Airflow dikeluarkan oleh Bidang Kontrol GKE. Tindakan ini akan menggagalkan semua tugas yang dikeluarkan sedang dieksekusi.
Contoh operasi yang bermasalah:
- Mendownload file atau objek dan menyimpannya secara lokal di Airflow pekerja. Simpan objek ini secara langsung di layanan yang sesuai seperti bucket Cloud Storage.
- Mengakses objek besar di folder
/data
dari pekerja Airflow. Pekerja Airflow akan mendownload objek ke sistem file lokalnya. Sebagai gantinya, terapkan DAG Anda agar file berukuran besar diproses di luar Pod pekerja Airflow.
Waktu tunggu impor pemuatan DAG habis
Gejala:
- Di antarmuka web Airflow, di bagian atas halaman daftar DAG, muncul peringatan penting
kotak menunjukkan
Broken DAG: [/path/to/dagfile] Timeout
. Dalam Cloud Monitoring: Log
airflow-scheduler
berisi entri mirip dengan:ERROR - Process timed out
ERROR - Failed to import: /path/to/dagfile
AirflowTaskTimeout: Timeout
Perbaikan:
Mengganti Airflow dag_file_processor_timeout
dan memberikan 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 proses DAG tidak berakhir karena tugas Airflow macet dan DAG berjalan berlangsung lebih lama dari yang diharapkan. Dalam kondisi normal, tugas Airflow tidak tanpa batas waktu dalam status antrean atau berjalan, karena Airflow memiliki waktu tunggu dan prosedur pembersihan yang membantu menghindari situasi ini.
Perbaikan:
Gunakan
dagrun_timeout
untuk DAG. Contoh:dagrun_timeout=timedelta(minutes=120)
. Akibatnya, setiap operasi DAG harus selesai dalam waktu tunggu pengoperasian DAG dan tugas yang belum selesai akan ditandai sebagaiFailed
atauUpstream Failed
. Untuk informasi selengkapnya tentang status tugas Airflow, lihat Dokumentasi Apache Airflow.Gunakan waktu tunggu eksekusi tugas untuk menentukan waktu tunggu default untuk tugas yang dijalankan berdasarkan Apache Operator Airflow.
Operasi DAG tidak dijalankan
Gejala:
Saat tanggal jadwal untuk DAG disetel secara dinamis, hal ini dapat menyebabkan berbagai efek samping yang tidak terduga. Contoh:
Eksekusi DAG selalu berada di masa mendatang, dan DAG tidak pernah dieksekusi.
Operasi DAG sebelumnya ditandai sebagai dijalankan dan berhasil meskipun tidak dijalankan telah dijalankan.
Informasi selengkapnya tersedia dalam dokumentasi Apache Airflow.
Perbaikan:
Ikuti rekomendasi dalam dokumentasi Apache Airflow.
Tetapkan
start_date
statis untuk DAG. Sebagai opsi, Anda dapat menggunakancatchup=False
menonaktifkan menjalankan DAG untuk tanggal yang sudah lewat.Hindari menggunakan
datetime.now()
ataudays_ago(<number of days>)
kecuali jika Anda mengetahui efek samping pendekatan ini.
Peningkatan traffic jaringan ke dan dari database Airflow
Jumlah jaringan traffic antara GKE lingkungan Anda dan database Airflow bergantung pada jumlah DAG, tugas di DAG, dan cara DAG mengakses data di database Airflow. Tujuan faktor berikut yang mungkin memengaruhi penggunaan jaringan:
Kueri ke database Airflow. Jika DAG Anda melakukan banyak kueri, menghasilkan lalu lintas dalam jumlah besar. Contoh: memeriksa status tugas sebelum melanjutkan dengan tugas lain, membuat kueri tabel XCom, membuang Airflow konten database.
Jumlah tugas yang banyak. Semakin banyak tugas yang ada untuk dijadwalkan, semakin akan dihasilkan traffic jaringan. Pertimbangan ini berlaku untuk jumlah tugas di DAG dan frekuensi penjadwalan. Jika Scheduler Airflow menjadwalkan operasi DAG, yang membuat kueri ke Airflow {i>database<i} dan menghasilkan traffic.
Antarmuka web Airflow menghasilkan lalu lintas jaringan karena membuat kueri untuk database Airflow. Secara intensif menggunakan halaman dengan grafik, tugas, dan diagram dapat menghasilkan lalu lintas jaringan dalam jumlah besar.
DAG membuat error pada server web Airflow atau menyebabkannya menampilkan error 502 gateway timeout
Kegagalan server web dapat terjadi karena beberapa alasan yang berbeda. Periksa
login airflow-webserver
Cloud Logging untuk menentukan penyebab
Error 502 gateway timeout
.
Komputasi kelas berat
Bagian ini hanya berlaku untuk Cloud Composer 1.
Hindari menjalankan komputasi class berat pada waktu penguraian DAG.
Tidak seperti node pekerja dan penjadwal, yang jenis mesinnya dapat disesuaikan memiliki kapasitas CPU dan memori yang lebih besar, server web menggunakan jenis mesin tetap, yang dapat menyebabkan kegagalan penguraian DAG jika komputasi waktu penguraian terlalu kelas berat.
Perhatikan bahwa server web memiliki 2 vCPU dan memori 2 GB.
Nilai default untuk core-dagbag_import_timeout
adalah 30 detik. Waktu tunggu ini
menentukan batas atas durasi yang diperlukan Airflow untuk memuat
Modul Python di folder dags/
.
Izin salah
Bagian ini hanya berlaku untuk Cloud Composer 1.
Server web tidak berjalan dengan akun layanan yang sama dengan pekerja dan {i>scheduler<i} (penjadwal). Dengan demikian, pekerja dan penjadwal mungkin dapat mengakses sumber daya yang dikelola pengguna yang tidak dapat diakses oleh server web.
Sebaiknya hindari mengakses sumber daya non-publik selama
Penguraian DAG. Terkadang, hal ini tidak dapat dihindari, dan Anda harus memberikan
memberikan izin ke akun layanan server web. Layanan
nama akun berasal dari domain server web Anda. Misalnya, jika domain
adalah example-tp.appspot.com
, akun layanannya
example-tp@appspot.gserviceaccount.com
.
Error DAG
Bagian ini hanya berlaku untuk Cloud Composer 1.
Server web berjalan di App Engine dan terpisah dari
ke cluster GKE lingkungan Anda. Server web mengurai DAG
file definisi, dan 502 gateway timeout
dapat terjadi jika ada error
di DAG. Airflow berfungsi secara normal tanpa server web yang berfungsi jika
DAG yang bermasalah tidak mengganggu proses apa pun yang berjalan di GKE.
Dalam hal ini, Anda dapat menggunakan gcloud composer environments run
untuk mengambil
detail dari lingkungan Anda dan sebagai solusi
jika server web menjadi
tidak tersedia.
Dalam kasus lain, Anda dapat menjalankan penguraian DAG di GKE dan mencari DAG yang menampilkan pengecualian Python yang fatal atau waktu tunggu tersebut (default 30 detik). Untuk memecahkan masalah, hubungkan ke shell jarak jauh di container pekerja Airflow dan menguji kesalahan sintaks. Untuk informasi selengkapnya, lihat Menguji DAG.
Menangani sejumlah besar DAG dan plugin di folder dags dan plugin
Isi folder /dags
dan /plugins
disinkronkan dari
bucket lingkungan Anda ke sistem file lokal pekerja Airflow dan
penjadwal.
Semakin banyak data yang disimpan dalam folder ini, semakin lama waktu yang dibutuhkan untuk melakukan sinkronisasi. Untuk mengatasi situasi tersebut:
Batasi jumlah file di folder
/dags
dan/plugins
. Hanya simpan jumlah file minimum yang diperlukan.Jika memungkinkan, tingkatkan kapasitas {i>disk<i} yang tersedia untuk penjadwal Airflow dan pekerja.
Jika memungkinkan, tingkatkan CPU dan memori penjadwal dan pekerja Airflow, sehingga bahwa operasi sinkronisasi dilakukan lebih cepat.
Untuk DAG dalam jumlah yang sangat besar, bagi DAG menjadi beberapa batch, ke dalam arsip zip dan deploy arsip tersebut ke dalam folder
/dags
. Pendekatan ini mempercepat proses sinkronisasi DAG. Komponen Airflow membuka file {i>zip<i} sebelum memproses DAG.Menghasilkan DAG dalam pembelian terprogram juga dapat menjadi metode untuk membatasi jumlah file DAG yang disimpan di folder
/dags
. Lihat bagian tentang DAG Terprogram untuk menghindari masalah penjadwalan dan eksekusi DAG yang dihasilkan secara terprogram.
Jangan jadwalkan DAG yang dibuat secara terprogram secara bersamaan
Menghasilkan objek DAG secara terprogram dari file DAG adalah metode yang efisien untuk menulis banyak DAG serupa yang hanya memiliki sedikit perbedaan.
Penting untuk tidak segera menjadwalkan semua DAG tersebut untuk dieksekusi. Ada ada kemungkinan besar pekerja Airflow tidak memiliki cukup CPU dan memori sumber daya untuk mengeksekusi semua tugas yang dijadwalkan pada saat yang sama.
Untuk menghindari masalah saat menjadwalkan DAG terprogram:
- Meningkatkan konkurensi pekerja dan meningkatkan skala lingkungan Anda agar dapat mengeksekusi lebih banyak tugas secara bersamaan.
- Membuat DAG dengan cara mendistribusikan jadwal mereka secara merata dari waktu ke waktu, untuk menghindari penjadwalan ratusan tugas secara bersamaan, sehingga pekerja Airflow memiliki waktu untuk melaksanakan semua tugas terjadwal.
Error 504 saat mengakses server web Airflow
Lihat Error 504 saat mengakses UI Airflow.
Pengecualian Lost connection to Postgres server during query
ditampilkan selama eksekusi tugas atau tepat setelahnya
Lost connection to Postgres server during query
pengecualian
sering terjadi saat kondisi berikut terpenuhi:
- DAG Anda menggunakan
PythonOperator
atau operator kustom. - DAG membuat kueri ke database Airflow.
Jika beberapa kueri dibuat dari fungsi callable, {i>traceback<i} mungkin
salah menunjuk ke baris self.refresh_from_db(lock_for_update=True)
di
Kode Airflow; yang merupakan kueri {i>database<i} pertama
setelah eksekusi tugas. Tujuan
penyebab sebenarnya dari pengecualian terjadi sebelum ini, ketika sebuah sesi SQLAlchemy
tidak ditutup dengan benar.
Sesi SQLAlchemy dicakup dalam thread dan dibuat dalam fungsi callable sesi dapat dilanjutkan nanti di dalam kode Airflow. Jika terdapat pengaruh penundaan antar kueri dalam satu sesi, koneksinya mungkin sudah ditutup oleh server Postgres. Waktu tunggu koneksi habis Lingkungan Cloud Composer disetel ke sekitar 10 menit.
Perbaikan:
- Gunakan dekorator
airflow.utils.db.provide_session
. Dekorator ini menyediakan sesi yang valid ke database Airflow disession
dan menutup sesi dengan benar di akhir fungsi. - Jangan menggunakan fungsi yang berjalan lama tunggal. Sebagai gantinya, pindahkan semua database
untuk memisahkan fungsi, 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 dari DAG yang sama
Jika Anda ingin mengontrol durasi eksekusi DAG tunggal untuk DAG tertentu
berlangsung, maka Anda
dapat menggunakan
parameter DAG dagrun_timeout
yang harus dilakukan
begitu. Misalnya, jika Anda mengharapkan bahwa
satu DAG berjalan (terlepas dari,
eksekusi selesai dengan keberhasilan atau kegagalan) tidak boleh lebih dari 1 jam,
tetapkan parameter ini
ke 3600 detik.
Anda juga dapat mengontrol berapa lama waktu yang diperlukan untuk menjalankan satu tugas Airflow. Yang akan dilakukan
Jadi, Anda dapat menggunakan execution_timeout
.
Jika Anda ingin mengontrol jumlah operasi DAG aktif yang ingin Anda miliki untuk
DAG tertentu, Anda dapat menggunakan DAG [core]max-active-runs-per-dag
Opsi konfigurasi Airflow untuk melakukannya.
Jika Anda hanya ingin memiliki satu instance DAG yang berjalan dalam momen beri, setel
parameter max-active-runs-per-dag
menjadi 1
.
Masalah yang memengaruhi sinkronisasi DAG dan plugin ke penjadwal, pekerja, dan server web
Cloud Composer menyinkronkan konten /dags
dan /plugins
folder
ke penjadwal dan pekerja. Objek tertentu dalam folder /dags
dan /plugins
dapat mencegah sinkronisasi ini bekerja dengan benar atau setidaknya memperlambatnya.
/dags
folder disinkronkan ke penjadwal dan pekerja. Folder ini tidak disinkronkan ke server web di Cloud Composer 2 atau jika Anda mengaktifkanDAG Serialization
di Cloud Composer 1.Folder
/plugins
disinkronkan ke penjadwal, pekerja, dan server web.
Anda mungkin mengalami masalah berikut:
Anda mengupload file yang dikompresi gzip yang menggunakan transcoding kompresi ke
/dags
dan/plugins
folder. Ini biasanya terjadi jika Anda menggunakan flag--gzip-local-all
dalamgcloud storage cp
untuk mengupload data ke bucket.Solusi: Hapus objek yang menggunakan transcoding kompresi dan upload ulang kata kunci ke dalam bucket.
Salah satu objek bernama '.'—objek tersebut tidak disinkronkan ke penjadwal dan pekerja, dan mungkin berhenti disinkronkan sama sekali.
Solusi: Ganti nama objek yang bermasalah.
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 bernama sama dengan file Python DAG.
Salah satu objek dalam folder
/dags
atau/plugins
berisi simbol/
di akhir nama objek. Objek tersebut dapat menyesatkan proses sinkronisasi karena simbol/
berarti bahwa objek adalah folder, bukan file.Solusi: Hapus simbol
/
dari nama objek yang bermasalah.Jangan simpan file yang tidak diperlukan di folder
/dags
dan/plugins
.Terkadang DAG dan plugin yang Anda terapkan disertai dengan file tambahan, seperti file yang menyimpan pengujian untuk komponen ini. Ini file disinkronkan ke pekerja dan penjadwal dan mempengaruhi waktu yang dibutuhkan untuk menyalin file ini ke penjadwal, pekerja, dan server web.
Solusi: Jangan simpan file tambahan dan yang tidak diperlukan di
/dags
dan/plugins
folder.
Error Done [Errno 21] Is a directory: '/home/airflow/gcs/dags/...'
dihasilkan oleh penjadwal dan pekerja
Masalah ini terjadi karena objek dapat memiliki namespace yang tumpang tindih di Cloud Storage, sekaligus penjadwal dan pekerja menggunakan sistem file tradisional. Misalnya, dimungkinkan menambahkan folder dan objek bernama sama ke direktori VM dengan bucket. Saat bucket disinkronkan ke penjadwal dan pekerja lingkungan, {i>error<i} ini dihasilkan, 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) ada di dalam bucket, error-nya adalah
yang dihasilkan oleh penjadwal.
Gangguan sementara saat terhubung ke Airflow Metadata DB
Cloud Composer berjalan di atas infrastruktur cloud terdistribusi. Artinya, dari waktu ke waktu beberapa masalah sementara mungkin muncul dan mereka mungkin mengganggu eksekusi tugas Airflow Anda.
Dalam situasi seperti ini, Anda mungkin melihat pesan error berikut di kolom pekerja Airflow log:
"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 berjalan untuk lingkungan Cloud Composer Anda.
Biasanya error tersebut bersifat intermiten dan jika tugas Airflow Anda bersifat idempoten dan Anda telah mengonfigurasi percobaan ulang, Anda seharusnya kebal terhadapnya. Anda juga dapat pertimbangkan untuk menentukan masa pemeliharaan.
Salah satu alasan tambahan untuk kesalahan tersebut mungkin kurangnya sumber daya di gugusan lingkungan Anda. Dalam kasus tersebut, Anda dapat meningkatkan skala atau mengoptimalkan lingkungan seperti yang dijelaskan dalam Menskalakan lingkungan atau Petunjuk Mengoptimalkan lingkungan Anda.
Operasi DAG ditandai sebagai berhasil, tetapi tidak memiliki tugas yang dijalankan
Jika DAG yang berjalan execution_date
lebih awal dari start_date
DAG,
Anda mungkin melihat operasi DAG yang tidak memiliki tugas yang berjalan, tetapi masih ditandai sebagai berhasil.
Penyebab
Situasi ini dapat terjadi dalam salah satu kasus berikut:
Ketidakcocokan ini disebabkan oleh perbedaan zona waktu antara DAG
execution_date
danstart_date
. Hal itu mungkin saja terjadi, misalnya, ketika menggunakanpendulum.parse(...)
untuk menyetelstart_date
.start_date
DAG disetel ke nilai dinamis, misalnyaairflow.utils.dates.days_ago(1)
Solusi
Pastikan
execution_date
danstart_date
menggunakan zona waktu yang sama.Menentukan
start_date
statis dan menggabungkannya dengancatchup=False
untuk menghindari menjalankan DAG dengan tanggal mulai yang sudah lewat.
DAG tidak terlihat di UI Airflow atau UI DAG dan penjadwal tidak menjadwalkannya
Prosesor 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 lama waktu yang dimiliki prosesor 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 prosesor DAG apakah prosesor DAG dapat memproses dengan benar DAG Anda. 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. Dalam kasus 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:
Memperbaiki semua error penguraian DAG. Prosesor DAG menguraikan beberapa DAG, dan di Kasus yang jarang terjadi adalah 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
, kemudian tingkatkan waktu tunggu ini.Jika penguraian semua DAG memerlukan waktu lebih dari jumlah detik yang ditentukan inci
[core]dag_file_processor_timeout
, kemudian tingkatkan waktu tunggu ini.Jika DAG Anda membutuhkan waktu lama untuk diurai, itu juga bisa berarti bahwa itu tidak diimplementasikan secara optimal. Misalnya, jika server membaca variabel lingkungan, atau melakukan panggilan ke layanan eksternal atau Airflow di skrip untuk menyiapkan database. Sebisa mungkin, hindari melakukan operasi tersebut di global dari DAG.
Meningkatkan resource CPU dan memori untuk Scheduler agar dapat bekerja lebih cepat.
Meningkatkan jumlah proses pemroses DAG agar penguraian dapat dilakukan dengan lebih cepat. Anda dapat melakukannya dengan menambah nilai
[scheduler]parsing_process
Gejala database Airflow sedang dalam beban berat
Untuk informasi selengkapnya, lihat Gejala Airflow Database sedang di bawah tekanan beban.