Airflow[v1.10]任务调度平台的安装教程

airflow安装教程

0.背景

真的是想不通,Airflow不论社区活跃度仍是Github的star数都是远胜于Azkaban还有EasyScheduler的,可是为什么却连一个完备的安装教程都没有呢?是个人需求过高?真的是心累不已,整整把搜索引擎还有youtube翻来覆去也没让我感到知足……不过好在,一步一坑一脚印的最终搭建连通好了环境以及Operator。好了,废话很少说,开始Airflow今日份安装教程。html

1.安装前准备工做

  • 安装版本说明
安装工具 版本 用途
Python 3.6.5 安装airflow及其依赖包、开发airflow的dag使用
MySQL 5.7 做为airflow的元数据库
Airflow 1.10.0 任务调度平台

请选择一台干净的物理机或者云主机。否则,产生任何多余影响或者后果,本人概不负责!node

  • 请确保你熟悉Linux环境及基本操做命令,顺便会一些Python基础命令,若是不熟悉,请出门左转充完电再来

2.安装Python3

Python3的安装能够参考我以前的文章,在此再也不敖述python

3.安装MySQL

3年前也写过一个关于Centos安装MySQL的教程,可是虽然实用,可是内容过久,在此咱们用最简方式快速安装MySQL并配置用户(固然,若是你用现成的RDS也能够,省去了安装过程,可直接跳转至为Airflow建库建用户步骤了)。mysql

  • 老规矩,卸载mariadb
rpm -qa | grep mariadb

rpm -e --nodeps mariadb-libs-5.5.52-1.el7.x86_64

sudo rpm -e --nodeps mariadb-libs-5.5.52-1.el7.x86_64

rpm -qa | grep mariadb
复制代码
  • 下载mysql的repo源
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
复制代码
  • 经过rpm安装
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
复制代码
  • 安装mysql并受权
sudo yum install mysql-server
sudo chown -R mysql:mysql /var/lib/mysql
复制代码
  • 启动mysql
sudo service mysqld start
复制代码

如下操做均在mysql客户端上进行操做,首先须要链接并登陆mysql。linux

用root用户链接登陆mysql:git

mysql -uroot
复制代码
  • 重置mysql密码
use mysql;

update user set password=password('root') where user='root';

flush privileges;
复制代码
  • 为Airflow建库、建用户

建库:github

create database airflow;
复制代码

建用户:web

create user 'airflow'@'%' identified by 'airflow';

create user 'airflow'@'localhost' identified by 'airflow';
复制代码

为用户受权:sql

grant all on airflow.* to 'airflow'@'%';

flush privileges;

exit;
复制代码

4.安装Airflow

万事既已具有,让咱们开始进入今天的主题!数据库

4.1基础篇

  • 1)经过pip安装airflow脚手架

安装以前须要设置一下临时环境变量SLUGIFY_USES_TEXT_UNIDECODE,否则,会致使安装失败,命令以下:

export SLUGIFY_USES_TEXT_UNIDECODE=yes
复制代码

安装airflow脚手架:

sudo pip install apache-airflow===1.10.0
复制代码

airflow会被安装到python3下的site-packages目录下,完整目录为:${PYTHON_HOME}/lib/python3.6/site-packages/airflow,个人airflow目录以下所示:

python3-airflow-dir

    1. 正式安装airflow

安装airflow前,咱们须要先配置一下airflow的安装目录AIRFLOW_HOME,同时为了方便使用airflow的相关命令,咱们也把airflow配置到环境变量中,一劳永逸。

编辑/etc/profile系统环境变量文件:

sudo vim /etc/profile
复制代码

作以下修改(固然,具体目录须要修改为你本身对应的目录,不要照搬不动哦):

airflow-env-variable

使修改后的环境变量当即生效:

sudo source /etc/profile
复制代码
  • 3)执行airflow命令作初始化操做

由于配置过airflow的环境变量SITE_AIRFLOW_HOME,咱们在哪里执行以下命令均可:

airflow
复制代码

到此,airflow会在刚刚的AIRFLOW_HOME目录下生成一些文件。固然,执行该命令时可能会报一些错误,能够不用理会!生成的文件列表以下所示:

