Bạn đã bao giờ thắc mắc tại sao khi khởi động Airflow trên máy tính cá nhân hoặc máy chủ tại nhà để học tập và thử nghiệm DAG lại tiêu tốn nhiều tài nguyên như vậy chưa? Gần đây, mình đã thử chạy Airflow trên một server với 4GB RAM và đôi khi cảm thấy nó bị đứng ngay cả khi không làm gì cả, không thể viết hoặc lên lịch cho bất kỳ DAG nào.
Bài viết này sẽ đưa ra giải pháp cho vấn đề đó với một stack Apache Airflow nhẹ, có mức tiêu thụ RAM chưa đến 1GB trong trạng thái idle. 🤭
Để bắt đầu nhanh chóng, hãy tìm đến phần "Cài đặt Apache Airflow bằng Docker Compose".
Làm thế nào để tối ưu hóa Airflow?
Trước khi đi vào chi tiết cách tạo một phiên bản nhẹ hơn của Airflow, chúng ta hãy điểm qua các thành phần mặc định có trong stack Airflow. Theo tài liệu chính thức, stack mặc định bao gồm:
- postgres: Cơ sở dữ liệu của Airflow (BẮT BUỘC)
- airflow-scheduler: Đảm nhiệm việc lên lịch cho tất cả các tác vụ và DAG (BẮT BUỘC)
- airflow-webserver: Giao diện người dùng tại
http://<IP>:8080
(BẮT BUỘC) - airflow-init: Dịch vụ khởi tạo kết nối giữa scheduler, webserver và cơ sở dữ liệu Postgres (BẮT BUỘC)
- airflow-worker: Thực thi các tác vụ được giao bởi airflow-scheduler.
- flower: Dùng để giám sát các cụm Celery.
- redis: Được sử dụng như một máy chủ caching, phục vụ cho các cụm Celery.
Các dịch vụ bắt buộc (BẮT BUỘC) là rất cần thiết cho việc vận hành của Airflow. Nhưng với việc sử dụng Airflow ở môi trường local, chúng ta không cần đến việc mở rộng số lượng workers (tức là không cần CeleryExecutor). Điều này có nghĩa là chúng ta có thể loại bỏ một số thành phần không cần thiết để giảm thiểu tài nguyên sử dụng.
Nói một cách cụ thể, chúng ta sẽ loại bỏ các dịch vụ liên quan tới CeleryExecutor, bao gồm:
- airflow-worker
- flower
- redis
Ta cũng sẽ cần thay đổi biến AIRFLOW__CORE__EXECUTOR
từ CeleryExecutor thành LocalExecutor.
Lưu ý: Giải pháp này không thích hợp cho môi trường PRODUCTION, vì không có CeleryExecutor (multi-node) đồng nghĩa với việc Airflow chỉ đang chạy trên một node (single-node) với LocalExecutor, chỉ phù hợp cho mục đích LOCAL TESTING.
Cài đặt Apache Airflow bằng Docker Compose
Bước 1: Tạo các thư mục cần thiết để tránh việc container tự tạo và lỗi permissions:
mkdir -p scripts dags logs plugins
Bước 2: Tạo file .env
với các biến sau:
- Sử dụng image
slim
để tối ưu hóa kích thước, ví dụ:apache/airflow:slim-2.9.3
(tuỳ vào nhu cầu sử dụng của bạn). - Đừng quên thay đổi username và password để đăng nhập vào Airflow Webserver.
AIRFLOW_IMAGE_NAME=apache/airflow:slim-2.9.3
AIRFLOW_UID=1000
AIRFLOW_GID=1000
_AIRFLOW_WWW_USER_USERNAME=changeme
_AIRFLOW_WWW_USER_PASSWORD=changeme
AIRFLOW_UID
vàAIRFLOW_GID
phải được điều chỉnh trùng với máy tính local của bạn để tránh lỗi permissions. Bạn có thể lấy UID và GID bằng lệnh:
id -u #AIRFLOW_UID
id -g #AIRFLOW_GID
Bước 3: Tạo file airflow.requirements.txt
và airflow.Dockerfile
trong cùng một thư mục với file .env
.
airflow.requirements.txt
: chứa các gói cần thiết cho PythonExecutor của Airflow. Thường thì mình cài đặt 3 gói Python:
pandas
numpy
psycopg2-binary
airflow.Dockerfile
: Cần thiết để chạy Airflow và không thể bỏ qua.
ARG AIRFLOW_IMAGE_NAME
FROM ${AIRFLOW_IMAGE_NAME}
ENV AIRFLOW_HOME=/opt/airflow
WORKDIR $AIRFLOW_HOME
USER root
RUN apt-get update -qq && apt-get install -y python3-pip
COPY airflow.requirements.txt .
RUN python3 -m pip install --upgrade pip
RUN python3 -m pip install --no-cache-dir -r airflow.requirements.txt
COPY scripts scripts
RUN chmod +x scripts
USER $AIRFLOW_UID
Bước 4: Tạo file docker-compose.yml
đã được đơn giản hóa:
version: '3.7'
services:
postgres:
image: postgres:13
environment:
POSTGRES_USER: airflow
POSTGRES_PASSWORD: airflow
POSTGRES_DB: airflow
volumes:
- postgres-db-volume:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "airflow"]
interval: 10s
retries: 5
restart: always
airflow-webserver:
image: ${AIRFLOW_IMAGE_NAME}
ports:
- "8080:8080"
environment:
- AIRFLOW__CORE__EXECUTOR=LocalExecutor
- AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow
depends_on:
postgres:
condition: service_healthy
airflow-scheduler:
image: ${AIRFLOW_IMAGE_NAME}
environment:
- AIRFLOW__CORE__EXECUTOR=LocalExecutor
- AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow
depends_on:
postgres:
condition: service_healthy
volumes:
postgres-db-volume:
Bước 5: Khởi động tất cả các dịch vụ bằng lệnh sau:
docker-compose up -d
Bước 6: Truy cập vào http://localhost:8080 và đăng nhập với username/password đã định nghĩa trong file .env
.
Hy vọng bài viết này sẽ hữu ích cho bạn trong quá trình làm việc với Apache Airflow! 🎉
Tài liệu tham khảo
- Tài liệu chính thức: https://airflow.apache.org/docs/
- Repo mẫu: https://github.com/guoliveira/data-engineer-zoomcamp-project
source: viblo