最近因为涉及到要重新对某处搭建简单数据中心,从而接触到airflow,了解airflow:http://airflow.apache.org/ ;
环境:docker下centos+mysql8+python3.7 ,对应上面docker篇4的结尾的容器中。
相关走法参考这里:https://mp.weixin.qq.com/s/xPjXMc_6ssHt16J07BC7jA?
首先pip安装airflow,我的python3.7对应pip3: pip3 install apache-airflow ; 但是遇到问题
那就如它所说增加这个环境变量: export SLUGIFY_USES_TEXT_UNIDECODE=yes ; 后再执行上面的pip。安装一大堆依赖之后成功安装airflow。
接下来:airflow initdb ,但是bash: airflow: command not found; 鉴于airflow在python的bin下面,于是:vi /etc/profile ;结尾添加一行export PATH=$PATH:/usr/local/python37/bin;之后source /etc/profile 。airflow命令即可直接运行了,再次:airflow initdb,但是出现:
搜索找到相关的问题:https://stackoverflow.com/questions/53733446/how-to-suppress-errors-in-airflow-cli-output 发现需要升级tenacity ,于是pip3 install -U tenacity,但是说airflow合适的tenacity还是4.8版本:
但是airflow initdb果然不报那个错了:
然后在容器内打开airflow的webserver : airflow webserver -p 8080;但此时容器和主机的端口映射还没打开,肯定是访问不通的,尝试给运行中的容器增加端口映射,参考:https://blog.csdn.net/u013043762/article/details/79578599;试了几波,但还是不行,果然还是对iptables那些还有点摸不着头脑啊,配的过程中添加无效,删除倒是可以把容器run时初始的那个映射成功关闭,非常奇怪。那就先不看webserver吧,等下airflow都配好走方法二,先配下airflow+mysql:
修改配置文件:vi ~/airflow/airflow.cfg;修改以下两块
executor 那块先不展开。mysql 那块一开始写的mysql://,它会默认调用MySQLdb,由于我暂时没装,No module named 'MySQLdb',装了pymysql并考虑sqlalchemy 的用法,改成mysql+pymysql,就启动ok了(不过这里在后面会采坑,参照这里的No.1),随后报错需要先建库airflowdb;airflow不会帮你做按你的配置建库的事情,它不需要那么高的权限,一般是你建好一个库指定它进去就好了;数据库账号配置和建库内容这里不详细展示了,比较简单。airflow initdb成功之后它会添加以下表:
至此;准备打包docker镜像,是把scheduler和webserver都运行起来再打包呢,还是就现在打包,没想的很明白,从节省镜像空间的角度看的话,也一直在想为什么自己镜像那么大,可能是完全当成虚机在玩了,什么都想放上去,现在是centos+python3+一堆python模块+mysql8+airflow,上面完整版的airflow又是一堆大大小小的包。
ps: 其实上面的example_dags那些应该是可以不用去跑的,虽然写文章这两天开了一会儿可能有跑跑example_dags的吧,不过看下了下 ~/airflow/ 下面的日志啥的也不是特别多,那就先这么去打包镜像吧:
[root@小林のCentos 09:39:49 ~]>149$ docker commit -m="v1.5 v1.4_r+airflow with mysql&initdb" -a antony a73a16aa0a61 antony314/centos:v1.5
sha256:2286a16d75a6d7f9f736e25de8fc87f3b079abd265b3af7a768a5ac144be3c3c
[root@小林のCentos 10:41:15 ~]>150$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
antony314/centos v1.5 2286a16d75a6 37 seconds ago 4.3GB
antony314/centos v1.4_r 501253e4ee04 3 days ago 3.98GB
多了400M,相对于安装了mysql的增长,就还好啦。
接下来上传到docker hub,还好,似乎没有变大:
然后我们到另外一台服务器上部署下v1.5的环境试试咯,顺便尝试解决上面的访问问题,现在需要在启动容器的时候至少配置两个端口映射,分别给mysql和airflow的webserver使用,直接run最近的镜像,docker会去拉对应的新版本镜像:
docker run -tdi --privileged -p 3306:3306 -p 3308:8080 antony314/centos:v1.5 init
由于暂时找运维小哥只开通了3306和3308,于是用主机的3308映射到容器的8080准备给webserver用,端口映射确实有俩:
至此,此机器的数据库可以完成远程访问,并包含airflowdb和初始化的所有表,图这里就不截了。
尝试访问webserver,因为容器内还没打开airflow webserver,在其他机器上发现,docker并没有把/etc/profile文件带过来,可能得放在用户配置~/.bashrc好点吧,于是又 vi ~/.bashrc ,加上以下三行:
TZ='Asia/Shanghai'; export TZ
export AIRFLOW_HOME=/root/airflow
export PATH=$PATH:/usr/local/python37/bin
之后运行:airflow webserver 默认是8080端口: airflow webserver > /dev/airflow_weblog 2>&1 &
由于刚刚已经做好了映射,所以已经可以访问了:
后面实际开始使用airflow的时候,会专门写些关于airflow的文章。
最后,重新push一个镜像吧(包括看改动的bashrc能不能生效以及启动着的airflow webserver),因为在另一台机器,不登录docker的账户是没法push上去的:
docker ps
docker commit -m 'v1.5_rw with runing airflow webserver' -a antony 114ea1a81ea6 antony314/centos:v1.5_rw
docker push antony314/centos:v1.5_rw
docker login
docker push antony314/centos:v1.5_rw
docker hub地址:https://cloud.docker.com/repository/docker/antony314/centos/tags ,
docker的一阶段小结:
1.docker的基本流程和主要命令都走通了,更多的是把docker当一个虚拟机在用了;
2.容器的外网访问问题,其实docker本身有很多方法,但这里只走了端口映射这一种,因为对iptables部署,还只通了这下面的一种方式就是在run时配好映射;
3.docker有些相对高级的用法还没接触到,Makefile配置法,相关运行命令的配置等,甚至还有些不太知道的,都还没涉及。
应该暂时会停在这个阶段了,然后之前留的问题和后续使用发现的trick,如无特殊的必要,我会直接更新到相应的内容上。
最后,给自己记录几个过程中的命令:
airflow scheduler
airflow webserver > /dev/null 2>&1 &
ps auxf | grep airflow | awk '{print $2}' | xargs kill -9