airflow-init-file

    1. 为airflow安装mysql模块
sudo pip install 'apache-airflow[mysql]'
复制代码

airflow的包依赖安装都可采用该方式进行安装,具体可参考airflow官方文档


[敲黑板,划重点]

安装mysql模块时可能会报以下错误:

mysql_config not found
复制代码

解决步骤以下:

(1)先查看下是否已经存在mysql_config文件:

find / -name mysql_config
复制代码

(2)若是没有的话,安装mysql-devel:

sudo yum install mysql-devel
复制代码

(3)安装完成以后,再次验证是否有mysql_config文件:

airflow-mysql_config_install


    1. 采用mysql做为airflow的元数据库

修改airflow.cfg文件,配置mysql做为airflow元数据库:


这里就巨坑无比了,不少人的教程里面都是这么直接写的,而后就完蛋了!!!不信你试试看,等下初始化数据库必死无疑!并且尚未任何有效的解决方案能够供你搜索!!!其次也不要相信什么改为pymysql配合pymysql包实现,这样更惨,会有数据类型解析问题,让你毫无头绪!!!切记切记!!!

sql_alchemy_conn = mysql://airflow:airflow@localhost:3306/airflow
复制代码

sql_alchemy_conn = mysql+pymysql://airflow:airflow@localhost:3306/airflow
复制代码

那既然这种方式不可行,该怎么办呢?办法总比困难多的!由于Python3再也不支持MySQLdb了,只有Python2才支持。可是呢,也只有MySQLdb才是最佳结果。

首先,咱们经过pip安装一下mysqlclient:

sudo pip install mysqlclient
复制代码

而后,再经过pip安装一下MySQLdb:

sudo pip install MySQLdb
复制代码

最后,咱们修改airflow.cfg文件中的sql_alchemy_conn配置:

sql_alchemy_conn = mysql+mysqldb://airflow:airflow@localhost:3306/airflow
复制代码

到此,咱们已经为airflow配置好元数据库信息且准备好依赖包。

    1. 初始化元数据库信息(其实也就是新建airflow依赖的表)
airflow initdb
复制代码

此时,咱们的mysql元数据库(库名为airflow)中已经新建好了airflow的依赖表:

airflow-metadata


[敲黑板,划重点]

此时初始化数据库时,可能会报以下错误:

Global variable explicit_defaults_for_timestamp needs to be on (1) for mysql
复制代码

该问题的解决方案在Airflow官方文档中有说明,连接为:airflow.apache.org/faq.html。须要经过修改MySQL配置文件my.cnf进行处理,步骤以下:

(1)查找my.cnf位置:

mysql --help | grep my.cnf
复制代码

airflow-mysql-cnf-pos

(2)修改my.cnf文件:

[mysqld]下面(必定不要写错地方)添加以下配置:

explicit_defaults_for_timestamp=true
复制代码

airflow-mysql-cnf-modify

(3))重启MySQL使配置生效:

sudo service mysqld restart
复制代码

(4)查看修改的配置是否生效:

airflow-mysql-cnf-result

(5)从新执行airflow initdb便可


    1. 应用的基础命令
    • airflow组件:webserver, scheduler, worker, flower
    • 后台启动各组件命令:airflow xxx -D
    • 查看dag列表:airflow list_dags
    • 查看某个dag的任务列表:airflow list_tasks dag_id
    • 挂起/恢复某个dag:airflow pause/unpause dag_id
    • 测试某个dag任务:airflow test dag_id task_id execution_date

[敲黑板,划重点]

启动webserver组件时可能会报以下错误:

错误1:

Error: 'python:airflow.www.gunicorn_config' doesn‘t exist
复制代码

安装指定版本的gunicorn便可:

(1) Airflow1.10版本对应gunicorn的19.4.0版本:

sudo pip install gunicorn==19.4.0
复制代码

(2) Airflow1.8版本安装gunicorn的19.3.0版本:

sudo pip install gunicorn==19.3.0
复制代码

错误2:

FileNotFoundError: [Errno 2] No such file or directory: 'gunicorn': 'gunicorn'
复制代码

只须要配置好Python的bin目录环境变量便可(也能够参照www.cnblogs.com/lwglinux/p/…):

