mac通過docker一鍵部署airflow


Airflow部署及使用

1、前言

由於工作中需要使用airflow進行開發,網上搜索“mac系統在docker中搭建airflow”的文章真的很少,而且寫的又不夠詳細。遂自己摸索搭建成功后便分享給大家使用,即有按部就班“一步一步”的操作,也有“一鍵初始化”腳本,大家根據自己的實際情況進行操作。

2、系統配置

mac os:Mojave 
mac version:10.14.6

docker desktop version:2.3.0.4
docker version:19.03.12
docker-compose version: 1.26.2

3、Dockerhub查看鏡像地址

# 如果你比較懶可以使用最后的“airflow一鍵初始化腳本”,mac電腦通用
https://hub.docker.com/r/puckel/docker-airflow/tags?page=1&ordering=last_updated

4、拉取docker鏡像

# 執行鏡像下載命令 
docker pull puckel/docker-airflow:latest

5、在宿主機創建外掛文件夾

# 獲取當前系統的用戶名,例如:jason 
echo $USER 

# 執行上述命名將得到的用戶名替換在 $USER 的位置 
sudo mkdir -p -v /data/docker/volumes/airflow/{dags,logs} && sudo chown -R $USER /data/docker/volumes/airflow/{dags,logs}

6、創建docker容器

# 創建容器
docker run -p 8080:8080  \
-v=/data/docker/volumes/airflow/dags:/usr/local/airflow/dags \
-v=/data/docker/volumes/airflow/logs:/usr/local/airflow/logs \
--name airflow -d puckel/docker-airflow:latest

命令說明:
-d puckel/docker-airflow:latest #交互運行容器,讓容器以守護態(daemonized)形式在后台運行
--name airflow #給新創建的容器命名即容器別名,如:airflow
-p 8080:8080  #端口映射,此處映射主機8080端口到容器airflow的8080端口
-v /data/docker/volumes/airflow/airflow.cfg:/usr/local/airflow/airflow.cfg   #掛載主配置文件
-v /data/docker/volumes/airflow/dags:/usr/local/airflow/dags  #掛載資源路徑
-v /data/docker/volumes/airflow/logs:/usr/local/airflow/logs  #掛載日志文件

7、重新創建docker容器

此步驟主要是將容器中的airflow.cfg拷貝出來,方便airflow.cfg后續修改;

7.1、查看airflow容器是否正常啟動

# 查看容器是否正常,如 running 即啟動成功
docker inspect airflow | jq -r '.[].State.Status'

7.2、啟動成功才能將容器中的airflow.cfg拷貝出來修改

#1、查看容器ID,例如:$container_id 
docker ps -a | grep 'airflow' |awk '{print $1}' 

#2、使用docker拷貝(命令參考,可忽略):docker cp source_path target_path 
docker cp $container_id:/usr/local/airflow/airflow.cfg /data/docker/volumes/airflow 

#3、拷貝airflow.cfg到指定目錄,命令集成(推薦用,一鍵搞定省心) 
sudo docker cp $(docker ps -a | grep 'airflow' |awk '{print $1}'):/usr/local/airflow/airflow.cfg /data/docker/volumes/airflow

7.3、刪除容器重新創建,非刪除鏡像

此步驟主要是將/usr/local/airflow/airflow.cfg外掛到宿主機中

#1、刪除容器示例:docker stop $image_alias && docker rm $image_alias 
docker stop airflow && docker rm airflow 

#2、重新創建docker容器 
docker run -p 8080:8080 \
-v=/data/docker/volumes/airflow/airflow.cfg:/usr/local/airflow/airflow.cfg \
-v=/data/docker/volumes/airflow/dags:/usr/local/airflow/dags \
-v=/data/docker/volumes/airflow/logs:/usr/local/airflow/logs \
--name airflow -d puckel/docker-airflow:latest 

#3、查看容器airflow掛載到宿主機的地址 
docker inspect airflow | jq -r '.[].HostConfig.Binds' 

#4、查看容器是否正常 
docker ps

8、進入docker容器

docker exec -it airflow /bin/bash

-d:分離模式,在后台運行 
-i:交互模式,即使沒有附加也保持 STDIN 打開 
-t:分配一個偽終端 
/bin/bash:運行命令 bash shell

9、sqlite數據庫初始化

(生產不建議使用,但可用於個人測試。生產推薦使用mysql,如果使用mysql可以跳過sqlite部分)

#1、使用默認的sqlite+SequentialExecutor啟動 
airflow initdb 

#2、出現錯誤: 
airflow.exceptions.AirflowException: Could not create Fernet object: Incorrect padding 

