Topik ini menjadi landasan konsep bagi seluruh jalur Apache Airflow. Pembahasan dimulai dari keterbatasan cron ketika dihadapkan pada pipeline data multi-langkah. Selanjutnya, DAG dan task diperkenalkan sebagai konsep dasar Airflow, dan topik ditutup dengan prinsip definisi pipeline sebagai kode Python. Setelah membaca topik ini, perbedaan antara penjadwal sederhana dan orkestrator pipeline dapat dijelaskan beserta alasan di baliknya.
Keterbatasan cron pada pipeline multi-langkah#
Cron adalah penjadwal bawaan sistem Unix yang menjalankan perintah pada pola waktu tertentu, misalnya setiap pukul 02.00. Untuk perintah tunggal yang berulang, cron memadai dan hemat sumber daya. Masalah muncul ketika pekerjaan bukan lagi satu perintah, melainkan pipeline, yaitu rangkaian proses data yang saling bergantung. Contohnya adalah mengambil catatan sensor suhu, membersihkan nilainya, menghitung rata-rata harian, lalu menyimpan hasilnya ke arsip. Setiap langkah harus berhasil agar langkah berikutnya bekerja pada data yang benar.
Cron tidak menyediakan mekanisme untuk dependensi antar langkah semacam itu, termasuk retry, yaitu percobaan ulang otomatis atas langkah yang gagal. Tabel berikut merangkum perbandingan cron dengan orkestrator pipeline seperti Airflow.
| Aspek | cron | Orkestrator pipeline |
|---|---|---|
| Graf dependensi antar langkah | Tidak dikenal, tiap entri berdiri sendiri | Dinyatakan eksplisit dalam kode |
| Percobaan ulang yang terstruktur | Tidak ada, ditangani skrip sendiri | Ada, per task dengan jumlah percobaan dan jeda yang diatur |
| Status antar langkah | Tidak tersimpan | Tersimpan per task dan per eksekusi |
| Eksekusi ulang interval lampau (backfill) | Ditulis manual | Fitur bawaan |
| Tampilan status | Tidak ada, log dibaca manual | Antarmuka web dengan status tiap task |
Keterbatasan tersebut semakin terasa pada pipeline berukuran besar. Apabila langkah kedua dari lima langkah gagal, cron tidak mengetahui kegagalan tersebut dan tetap menjalankan langkah ketiga pada jadwalnya. Akibatnya, data yang belum selesai diproses dapat menyebar ke tahap berikutnya tanpa terdeteksi. Cron juga membiarkan dua eksekusi yang tumpang tindih. Apabila eksekusi sebelumnya belum selesai ketika jadwal berikutnya tiba, cron tetap memulai proses baru, sehingga dua proses dari pekerjaan yang sama bekerja pada data yang sama.
Deteksi, penanganan, dan eksekusi ulang semuanya menjadi pekerjaan manual pengelola. Kebutuhan itulah yang mendorong pengembangan orkestrator pipeline, yaitu perangkat lunak yang tidak hanya menjadwalkan, tetapi juga mengenal dependensi, mencatat status, dan menyediakan tindakan pemulihan.
DAG dan task#
Airflow merepresentasikan sebuah pipeline sebagai DAG, singkatan dari directed acyclic graph, yaitu graf berarah tanpa siklus. DAG berisi kumpulan task, unit kerja terkecil yang dapat dijadwalkan, mulai dari menarik berkas, menjalankan kueri SQL, sampai mengirim ringkasan. Setiap task digambarkan sebagai simpul (node), sedangkan dependensi antar task digambarkan sebagai sisi berarah (edge). Graf berarah berarti urutan antar task jelas, sedangkan tanpa siklus berarti tidak ada task yang bergantung pada dirinya sendiri secara berantai. Dengan demikian, urutan eksekusi selalu dapat ditentukan.
Jadwal melengkapi definisi DAG. Jadwal menyatakan seberapa sering DAG dipicu, misalnya setiap hari. Pada setiap interval tersebut, scheduler, yaitu komponen Airflow yang menangani penjadwalan, membuat dag run baru. Dengan demikian, satu DAG yang sama menghasilkan banyak dag run dari waktu ke waktu, dan setiap dag run mencatat status task-nya secara terpisah. Airflow juga dapat menjalankan ulang dag run untuk interval waktu lampau melalui fitur backfill, sehingga memuat ulang riwayat tidak perlu ditulis manual.
Bentuk konkret DAG terlihat pada pipeline catatan sensor suhu. Task pertama menarik berkas catatan harian, task kedua membersihkan nilai yang tidak wajar, task ketiga menghitung rata-rata, dan task keempat menyimpan hasil ke arsip. Dependensi antar keempat task membentuk rantai lurus tanpa percabangan. DAG yang lebih besar dapat menggabungkan percabangan dan penyatuan task tanpa mengubah cara pembacaannya, karena prinsip simpul dan sisi berarah tetap sama.
Pipeline sebagai kode Python#
Definisi DAG dalam Airflow ditulis sebagai berkas Python. Nama DAG, jadwal, daftar task, dan dependensinya berada di satu tempat yang dapat disimpan di repository, direview sebelum digabungkan, dan diuji seperti kode program lainnya. Dependensi dinyatakan dengan operator >> di antara dua task, misalnya ambil_suhu >> bersihkan_data yang berarti bersihkan_data dijalankan setelah ambil_suhu selesai. Karena seluruh graf berada di dalam kode, perubahan pipeline mengikuti alur kerja perangkat lunak, lengkap dengan riwayat revisi.
Inti gagasan pipeline sebagai kode dapat dimodelkan dengan struktur data sederhana. Berkas berikut menyatakan pipeline sebagai dictionary, yaitu struktur data pasangan kunci dan nilai. Kunci adalah nama task, sedangkan nilainya berupa daftar prasyarat task. Urutan eksekusi kemudian ditentukan hanya dari struktur tersebut.
pipeline = {
"ambil_suhu": [],
"bersihkan_data": ["ambil_suhu"],
"hitung_rata_rata": ["bersihkan_data"],
"kirim_laporan": ["hitung_rata_rata"],
}
selesai = set()
while len(selesai) < len(pipeline):
for task, prasyarat in pipeline.items():
if task not in selesai and all(p in selesai for p in prasyarat):
print(f"menjalankan {task}")
selesai.add(task)menjalankan ambil_suhu
menjalankan bersihkan_data
menjalankan hitung_rata_rata
menjalankan kirim_laporanPerulangan pada berkas tersebut memilih task yang prasyaratnya sudah selesai. Urutan eksekusi tidak dituliskan secara eksplisit, tetapi muncul dari struktur graf. Airflow melakukan pekerjaan yang sama pada skala lebih besar, yaitu membaca definisi, memvalidasi graf, mengurutkan task, menjadwalkannya, dan mencatat status setiap task instance. Definisi DAG yang sesungguhnya di Airflow mengikuti pola yang sama, dengan dependensi dinyatakan melalui kode dan urutan eksekusi dihitung oleh scheduler.
Ringkasan#
- Cron memadai untuk satu perintah berulang, tetapi tidak menyediakan graf dependensi, retry terstruktur, status antar langkah, backfill, maupun tampilan status.
- Airflow merepresentasikan pipeline sebagai DAG, yaitu graf berarah tanpa siklus yang berisi task dan dependensinya, dipicu sesuai jadwal dalam bentuk dag run.
- Task adalah unit kerja terkecil, dan setiap eksekusinya di dalam dag run dicatat sebagai task instance beserta statusnya.
- Mendefinisikan pipeline sebagai kode Python membuat perubahan dapat direview, disimpan di repository, dan diuji sebagaimana kode program pada umumnya.
Referensi#
- Architecture Overview — Dokumentasi Apache Airflow — Menguraikan definisi workflow sebagai DAG beserta komponen Airflow yang menjalankannya.
- Dags — Dokumentasi Apache Airflow — Menjelaskan struktur DAG, task, dan cara Airflow membaca definisinya.
- Dag Runs — Dokumentasi Apache Airflow — Membahas dag run, task instance, dan statusnya.