Airflow部署及使用

由于工作中需要使用airflow进行开发,网上搜索“mac系统在docker中搭建airflow”的文章真的很少,而且写的又不够详细。遂自己摸索搭建成功后便分享给大家使用,即有按部就班“一步一步”的操作,也有“一键初始化”脚本,大家根据自己的实际情况进行操作。

1、Dockerhub查看镜像地址

  1. # 如果你比较懒可以使用最后的“airflow一键初始化脚本”,mac电脑通用
  2. https://hub.docker.com/r/puckel/docker-airflow/tags?page=1&ordering=last_updated

2、拉取docker镜像

  1. # 执行镜像下载命令
  2. docker pull puckel/docker-airflow:latest

3、在宿主机创建外挂文件夹

  1. # 获取当前系统的用户名,例如:jason
  2. echo $USER
  3. # 执行上述命名将得到的用户名替换在 $USER 的位置
  4. sudo mkdir -p -v /data/docker/volumes/airflow/{dags,logs} && sudo chown -R $USER /data/docker/volumes/airflow/{dags,logs}

4、创建docker容器

  1. # 创建容器
  2. 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
  3. 命令说明:
  4. -d puckel/docker-airflow:latest #交互运行容器,让容器以守护态(daemonized)形式在后台运行
  5. --name airflow #给新创建的容器命名即容器别名,如:airflow
  6. -p 8080:8080 #端口映射,此处映射主机8080端口到容器airflow的8080端口
  7. -v /data/docker/volumes/airflow/airflow.cfg:/usr/local/airflow/airflow.cfg #挂载主配置文件
  8. -v /data/docker/volumes/airflow/dags:/usr/local/airflow/dags #挂载资源路径
  9. -v /data/docker/volumes/airflow/logs:/usr/local/airflow/logs #挂载日志文件

5、重新创建docker容器

此步骤主要是将容器中的airflow.cfg拷贝出来,方便airflow.cfg后续修改;

5.1、查看airflow容器是否正常启动

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

5.2、启动成功才能将容器中的airflow.cfg拷贝出来修改

  1. #1、查看容器ID,例如:$container_id
  2. docker ps -a | grep 'airflow' |awk '{print $1}'
  3. #2、使用docker拷贝(命令参考,可忽略):docker cp source_path target_path
  4. docker cp $container_id:/usr/local/airflow/airflow.cfg /data/docker/volumes/airflow
  5. #3、拷贝airflow.cfg到指定目录,命令集成(推荐用,一键搞定省心)
  6. sudo docker cp $(docker ps -a | grep 'airflow' |awk '{print $1}'):/usr/local/airflow/airflow.cfg /data/docker/volumes/airflow

5.3、删除容器重新创建,非删除镜像

此步骤主要是将/usr/local/airflow/airflow.cfg外挂到宿主机中

  1. #1、删除容器示例:docker stop $image_alias && docker rm $image_alias
  2. docker stop airflow && docker rm airflow
  3. #2、重新创建docker容器
  4. 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
  5. #3、查看容器airflow挂载到宿主机的地址
  6. docker inspect airflow | jq -r '.[].HostConfig.Binds'
  7. #4、查看容器是否正常
  8. docker ps

6、进入docker容器

  1. docker exec -it airflow /bin/bash
  2. -d:分离模式,在后台运行
  3. -i:交互模式,即使没有附加也保持 STDIN 打开
  4. -t:分配一个伪终端
  5. /bin/bash:运行命令 bash shell

7、sqlite数据库初始化

(生产不建议使用,但可用于个人测试。生产推荐使用mysql,如果使用mysql可以跳过sqlite部分)

  1. #1、使用默认的sqlite+SequentialExecutor启动
  2. airflow initdb
  3. #2、出现错误:
  4. airflow.exceptions.AirflowException: Could not create Fernet object: Incorrect padding
  5. #3、解决办法:
  6. python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
  7. #4、将第3步执行的结果替换到export中
  8. export AIRFLOW__CORE__FERNET_KEY=第3步执行的结果
  9. #5、重新执行初始化数据库命令
  10. airflow initdb
  11. #6、启动成功后,即可正常访问
  12. http://localhost:8080/admin/

