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环境了,有不对之处请留言,会及时修正,谢谢阅读!!

所有文章均为本人原创,本人写作的目的就是想帮助对技术有需要的人,所以欢迎同行转载本站文章,但是,希望您注明来源,并留下原文链接地址,这是对文章作者的尊重,也是对知识的尊重。

posted @ 2021-02-03 17:33  逍遥酒鬼  阅读(753)  评论(0编辑  收藏  举报