#3、解決辦法:
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" 

#4、將第3步執行的結果替換到export中 
export AIRFLOW__CORE__FERNET_KEY=第3步執行的結果

#5、重新執行初始化數據庫命令 
airflow initdb 

#6、啟動成功后,即可正常訪問 
http://localhost:8080/admin/

avatar

10、修改airflow的airflow.cfg配置

提供手動修改和命令行修改的功能

#1、查看docker中mysql的IP地址,替換在如下的IP地址中
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql

#2、手動修改(使用命令行修改可跳過此步)
executor = LocalExecutor 
# 示例:sql_alchemy_conn="mysql://${USER}:${PASSWORD}@${HOST}:${PORT}/${DB_INSTANCE}${DB_EXTRAS}" 
sql_alchemy_conn = mysql://airflow:airflow@172.17.0.2:3306/airflow 

#3、命令行修改(使用手動修改可跳過此步)
sudo sed -i \"\" 's/executor = SequentialExecutor/executor = LocalExecutor/g' /data/docker/volumes/airflow/airflow.cfg 
sudo sed -i \"\" 's/\# sql_alchemy_conn = sqlite:\/\/\/\/tmp\/airflow.db/sql_alchemy_conn = mysql:\/\/airflow:airflow\@172.17.0.2:3306\/airflow/g' /data/docker/volumes/airflow/airflow.cfg 

#4、查看修改是否成功
cat /data/docker/volumes/airflow/airflow.cfg | grep 'executor ='
cat /data/docker/volumes/airflow/airflow.cfg | grep 'sql_alchemy_conn'

11、mysql數據庫初始化

部署方式:docker+airflow+mysql+LocalExecutor

11.1、查看docker中mysql的IP地址

如果你的mysql也是安裝在docerk中的話,則最好操作如下命令:

# 查看docker中mysql的IP地址,主要用於mysql創建新用戶授權時使用,
# 命令中的 mysql 是docker中安裝數據庫時的別名,請根據實際情況自行修改
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql

avatar

11.2、登錄mysql並創建專屬的airflow數據庫

#新建名字為<airflow>的數據庫
CREATE DATABASE airflow; 

#1、新建用戶`airflow`,密碼為`airflow`, 該用戶對數據庫`airflow`有完全操作權限 
#2、將11.1步驟執行命令行的結果替換在 $IPAddress 的位置,也可以將IP最后一位換成%,例如:172.17.0.% 
GRANT all privileges on airflow.* TO 'airflow'@'$IPAddress' IDENTIFIED BY 'airflow'; 
FLUSH PRIVILEGES; 

# 查看授權(常用操作指令可不執行) 
select host,user from mysql.`user` where user='airflow'; 

# 刪除授權(常用操作指令可不執行) 
DROP USER 'airflow'@'$IPAddress';

11.3、修改mysql的my.cnf配置

# 由於airflow初始化數據庫時需要用到如下參數,請自行添加 
[mysqld]
explicit_defaults_for_timestamp = 1

11.4、初始化mysql數據庫

# 1、進入docker容器
docker exec -it airflow /bin/bash 

# 2、先執行數據庫重置命令,再執行數據庫初始化命令 
airflow reset 
airflow initdb 

# 3、出現錯誤: 
airflow.exceptions.AirflowException: Could not create Fernet object: Incorrect padding 

# 4、解決辦法: 
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" 

# 5、將第3步執行的結果替換到export中 
export AIRFLOW__CORE__FERNET_KEY=第3步執行的結果

# 6、查看環境變量是否設置成功 
echo $AIRFLOW__CORE__FERNET_KEY 

# 7、重新執行初始化數據庫命令 
airflow initdb 

# 8、啟動成功后,即可正常訪問 
http://localhost:8080/admin/

avatar

12、airflow一鍵初始化腳本

注意:執行《一鍵初始化腳本》時需要先配置mysql環境和創建airflow數據庫用戶,即如下操作;

1、先執行9.1、9.2、9.3等步驟的操作,執行完成后請檢查是否正確;

2、先啟動airflow容器,然后再執行9.4步驟的操作;

3、執行完成后即可訪問:http://localhost:8080/admin/

13、總結

這一套配置下來本地就可以玩airflow環境了,有不對之處請留言,會及時修正,謝謝閱讀!!

所有文章均為本人原創,本人寫作的目的就是想幫助對技術有需要的人,所以歡迎同行轉載本站文章,但是,希望您注明來源,並留下原文鏈接地址,這是對文章作者的尊重,也是對知識的尊重。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM