Airflow1.8 分布式工作流平台搭建

版本信息:

python 2.7.15
airflow==1.8.0
SQLAlchemy==1.1.18
flower==0.9.2

其中SQLAlchemy的版本如果是1.2.x版本会在创建用户是报错,

[root@localhost ~]# python2 create_user.py 
[2018-07-18 18:51:09,336] {__init__.py:57} INFO - Using executor CeleryExecutor
Traceback (most recent call last):
  File "create_user.py", line 7, in 
    user.password = 'afuser'
  File "/soft/anaconda2/lib/python2.7/site-packages/sqlalchemy/ext/hybrid.py", line 873, in __set__
    raise AttributeError("can't set attribute")
AttributeError: can't set attribute

使用pip安装airflow,celery,此外

  • 需要使用rabbitmq作为celery的backend需要pip install airflow[rabbitmq]
  • 需要登录认证时pip install airflow[password]
  • 需要使用CeleryExecutor时install apache-airflow[celery]

说明文档参考Extra Packages

airflow默认使用sqlite作为Airflow后台数据库,这里我改成mysql:

首先pip install airflow[mysql]

这里先设置airflow的环境变量AIRFLOW_HOME,

vim /etc/profile
加入export AIRFLOW_HOME=/home/crawl/airflow
然后执行
source /etc/profile
使生效

否则airflow会在当前用户的家目录下生成airflow文件夹

然后执行airflow,就会在$AIRFLOW_HOME下生成airflow文件夹

.
├── airflow
   ├── airflow.cfg
   ├── logs
   └── unittests.cfg

然后我们需要创建dags目录放任务文件,像这样

.
├── airflow
    ├── airflow.cfg
    ├── airflow-webserver.pid
    ├── dags
    │   ├── hello.py
    │   ├── my_email.py
    │   ├── send_email.py
    ├── logs
    └── unittests.cfg

airflow-webserver.pid是在运行airflow webserver创建的

然后就开始修改airflow.cfg配置文件

[core]
# executor = SequentialExecutor
# 使用celeryExecutor可以动态的增加worker个数并将任务在远程机器上执行.生产中建议使用celeryExecutor来执行
executor = CeleryExecutor


# sql_alchemy_conn = sqlite:////root/airflow/airflow.db
# 使用mysql作为后台数据库
sql_alchemy_conn = mysql://root:@192.168.2.89/airflow

[webserver]
# web登录验证,需要加上auth_backend 否则报错
authenticate = True
auth_backend = airflow.contrib.auth.backends.password_auth

[celery]
# broker_url = sqla+mysql://root:@192.168.2.89:3306/airflow
# broker_url = amqp://airflow:[email protected]:5672/for_airflow
# 可以使用mysql、RabbitMQ和redis作为broker
broker_url = redis://:[email protected]:6379/0

# celery_result_backend = db+mysql://airflow:airflow@localhost:3306/airflow2
# celery_result_backend = amqp://airflow:[email protected]:5672/for_airflow
# 同broker_url可以使用mysql、RabbitMQ和redis作为broker
celery_result_backend =  redis://:[email protected]:6379/0

如果是用RabbitMQ需要安装RabbitMQ,同理使用redis需要安装redis服务器

我这里使用的是redis,安装参考:Redis(一) 安装

这里需要修改配置文件redis.conf

将bind属性改为bind 0.0.0.0,确保其他主机能访问。
将requirepass修改为requirepass  for_airflow,设置密码

确保redis开启,mysql有airflow数据库,然后执行airflow initdb初始化,正常后会在airflow库下创建如下表

Airflow1.8 分布式工作流平台搭建_第1张图片

然后运行如下代码创建web用户:

import airflow
from airflow import models, settings
from airflow.contrib.auth.backends.password_auth import PasswordUser
user = PasswordUser(models.User())
user.username = 'user_name'
user.email = '[email protected]'
user.password = 'passwd'
session = settings.Session()
session.add(user)
session.commit()
session.close()

然后开启web服务:airflow webserver

开启调度airflow scheduler

在浏览器上访问该服务器8080端口,

Airflow1.8 分布式工作流平台搭建_第2张图片

登录后:

Airflow1.8 分布式工作流平台搭建_第3张图片

上面的dags是默认自带的,我们可以在$AIRFLOW_HOME下的dags添加自己的任务,

配置远程worker,这也是写这个博客的目的,在配置远程worker的时候踩了一些坑,网上也没找到详细的教程,一般都是这样写:

airflow的安装

5.5 部署多个worker
在需要运行作业的机器上的安装airflow airflow[celery] celery[redis] 模块后,启动airflow worker即可.这样作业就能运行在多个节点上.

 A Guide On How To Build An Airflow Server/Cluster

Configure your airflow workers; follow most steps for the airflow server, except that they do not have PostgreSQL and RabbitMQ servers

主要就是

  • 主要的包版本需要一致
  • redis或RabbitMQ所在服务器端口开放
  • worker和server的airflow文件夹的文件需要一样,当然AIRFLOW_HOME的值可以不一样,但是airflow.cfg文件里的一些文件路径也要修改,要不然会找不到文件。

确保以上几点后,运行 airflow worker,

Airflow1.8 分布式工作流平台搭建_第4张图片

上图显示transport为配置文件里的broker_url,result为celery_result_backend,而Running on http://0.0.0.0:8793/则是日志服务端口,可以查看日志

Airflow1.8 分布式工作流平台搭建_第5张图片

将以上链接补全后访问:

Airflow1.8 分布式工作流平台搭建_第6张图片

安装在server上flower,运行airflow flower可以监控监控worker状态:

Airflow1.8 分布式工作流平台搭建_第7张图片

Airflow1.8 分布式工作流平台搭建_第8张图片

flower默认没有开启登录,可以通过配置文件设置basic_auth 创建账户,更多配置参见配置:

[root@localhost airflow]# vim flowerconfig.py

# Broker settings
BROKER_URL = 'redis://:[email protected]:6379/0'

# RabbitMQ management api
broker_api = 'http://walwal:*****@0.0.0.0:15672/api/'

# Enable debug logging
logging = 'DEBUG'

# 设置登录的用户名和账号
basic_auth = ['walwal:walwalqq',]

address = '0.0.0.0'
# port = 8090

使用celery flower --conf=全路径/flowerconfig.py启动,完成。

你可能感兴趣的:(python2,爬虫)