avatar

8、修改airflow的airflow.cfg配置

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

  1. #1、查看docker中mysql的IP地址,替换在如下的IP地址中
  2. docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql
  3. #2、手动修改(使用命令行修改可跳过此步)
  4. executor = LocalExecutor
  5. # 示例:sql_alchemy_conn="mysql://${USER}:${PASSWORD}@${HOST}:${PORT}/${DB_INSTANCE}${DB_EXTRAS}"
  6. sql_alchemy_conn = mysql://airflow:airflow@172.17.0.2:3306/airflow
  7. #3、命令行修改(使用手动修改可跳过此步)
  8. sudo sed -i \"\" 's/executor = SequentialExecutor/executor = LocalExecutor/g' /data/docker/volumes/airflow/airflow.cfg
  9. 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
  10. #4、查看修改是否成功
  11. cat /data/docker/volumes/airflow/airflow.cfg | grep 'executor ='
  12. cat /data/docker/volumes/airflow/airflow.cfg | grep 'sql_alchemy_conn'

9、mysql数据库初始化

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

9.1、查看docker中mysql的IP地址

如果你的mysql也是安装在docerk中的话,则最好操作如下命令:

  1. # 查看docker中mysql的IP地址,主要用于mysql创建新用户授权时使用,
  2. # 命令中的 mysql 是docker中安装数据库时的别名,请根据实际情况自行修改
  3. docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql

9.2、登录mysql并创建专属的airflow数据库

  1. #新建名字为<airflow>的数据库
  2. CREATE DATABASE airflow;
  3. #1、新建用户`airflow`,密码为`airflow`, 该用户对数据库`airflow`有完全操作权限
  4. #2、将9.1步骤执行命令行的结果替换在 $IPAddress 的位置,也可以将IP最后一位换成%,例如:172.17.0.%
  5. GRANT all privileges on airflow.* TO 'airflow'@'$IPAddress' IDENTIFIED BY 'airflow';
  6. FLUSH PRIVILEGES;
  7. # 查看授权(常用操作指令可不执行)
  8. select host,user from mysql.`user` where user='airflow';
  9. # 删除授权(常用操作指令可不执行)
  10. DROP USER 'airflow'@'$IPAddress';

9.3、修改mysql的my.cnf配置

  1. # 由于airflow初始化数据库时需要用到如下参数,请自行添加
  2. [mysqld]
  3. explicit_defaults_for_timestamp = 1

9.4、初始化mysql数据库

  1. # 1、进入docker容器
  2. docker exec -it airflow /bin/bash
  3. # 2、先执行数据库重置命令,再执行数据库初始化命令
  4. airflow reset
  5. airflow initdb
  6. # 3、出现错误:
  7. airflow.exceptions.AirflowException: Could not create Fernet object: Incorrect padding
  8. # 4、解决办法:
  9. python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
  10. # 5、将第3步执行的结果替换到export中
  11. export AIRFLOW__CORE__FERNET_KEY=第3步执行的结果
  12. # 6、查看环境变量是否设置成功
  13. echo $AIRFLOW__CORE__FERNET_KEY
  14. # 7、重新执行初始化数据库命令
  15. airflow initdb
  16. # 8、启动成功后,即可正常访问
  17. http://localhost:8080/admin/

10、airflow一键初始化脚本

注意:执行《一键初始化脚本》时需要先配置mysql环境和创建airflow数据库用户,即如下操作;

1、先执行9.1、9.2、9.3等步骤的操作,执行完成后请检查是否正确;

2、先启动airflow容器,然后再执行9.4步骤的操作;

3、执行完成后即可访问:http://localhost:8080/admin/

