這兩天內容會根據實際的專案架構和環境切分來說明,這些都只是我個人的使用方法,不代表適用所有datapipeline 專案,如果有更好的方式和工具也可以推薦給我~
{Data Pipeline MVP}
├── Dockerfile
├── Makefile
├── buildspec_deploy.yml
├── buildspec_test.yml
├── dags
│   └── simple_task_group.py
├── dbt
│   └── jaffle_shop
│   │   └── .sqlfluff
├── docker-compose.override.yml
├── docker-compose.yaml
├── fabfile.py
├── logs
├── plugins
├── requirements.txt
├── ruff.toml
├── tests
│   ├── dags
│   └── data
└── venv
Dockerfile: 定義了用在建立 Airflow 容器 Image 的內容。Makefile: 用於簡化常用指令,例如建立環境、測試、部署等。buildspec_deploy.yml 和 buildspec_test.yml: 這些是用於 CI/CD 當中 AWS CodeBuild 的設定,分別用於部署和測試流程。dags/: 存放 Airflow DAG 文件的目錄dbt/: 包含 dbt 專案文件。jaffle_shop 就是是之前示範的 dbt 專案,代表可以同時管理多個 dbt 專案。docker-compose.override.yml 和 docker-compose.yaml: Docker Compose 設定文件,用於定義和管理多容器 Docker 應用。fabfile.py: Fabric 模組的設定 py 檔,用於自動化部署和管理任務。logs/: 儲存 Airflow 紀錄的目錄。plugins/: 用於存放自定義 Airflow 插件的目錄。requirements.txt: 列出專案的 Python 所需模組。ruff.toml: Python linter Ruff 的設定文件。tests/: 包含測試文件的目錄,分為 DAG 測試和數據測試。venv/: Python 虛擬環境目錄,用於執行測試專案。.env 區分環境變數將 docker environment 的參數搬到 .env,方便後續可以區分 local、dev、staging、production、main做區分,到底要分為幾個環境和設定,主要依照各團隊不同的開發流程和習慣,通常最基本會有兩個,至少不太可能直接在 server 上開發吧~
# Airflow Core
AIRFLOW__CORE__FERNET_KEY=''
AIRFLOW__CORE__EXECUTOR=CeleryExecutor
AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION=True
AIRFLOW__CORE__LOAD_EXAMPLES=False
AIRFLOW_UID=50000
AIRFLOW_GID=0
# Airflow Metadata DB
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow
AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://airflow:airflow@postgres/airflow
AIRFLOW__API__AUTH_BACKENDS=airflow.api.auth.backend.basic_auth,airflow.api.auth.backend.session
AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0
AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK=True
# Airflow Init
_AIRFLOW_DB_MIGRATE=True
_AIRFLOW_WWW_USER_CREATE=True
_AIRFLOW_WWW_USER_USERNAME=airflow
_AIRFLOW_WWW_USER_PASSWORD=airflow
# Airflow Connection
AIRFLOW_CONN_AIRFLOW_METADATA_DB=postgresql+psycopg2://airflow:airflow@postgres:5432/airflow
# Airflow Worker
DUMB_INIT_SETSID=0
# Airflow Cli
CONNECTION_CHECK_MAX_COUNT=0
# dbt
DBT_THREADS=1
DBT_HOST=localhost
DBT_POST=5432
DBT_USER=airflow
DBT_PWD=airflow
DBT_DBNAME=airflow
DBT_SCHEMA=dbt
上方大部分都是本來 docker-compose.yml 的設定,比較特別需要注意的有兩個地方,# Airflow Connection 和 #dbt 區塊:
# Airflow Connection:設定之後可以不用到 Web UI 設定就能連接,服務清空重啟也不用重新設定連接,設定方式就是將之後要用的 conn_id 放在 AIRFLOW_CONN 後面,像是這樣AIRFLOW_CONN_{conn_id}
#dbt:將在 profile.yml 使用的內容另外放到環境變數,本地、測試、正式就可以直接加在 .env 當中,而且要記得 profile.yml 要修改成下方:airflow_db:
  outputs:
    dev:
      type: postgres
      threads: '{{env_var("DBT_THREADS")}}'
      host: '{{env_var("DBT_HOST")}}'
      port: '{{env_var("DBT_POST")}}'
      user: '{{env_var("DBT_USER")}}'
      pass: '{{env_var("DBT_PWD")}}'
      dbname: '{{env_var("DBT_DBNAME")}}'
      schema: '{{env_var("DBT_SCHEMA")}}'
  target: dev
之前將
'{{env_var("DBT_SCHEMA")}}'的寫法改成"{{env_var('DBT_SCHEMA')}",結果竟然就會無法抓到,到現在還是很困惑,是原始碼雙引號和單引號不通用嗎、還是分析樹沒寫好
docker-compose.override.yml 區分環境服務docker override 可以當作是 docker-compose.yml 的擴充,所以通常會設定基本的基礎服務在 docker-compose.yml,另外在將每個環境需要的服務或設定放到 docker-compose.override.yml,範例程式碼如下:
version: "3.9"
x-airflow-common:
  depends_on: &airflow-common-depends-on
    redis:
      condition: service_healthy
    postgres:
      condition: service_healthy
services:
  postgres:
    image: postgres:13
    environment:
      POSTGRES_USER: airflow
      POSTGRES_PASSWORD: airflow
      POSTGRES_DB: airflow
    volumes:
      - postgres-db-volume:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "airflow"]
      interval: 10s
      retries: 5
      start_period: 5s
    restart: always
  airflow-webserver:
    ports:
      - "8080:8080"
volumes:
  mysql-db-volume:
docker-compose.override.yml 文件主要是為了覆寫或擴展 docker-compose.yml 文件中的設定,因為遠端 server 通常會連接到另外開的 metadata db,所以在本地端的測試才需要另外開啟 Postgres 服務,或是如果 server 上的 8080 已經開別的服務的話,也可以用 docker-compose.override.yml 來覆蓋原來開的 port
docker-compose.yml 修改範例基本上就是所有的 environment 區塊都改成 env_file
environment:
  &airflow-common-env
  ...
↓
env_file:
  - .env
需要修改的有四個區塊 x-airflow-common、airflow-worker、airflow-init、airflow-cli
x-airflow-common:
  &airflow-common
  build:
    context: .
 
  env_file:
    - .env
  
  airflow-worker:
    env_file:
      - .env
 
  airflow-init:
    env_file:
      - .env
  airflow-cli:
    env_file:
      - .env
詳細的內容可以參考這個檔案
明天會繼續說明剩下的設定,主要是 CI/CD 的相關設定~