samwellwang

samwellwang

coder
twitter

airflow的安裝體驗

Airflow 簡介#

Apache Airflow™ 是一個開源平台,用於開發、調度和監控面向批處理的工作流程。 Airflow 的可擴展 Python 框架使您能夠構建與幾乎任何技術連接的工作流程。 Web 介面有助於管理工作流程的狀態。 Airflow 可以通過多種方式進行部署,從筆記本電腦上的單個進程到支持最大工作流程的分佈式設置。

實現目標#

結合我們自己的郵件 ETL 工程,把流程調度方面的工作抽離出來交給 airflow,部署方式是通過業務工程本身的虛擬環境安裝 airflow,將其作為業務工程的一部分是比較簡單的方案,正常應該是將兩者解耦,考慮到這期目的簡單,流程數少,也僅僅為當前的業務工程服務,如果未來有其他的工程需要用到 airflow 再考慮解耦問題。

安裝步驟#

export AIRFLOW_HOME=/工程目錄/airflow

指定一個系統變量 AIRFLOW_HOME 為當前工程目錄下的 airflow 文件夾,作用是把 airflow 的配置文件、log 文件夾、dag 文件夾、plugin 文件夾、sqlite 數據庫文件放到當前工程目錄,否則 airflow 會自動在 /home 目錄建立次文件夾

AIRFLOW_VERSION=2.7.3

# 提取您已安裝的Python版本。如果您當前使用的Python版本不受Airflow支持,您可能需要手動設置此值。
# 請參閱上面支持的版本。
PYTHON_VERSION="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)"

CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt"
# 例如,這將使用Python 3.8安裝2.7.3版本:https://raw.githubusercontent.com/apache/airflow/constraints-2.7.3/constraints-3.8.txt

pip install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}"

啟動虛擬環境後(source ./env/bin/activate) 執行以上腳本安裝 2.7.3 版本的 airflow。要求虛擬環境綁定的是主機的 python 版本為 3.8+,這一步在第一回安裝會有各種依賴問題,尤其是和當前業務工程的依賴之間的問題,依次解決即可。如果 install 很慢的話替換國內的源即可 -i https://pypi.mirrors.ustc.edu.cn/simple/

airflow standalone

啟動單機版本服務,這一步如果啟動成功就基本上就成功一大半了,但基本是不可能的。遇到的第一個問題就是提示 sqlLite 版本過低,主要是因為 centos 的緣故,自帶的 sqlite3 版本是 3.7,但是 airflow 需要的最低版本是 3.15,Ubuntu 應該是沒有這個問題的。解決方案也不複雜,安裝 sqlite 的 3.15 版本的副本,為什麼不直接升級原來的,因為怕把系統搞崩。然後替換一下快捷指令重新執行就可以了。這裡有一個比較坑的點,就是正常生產環境官網是不推薦使用 sqlite 的,但想要更改連接方式只能去修改配置文件./airflow/airflow.cfg,神奇的是這個目錄,甚至是這個文件夾,只有在啟動了一次 airflow 服務才會被創建!之前我一直不想升級 sqlite,想直接改數據庫連接方式再啟動,我還以為系統變量沒生效,但是用戶目錄也沒有,才在官方文檔翻到這個警告。所以說 sqlLite 是不可缺少的。即使你以後不想使用他最為數據庫後端。

sqlite3 --version
mkdir sqlite3_upgrade
cd sqlite3_upgrade
wget --no-check-certificate  https://www.sqlite.org/2023/sqlite-autoconf-3440200.tar.gz
tar -xzvf sqlite-autoconf-3440200.tar.gz 
cd sqlite-autoconf-3440200/
./configure
make
make install
/usr/local/bin/sqlite3 --version
cp /usr/bin/sqlite3 /usr/bin/sqlite3_old
rm /usr/bin/sqlite3
ln -s /usr/local/bin/sqlite3  /usr/bin/sqlite3 
sqlite3 --version

以上是 centos7 升級 sqlite 的參考步驟

當輸出 3.44 的時候就可以啟動了

airflow standalone

正常來說就可以啟動了,然後就去項目目錄下的 airflow 文件夾看到了對應的 log 文件夾,airflow.cfg,以及 airflow.db。
去瀏覽器輸入機器的 IP 地址 + 端口號 8080 就可以訪問到 web 頁面了 默認用戶名:admin ,默認密碼在後臺日誌以及 airflow 文件夾的 standalone_admin_password.txt 文件中都有。

接下來就是替換 sqlite 為 mysql(如果是 postgreSQL 會更簡單,airflow 自帶與之交互的插件),更改配置文件的參數為:

sql_alchemy_conn = mysql+pymysql://username:password@host:port/db_name

注意官方文檔推薦的:

mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>

在 centos 下會有問題。mysqlclient 驅動會裝不上或者版本不匹配。反正最後我裝上了,但是還沒生效就換了 python 的 mysql 驅動,即使是 mysqlclient 經過了 airflow 的官方 CI 的驗證。估計 Ubuntu 或者其他系統應該沒啥問題,
ps: 用官方的也行了 下載一個符合系統版本的(centos7)mariadb-devel 安裝即可,

改完保存後執行:

airflow db migrate

系統會自己遷移他所需的數據庫到你指定的 mysql 服務器,不出意外又來問題了,airflow 建表的時候提示:

airflow Invalid default value for 'updated_at'

大概可以了解到是因為 mysql 默認時間格式的問題,mysql 當前為嚴格模式,需要更改 mysql 的模式設置為:

SET SQL_MODE='ALLOW_INVALID_DATES';

但這只是臨時方案,最終還需要去改 mysql 的配置文件( my.ini (mysql configuration file)),移除 NO_ZERO_DATE from sql-mode option 然後重啟。但因為我們 mysql 是 docker 部署的,docker 內部還不能使用 vim 命令。。。這個問題還在待定

最後:

airflow db migrate
airflow standalone

可以看到 mysql 庫中新增了一大堆表,系統也正常能通過 web 訪問就大功告成了!

未解決問題#

  • mysql 配置文件永久修改
  • sqlLite 不永久更改以後有沒有問題
  • 生產環境部署的模式肯定要和現在的不一致
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。