sudo vim /etc/profile
复制代码

airflow-python-bin-dir

source /etc/profile
复制代码

4.2进阶篇

    1. 初识executor(须要重启生效)

airflow-executor

这里为何要修改呢?由于SequentialExecutor是单进程顺序执行任务,默认执行器,一般只用于测试,LocalExecutor是多进程本地执行任务使用的,CeleryExecutor是分布式调度使用(固然也能够单机),生产环境经常使用,DaskExecutor则用于动态任务调度,经常使用于数据分析。

  • 2)如何修改时区为东八区(须要重启生效)

为何要修改时区呢?由于Airflow默认的时间是GMT时间,虽然能够在Airflow集群分布在不一样时区时仍可保证时间相同,不会出现时间不一样步的问题,可是这个时间比北京早8小时,不太符合咱们的阅读习惯,也不够简洁直观。鉴于咱们一般状况下,咱们要么为单节点服务,要么即便扩展也是在同一个时区的,因此将时区修改成东八区,即北京时间,这样更便于咱们使用。

Come on!

(1) 修改airflow.cfg文件:

default_timezone = Asia/Shanghai
复制代码

这里修改的是scheduler的调度时间,也就是说在编写调度时间是能够直接写北京时间。

(2) 修改webserver页面上右上角展现的时间:

须要修改${PATHON_HOME}/lib/python3.6/site-packages/airflow/www/templates/admin/master.html文件。

airflow-webserver-time

修改后效果如图所示:

airflow-webserver-time-2

(3) 修改webserver lastRun时间:

第1处修改${PATHON_HOME}/lib/python3.6/site-packages/airflow/models.py文件。

def utc2local(self,utc):
       import time
       epoch = time.mktime(utc.timetuple())
       offset = datetime.fromtimestamp(epoch) - datetime.utcfromtimestamp(epoch)
       return utc + offset
复制代码

效果以下:

airflow-code-modify

第2处修改${PATHON_HOME}/lib/python3.6/site-packages/airflow/www/templates/airflow/dags.html文件。

dag.utc2local(last_run.execution_date).strftime("%Y-%m-%d %H:%M")
dag.utc2local(last_run.start_date).strftime("%Y-%m-%d %H:%M")
复制代码

效果以下:

airflow-code-modify-2

修改完毕,此时能够经过重启webserver查看效果!

    1. 添加用户认证

在这里咱们采用简单的password认证方式足矣!

(1)安装password组件:

sudo pip install apache-airflow[password]
复制代码

(2)修改airflow.cfg配置文件:

[webserver]
authenticate = True
auth_backend = airflow.contrib.auth.backends.password_auth
复制代码

(3)编写python脚本用于添加用户帐号:

编写add_account.py文件:

import airflow
from airflow import models, settings
from airflow.contrib.auth.backends.password_auth import PasswordUser

user = PasswordUser(models.User())
user.username = 'airflow'
user.email = 'test_airflow@wps.cn'
user.password = 'airflow'

session = settings.Session()
session.add(user)
session.commit()
session.close()
exit()
复制代码

执行add_account.py文件:

python add_account.py
复制代码

你会发现mysql元数据库表user中会多出来一条记录的。

固然,你也能够借助于第三方插件方式对用户帐号还有可视化UI创建/修改DAG代码。连接为:github.com/lattebank/a…,惋惜只支持到Python2.x。不事后续我会对其作升级处理。

    1. 修改webserver地址(须要重启生效)

airflow-webserver-url

    1. 如何修改检测新DAG间隔(须要重启生效)

若是scheduler检测DAG过于频繁,会致使CPU负载很是高。而默认scheduler检测时间为0,也就是没有时间间隔。

能够经过修改airflow.cfg文件中的min_file_process_interval设置时间间隔,以下,我是修改成了5秒检测一次:

airflow-scheduler-check-time

    1. 如何修改scheduler线程数控制并发量(须要重启生效)

能够经过修改airflow.cfg文件中的parallelism来控制scheduler的并发量:

airflow-scheduler-parallelism

4.3高级篇

    1. 配置Airflow分布式集群

(未完待续...)

相关文章
相关标签/搜索