Airflow 是由 Airbnb 所貢獻的 Apache 頂級專案,用於流程控制,建立有向無環的工作流程(DAGs) ,以事件排程的方式部屬我們的 DAG Schedule 並可以部屬到各個雲端平台上, GCP / AWS / Azure,可透過網頁 UI 調配部屬排程,主打彈性、高擴充性、搭配Jinja Template Engine 優雅的設計 Workflow 工作流程!
1.建置 Airflow 環境 - 使用 Docker
下載官方提供 docker-compose 文件
curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.2.4/docker-compose.yaml'
產生相依目錄並設定 Airflow 使用者權限
mkdir -p ./dags ./logs ./plugins echo -e "AIRFLOW_UID=$(id -u)" > .env
2.資料庫初始化
docker-compose up airflow-init
3.啟動 Airflow 服務
docker-compose up -d
4.下載 airflow 命令工具
curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.1.1/airflow.sh' chmod +x airflow.sh
5.撰寫 Demo 程式
將我們第一隻 DAGs 程式放至於 Container掛載目錄 dags 下
dags/test_app_v1.py
import time from datetime import datetime, timedelta from airflow import DAG from airflow.operators.python import PythonOperator default_args = { 'owner' : '', 'start_date' : datetime(2022, 1, 1, 0, 0), 'schedule_interval': '@daily', 'retries':2, 'retry_delay': timedelta(minutes = 1) } def fn_one(): print('execute jobs') with DAG('test_app_v1' ,default_args=default_args) as dag: tesk = PythonOperator( task_id = 'one', python_callable=fn_one )
6.透過 airflow.sh 將執行我們的 DAG 程式
# 建立運行 python container ./airflow.sh bash # 執行 python 檔案 python dags/test_app_v1.py
7.網頁中查看新建立的 test_app_v1 DAG
Airflow Web Server
http://localhost:8080
airflow/airflow
在執行py腳本後我們就可以在 Airflow 首頁中查找到我們的 DAG 排程 !
8.REST API
使用 Airflow Rest Api 可以取代我們在 WebUI 上的工作,進行 DAG 的抓取執行刪除等工作。
https://airflow.apache.org/docs/apache-airflow/stable/stable-rest-api-ref.html
curl -X GET 'http://10.1.200.67:8080/api/v1/dags' --user "airflow:airflow"
{ "dag_id": "test_app_v1", "description": null, "file_token": "", "fileloc": "/opt/airflow/dags/test_app_v1.py", "is_active": true, "is_paused": false, "is_subdag": false, "owners": [], "root_dag_id": null, "schedule_interval": { "__type": "TimeDelta", "days": 1, "microseconds": 0, "seconds": 0 }, "tags": [] }
Conclusion
很多需要進行排定的工作項目都可以在 Airflow 的幫助下進行運行,搭配 python的語法可以很快速的撰寫爬蟲、資料轉換、事件觸發等工作,Airflow 提供WebUI操作畫面可以讓我們更便利的去對我們的 DAGs 進行監控,解決了我們在設計排程上的諸多困難!
Top comments (0)