Mac通过docker一键部署airflow的更多相关文章

  1. mac通过docker一键部署Jenkins

    目录 mac通过docker一键部署Jenkins 一.前言 二.系统配置 三.安装步骤 Dockerhub查看镜像地址 1.一键安装 1.1.下载脚本 1.2.安装程序 1.2.1.安装程序详情 1 ...

  2. mac通过docker一键部署MySQL8

    目录 mac通过docker一键部署MySQL8 一.前言 二.系统配置 三.安装步骤 Dockerhub查看镜像地址 1.一键安装 1.1.克隆脚本 1.2.安装程序 1.2.1.安装程序详情 1. ...

  3. mac通过docker一键部署Nexus3

    目录 mac通过docker一键部署Nexus3 一.前言 二.系统配置 三.安装步骤 1.Dockerhub查看镜像地址 2.一键安装 2.1.克隆脚本 2.2.安装程序 2.2.1.程序安装详情 ...

  4. Docker一键部署Hadoop心得(一)

    最近一直在折腾使用docker一键部署全分布式hadoop集群,虽然一键部署的脚本写好了并且可以成功运行出各个节点,但在运行一个wordcount实例时出现了错误,错误如下: java.io.IOEx ...

  5. 使用Docker 一键部署 LNMP+Redis 环境

    使用Docker 部署 LNMP+Redis 环境 Docker 简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linu ...

  6. 基于Docker一键部署大规模Hadoop集群及设计思路

    一.背景: 随着互联网的发展.互联网用户的增加,互联网中的数据也急剧膨胀.每天产生的数据量数以万计,本地文件系统和单机CPU已无法满足存储和计算要求.Hadoop分布式文件系统(HDFS)是海量数据存 ...

  7. RabbitMQ集群 Docker一键部署

    以下内容来自网络转载 步骤1. 安装docker 以centos7为例,https://docs.docker.com/engine/installation/linux/centos/ 步骤2. 创 ...

  8. Docker一键部署Hadoop心得(二)

    今天在运行MapReduce程序时,虽然wordcount实例运行成功了,但后面出现了重新使用历史服务器失败的错误 17/12/22 13:33:19 INFO ipc.Client: Retryin ...

  9. docker一键部署zookeeper

    version: '3.1' services: zoo1: image: zookeeper:3.4.11 restart: always hostname: zoo1 container_name ...

随机推荐

  1. 园子的品牌专区上新:NoSQL 数据库佼佼者 Aerospike

    品牌专区是园子去年推出的新楼盘,为优秀的科技企业在园子里提供一个地方,展示自己的品牌,分享自己的技术内容. 最近我们和国外领先的 NoSQL 数据库厂商 Aerospike 达成了合作,入驻了园子的品 ...

  2. spark bulkload 报错异常:Caused by: java.io.IOException: Added a key not lexically larger than previous

    ------------恢复内容开始------------ Caused by: java.io.IOException: Added a key not lexically larger than ...

  3. element-ui使用后手记

    一.路由模式el-menu中使用路由模式 在el-meun中设置:router="true" 在el-menu-item中设置index="路由地址"

  4. Git之pull,fetch差别

    简言之, pull=fetch+merge,下拉远程分支并与本地分支合并. fetch只是下拉远程分支,怎么合并,可以自己再做选择. 进一步了解是,git本地有暂存区(亦称为Index区) fetch ...

  5. 音视频入门-19-使用giflib处理GIF图片

    * 音视频入门文章目录 * GIFLIB The GIFLIB project 上一篇 [手动生成一张GIF图片], 自己生成了一张 GIF 动态图 rainbow.gif. 下面,使用 GIFLIB ...

  6. 7.shell脚本编程

    1.shell 脚本语言的基本用法 1.1shell 脚本创建 1.格式要求:首行shebang机制 #!/bin/bash #!/usr/bin/python #!/usr/bin/perl 2.添 ...

  7. dbms_job和dbms_job基础学习

    一.dbms_job学习 a.创建job: dbms_job.submit(jobno,what,next_date,interval);b.删除job: dbms_job.remove(jobno) ...

  8. jxl解析多个excel工作表-java代码

    @Override public ResultBean txImportDqKpi(String filePath) { ResultBean rb = new ResultBean(); int s ...

  9. Java开发手册之数据库规约

    1.不要使用 count(列名)或 count(常量)来替代 count(*),count(*)是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关. 2.cou ...

  10. innnodb_doublewrite

    有写场景下,双写缓冲确实没必要,例如,你也许像在备库上禁用双写缓冲,此外,一些文件系统,例如zfs做了同样的事,所以,没必要再让innodb做一遍. innodb_double_write=0 即可关 ...