0
0
Lập trình
Admin Team
Admin Teamtechmely

Hướng dẫn cài đặt Apache Airflow phiên bản nhẹ LocalExecutor bằng Docker Compose

Đăng vào 3 ngày trước

• 4 phút đọc

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:

Copy
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.
Copy
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_UIDAIRFLOW_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:
Copy
id -u #AIRFLOW_UID
id -g #AIRFLOW_GID

Bước 3: Tạo file airflow.requirements.txtairflow.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:
Copy
pandas
numpy
psycopg2-binary
  • airflow.Dockerfile: Cần thiết để chạy Airflow và không thể bỏ qua.
Copy
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:

Copy
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:

Copy
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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào