Apache Airflow là nền tảng mã nguồn mở để lập trình, lập lịch và giám sát workflow. Bài này làm rõ Airflow giải quyết vấn đề gì, các khái niệm nền tảng (DAG, Task, Operator, DAG Run...) và cách các thành phần Scheduler, Webserver, Worker, Executor, Metadata DB phối hợp với nhau.
Apache Airflow là công cụ điều phối workflow (workflow orchestration): bạn mô tả một chuỗi công việc và sự phụ thuộc giữa chúng bằng code Python, Airflow sẽ lo việc chạy đúng thứ tự, đúng lịch, tự retry khi lỗi và cho bạn giao diện theo dõi.
Thay vì gom nhiều dòng cron rời rạc (khó biết job nào phụ thuộc job nào, lỗi thì im lặng), Airflow cho phép khai báo cả pipeline như một đồ thị có hướng. Các trường hợp dùng điển hình:
| Khái niệm | Ý nghĩa |
|---|---|
| DAG | Directed Acyclic Graph — đồ thị có hướng, không chu trình, mô tả toàn bộ workflow: gồm những task nào và phụ thuộc ra sao. Một file .py = một (hoặc nhiều) DAG. |
| Task | Một đơn vị công việc (một node trong DAG), ví dụ "tải file", "transform", "load". Task được tạo bằng cách khởi tạo một Operator. |
| Operator | Khuôn mẫu định nghĩa loại công việc của một task: BashOperator chạy lệnh shell, PythonOperator gọi hàm Python, PostgresOperator chạy SQL... |
| Task Instance | Một lần chạy cụ thể của một task cho một thời điểm logic nhất định. Có trạng thái: success, failed, running, up_for_retry... |
| DAG Run | Một lần thực thi toàn bộ DAG cho một khoảng thời gian (data interval). Mỗi DAG Run chứa nhiều Task Instance. |
| schedule_interval | Tần suất chạy DAG: preset (@daily, @hourly), biểu thức cron (0 6 * * *), hoặc timedelta. Airflow 2 dùng tham số tên schedule. |
| start_date | Mốc thời gian DAG bắt đầu có hiệu lực lập lịch. Quyết định DAG Run đầu tiên. |
| catchup | Nếu True, khi bật DAG Airflow sẽ chạy bù mọi khoảng từ start_date tới hiện tại. Thường đặt False để tránh "bão" DAG Run. |
| backfill | Chạy lại DAG cho một dải ngày trong quá khứ một cách chủ động (qua lệnh CLI airflow dags backfill) — hữu ích khi sửa logic và cần xử lý lại lịch sử. |
@daily với start_date hôm qua sẽ chạy lần đầu sau khi khoảng ngày hôm qua kết thúc. Đặt catchup=False để chỉ chạy khoảng mới nhất, tránh chạy bù toàn bộ lịch sử ngoài ý muốn.Một cài đặt Airflow gồm vài tiến trình phối hợp quanh một cơ sở dữ liệu trung tâm:
| Thành phần | Vai trò |
|---|---|
| Scheduler | Bộ não: định kỳ parse các file DAG, xác định task nào đến hạn, tạo DAG Run/Task Instance và đẩy chúng vào hàng đợi để Executor chạy. |
| Webserver (UI) | Giao diện web ở cổng 8080 để xem DAG, trạng thái, log, trigger thủ công, quản lý Connections/Variables. |
| Worker | Tiến trình thực sự chạy task (có khi nhiều máy). Với CeleryExecutor/KubernetesExecutor, worker tách riêng khỏi Scheduler. |
| Executor | Cơ chế quyết định task chạy ở đâu và song song thế nào — chạy cục bộ, qua Celery, hay Kubernetes (xem bảng dưới). |
| Metadata DB | Cơ sở dữ liệu (thường Postgres) lưu mọi trạng thái: DAG Run, Task Instance, Connections, Variables, XCom, user. Là "nguồn sự thật" của hệ thống. |
dags/ theo chu kỳ (mặc định vài chục giây). Vì vậy code ở cấp module trong file DAG (ngoài hàm task) sẽ chạy mỗi lần parse — tránh đặt truy vấn DB/HTTP nặng ở cấp module, nếu không Scheduler sẽ ì ạch.| Executor | Đặc điểm | Khi nào dùng |
|---|---|---|
| SequentialExecutor | Chạy một task tại một thời điểm, không song song; dùng SQLite. Mặc định khi mới cài. | Chỉ để thử nhanh / demo. Không dùng thật. |
| LocalExecutor | Chạy nhiều task song song bằng subprocess trên cùng một máy với Scheduler. | Lab, dev, hoặc production nhỏ một node (đây là cái lab Docker dùng). |
| CeleryExecutor | Phân phối task tới nhiều worker qua message broker (Redis/RabbitMQ). Scale ngang được. | Production tải lớn, cần nhiều worker và độ co giãn. |
| KubernetesExecutor | Mỗi task chạy trong một Pod riêng, sinh động theo nhu cầu, tự dọn sau khi xong. | Đã có cụm Kubernetes, cần cô lập tài nguyên và scale theo từng task. |
LocalExecutor + Postgres (qua Docker Compose chính thức) là đủ — vừa song song được vừa giống production một node.