Operator dan task sering dianggap sama dalam percakapan sehari-hari, tetapi keduanya menunjuk hal yang berbeda di dalam Airflow. Topik ini memisahkan kedua istilah tersebut dan memetakan keluarga operator yang tersedia, baik yang dibundel bersama Airflow maupun yang disediakan paket integrasinya. Perbedaannya juga dibuktikan lewat satu DAG yang memuat dua kelas operator. Setelah topik ini dibaca, pilihan operator untuk kebutuhan pipeline tertentu dapat dipertimbangkan dengan dasar yang jelas, bukan sekadar meniru contoh.
Hubungan operator dan task#
Operator adalah kelas Python yang mengemas logika siap pakai untuk satu jenis pekerjaan, misalnya menjalankan perintah shell atau memanggil fungsi Python. Task adalah unit eksekusi di dalam DAG. Sebuah task tercipta saat operator dibuat sebagai objek dengan task_id tertentu. Dokumentasi resmi menyebut operator sebagai template untuk task yang telah didefinisikan sebelumnya, sedangkan task menyatakan unit eksekusi generik milik DAG. Dengan kata lain, satu kelas operator dapat menghasilkan banyak task, dan setiap task membawa salinan konfigurasinya sendiri.
Hubungan keduanya terlihat pada kode pembuatan task. Baris PythonOperator(task_id="hitung_luas", python_callable=hitung_luas) menggunakan satu kelas operator dan menghasilkan satu task bernama hitung_luas. Kelas yang sama dapat digunakan lagi untuk task lain dengan fungsi yang berbeda, dan task_id wajib unik di dalam satu DAG karena menjadi nama task pada graf, log, dan UI. Perbedaan ini penting ketika membaca pesan error, karena pesan error selalu menyebut task_id, bukan nama kelas operatornya.
Keluarga operator#
Operator tidak seluruhnya dibundel bersama inti Airflow. Sebagian besar operator disediakan sebagai paket provider, yakni paket pip terpisah yang menampung integrasi dengan layanan luar. Operator Python dan Bash berada pada provider bernama apache-airflow-providers-standard yang terpasang secara default bersama Airflow 3, sedangkan operator untuk basis data, layanan web, dan cloud tersedia pada provider lain yang dipasang sesuai kebutuhan.
Sensor juga berupa operator, hanya saja tugasnya menunggu suatu peristiwa terjadi sebelum dianggap berhasil. Sementara itu, istilah deferrable menyatakan mode eksekusi yang membuat task menunggu tanpa menempati slot worker, yakni kapasitas eksekusi task pada worker. Mode ini tersedia pada operator atau sensor tertentu.
Tabel berikut merangkum keluarga yang paling sering ditemui beserta contohnya.
| Keluarga | Contoh operator | Paket sumber |
|---|---|---|
| Standard | PythonOperator, BashOperator, EmptyOperator, TriggerDagRunOperator | apache-airflow-providers-standard |
| SQL umum | SQLExecuteQueryOperator | apache-airflow-providers-common-sql |
| HTTP | HttpOperator, HttpSensor | apache-airflow-providers-http |
| Sensor | FileSensor, ExternalTaskSensor | apache-airflow-providers-standard |
| Deferrable | TimeSensorAsync dan operator dengan argumen deferrable=True | paket provider masing-masing |
| Cloud | S3CreateBucketOperator (AWS), BigQueryInsertJobOperator (Google Cloud) | apache-airflow-providers-amazon, apache-airflow-providers-google |
Baris standard memuat operator serbaguna yang tidak memerlukan layanan luar. EmptyOperator menghasilkan task tanpa pekerjaan apa pun dan berguna untuk menjaga struktur pada graf bercabang, sedangkan TriggerDagRunOperator memicu DAG lain dari dalam sebuah task. Baris sensor dan deferrable sama-sama menyangkut penantian, tetapi keduanya berada pada lapisan yang berbeda. Sensor mendefinisikan jenis task, sedangkan deferrable hanya menyatakan mode eksekusi. Baris cloud menunjukkan pola umum provider besar, yakni satu paket provider untuk satu layanan cloud beserta banyak operator di dalamnya.
Pemasangan provider dilakukan dengan pip sebagaimana paket Python lainnya, misalnya pip install apache-airflow-providers-http untuk provider HTTP. Versi provider yang cocok dengan Airflow terpasang sebaiknya dikunci menggunakan berkas constraint resmi agar pemasangan tidak memicu konflik dependensi. Daftar lengkap operator dan sensor tiap provider ada pada dokumentasi paketnya, dan jumlahnya terus bertambah seiring rilis baru. Untuk kebutuhan yang tidak tercakup operator siap pakai, TaskFlow API mengemas fungsi Python buatan sendiri menjadi task tanpa perlu menulis kelas operator baru.
Dua keluarga dalam satu DAG#
Berkas dag_operator.py berikut memuat dua task yang berasal dari dua kelas operator berbeda. Task pertama menjalankan fungsi Python untuk menghitung luas persegi panjang, sedangkan task kedua mengeksekusi perintah shell untuk mencetak pesan singkat.
from airflow.providers.standard.operators.bash import BashOperator
from airflow.providers.standard.operators.python import PythonOperator
from airflow.sdk import dag
def hitung_luas() -> None:
"""Menghitung luas persegi panjang dengan nilai tetap."""
panjang, lebar = 8, 5
print(f"Luas: {panjang * lebar}")
@dag(
dag_id="dag_operator",
schedule=None,
description="Dua keluarga operator pada satu DAG: Python dan Bash.",
)
def dag_operator():
hitung = PythonOperator(
task_id="hitung_luas",
python_callable=hitung_luas,
)
salam = BashOperator(
task_id="salam",
bash_command="echo 'Perhitungan selesai'",
)
dag_operator()Perhatikan bahwa python_callable menerima nama fungsi tanpa tanda kurung. Operator hanya menyimpan rujukan fungsi tersebut dan memanggilnya saat task berjalan. Kedua task pada DAG ini tidak saling dihubungkan, sehingga keduanya berdiri sendiri dan Airflow bebas menjalankannya secara paralel.
Kelas operator di balik setiap task dapat diverifikasi lewat pemeriksaan struktur berikut.
# muat DAG lalu cetak task_id beserta nama kelas operatornya
python3 -c "import dag_operator; d = dag_operator.dag_operator(); print(sorted((t.task_id, type(t).__name__) for t in d.tasks))"[('hitung_luas', 'PythonOperator'), ('salam', 'BashOperator')]Keluaran menegaskan hubungan operator dan task secara konkret. Setiap pasangan memuat task_id di posisi pertama dan nama kelas operatornya di posisi kedua, yaitu PythonOperator untuk task hitung_luas dan BashOperator untuk task salam. Pemeriksaan type(t).__name__ semacam ini berguna ketika DAG dibangun secara dinamis, karena jenis operator tiap task tidak selalu terlihat dari kode pembentuknya.
Ringkasan#
- Operator adalah kelas dengan logika siap pakai, sedangkan task adalah objek hasil pembuatan operator di dalam DAG dengan
task_idyang unik. - Keluarga operator terbagi menurut paket sumbernya, mulai dari provider standard yang berisi
PythonOperator,BashOperator,EmptyOperator, danTriggerDagRunOperatorsampai provider cloud seperti Amazon dan Google. - Sensor adalah operator yang menunggu peristiwa, dan deferrable adalah mode eksekusi untuk menunggu tanpa menempati slot worker.
- Nama kelas operator pada setiap task dapat diperiksa lewat
type(t).__name__setelah DAG diparse.
Referensi#
- Operators — Apache Airflow — Definisi operator, hubungannya dengan task, dan daftar operator yang populer pada inti serta provider.
- Tasks — Apache Airflow — Tiga jenis task pada Airflow, yaitu operator, sensor, dan task TaskFlow.
- apache-airflow-providers-standard — Apache Airflow — Paket provider yang menampung operator dan sensor standar pada Airflow 3.