airflow架构

400 阅读6分钟

提示:linux系统默认python2.7 有些软件安装需要python3.x支持,此文介绍如何升级python到3.x

airflow api地址:https://airflow.apache.org/docs/apache-airflow/1.10.1/scheduler.html

@TOC

一、安装python环境

1、安装依赖

yum install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev curl libbz2-dev

2、下载安装包

#wget https://www.python.org/ftp/python/3.7.10/Python-3.7.10.tar.xz
wget https://zhengyansheng.oss-cn-beijing.aliyuncs.com/Python-3.7.10.tar.xz
tar xf Python-3.7.10.tar.xz
cd Python-3.7.10

3、编译&安装python源码包

这里一定要带上编译参数--with-ssl,该参数是编译python是加入SSL,如果没有在使用pip3时会报错SSL有问题
./configure --with-ssl
make
sudo make altinstall

4、将默认python替换成python3

unlink /usr/bin/python
ln -sv /usr/local/python37/bin/python3.7 /usr/bin/python
unlink /usr/bin/pip3
ln -sv /usr/local/bin/pip3.7 /usr/bin/pip3

5、修改python源

cat > /etc/pip.conf << EOF
[global]
trusted-host = mirrors.aliyun.com
index-url = http://mirrors.aliyun.com/pypi/simple/

[list]
format=columns
EOF

6、升级pip==20.2.4

pip3.7 install --upgrade pip==20.2.4
# 查看版本
python --version
pip3.7 --version 

注意事项: 由于将OS系统默认的Python版本更改了,导致系统自带的命令行工具(yum/ urlgrabber-ext-down/ yum-config-manager)无法直接使用,需要做更改才行

1. vi /usr/bin/yum
2. vi /usr/libexec/urlgrabber-ext-down
3. vi /usr/bin/yum-config-manager
将头文件修改为原本的python2.x即可
#!/usr/bin/python2.7

二、安装mysql

1、安装

yum list installed | grep mysql
卸载
yum remove ....xxxx
wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
安装成功后,会在/etc/yum.repos.d/目录下增加了以下两个文件 如下图
启动mysql
yum install mysql-server
查看mysql版本
mysql -V

在这里插入图片描述

2、启动数据库

# 1. Start mysql
service mysqld start

# 2. view mysql login password 查看初始密码  或者使用mysql -uroot -p登录 密码不需要输入
grep "password" /var/log/mysqld.log 
echo explicit_defaults_for_timestamp=1 >> /etc/my.cnf
systemctl restart mysqld.service

3、创建数据库

mysql -uroot -p <xxx>
修改root密码
use mysql; 
update user set password=password('123456') where user='root' and host='localhost'; 
grant all privileges on *.* to root@"%" identified by "123456";
flush privileges;
创建airflow数据库
CREATE DATABASE `airflow` /*!40100 DEFAULT CHARACTER SET utf8 */;
GRANT ALL ON airflow.* TO 'airflow_user'@'%';
FLUSH PRIVILEGES;

三、安装redis

1、安装

# 1. Install remi yum repo
yum install -y epel-release yum-utils
yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum-config-manager --enable remi

# 2. Install redis latest version
yum install -y redis

2、配置

# vi /etc/redis.conf
bind 0.0.0.0

3、启动

# 1. Start redis
systemctl start redis && systemctl enable redis
systemctl status redis

# 2. View redis
ps -ef |grep redis

# 3. Test
redis-cli ping

# 4. View version
redis-cli --version

四、安装ariflow

1、安装

docker部署方式 https://github.com/airflow-cn/airflow-video/blob/master/3-deploy.md

# 1. Set env
export AIRFLOW_HOME=~/airflow

# 2. Install apache-airflow 2.1.0
AIRFLOW_VERSION=2.1.0
PYTHON_VERSION="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)"
CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt"
可以先下载CONSTRAINT_URL  超时的话去掉https--http 
wget http://raw.githubusercontent.com/apache/airflow/constraints-2.1.0/constraints-3.7.txt
pip3.7 install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}"
或
pip3.7 install "apache-airflow==${AIRFLOW_VERSION}" --constraint constraints-3.7.txt

2、初始化数据库

# 1. Set up database
## https://airflow.apache.org/docs/apache-airflow/2.1.0/howto/set-up-database.html#
pip3.7 install pymysql
airflow config get-value core sql_alchemy_conn  # 这一步报错,但是会创建文件/opt/module/airflow/airflow.cfg

# 2. Initialize the database
"""
# vi ~/airflow/airflow.cfg
[core]
sql_alchemy_conn = mysql+pymysql://airflow_user:123456@localhost:3306/airflow

airflow db init
1.报错
Global variable explicit_defaults_for_timestamp needs to be on (1) for mysql
解决
vim /usr/my.cnf
添加
[mysqld]
explicit_defaults_for_timestamp=1
2.报错
Native table 'performance_schema'.'session_variables' has the wrong structure"
运行命令
mysql_upgrade -u root -p --force
service mysqld restart

3、创建用户

# Create superuser
airflow users create \
    --username admin \
    --firstname l\
    --lastname a \
    --role Admin \
    --email xxxx@qq.com
输入密码:123456

4、启动服务

后台启动加 airflow webserver --port 8080  -D
airflow webserver --port 8080 

提示:黄色字表示未运行scheduler调度器 此时打开任务不会运行调度 在这里插入图片描述 运行调度器 此时打开任务 该任务每秒执行一次

airflow scheduler

在这里插入图片描述

5、分布式部署

5.1、安装依赖

pip install 'apache-airflow[celery]'
pip install celery[redis]

5.2、设置executor

[core]
# The executor class that airflow should use. Choices include
# ``SequentialExecutor``, ``LocalExecutor``, ``CeleryExecutor``, ``DaskExecutor``,
# ``KubernetesExecutor``, ``CeleryKubernetesExecutor`` or the
# full import path to the class when using a custom executor.
# executor = SequentialExecutor
executor = CeleryExecutor


[celery]
# broker_url = redis://redis:6379/0
broker_url = redis://hadoop102:6379/0

# result_backend = db+postgresql://postgres:airflow@postgres/airflow
result_backend = redis://hadoop102:6379/0

5.3、启动

# 1. Start webserver
airflow webserver -p 8000

# 2. Start scheduler
airflow scheduler

# 3. Start celery worker
airflow celery worker

# 4. Start celery flower
airflow celery flower

5.4、管理界面

Webserver 在这里插入图片描述 flower 在这里插入图片描述

5.5 演示

启动 在这里插入图片描述 查看scheduler日志 在这里插入图片描述 查看Worker日志 在这里插入图片描述

6、示例

提示:在~/airflow新建dags目录

6.1、demo开发

vim demo_test.py
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta
from airflow.utils.dates import  days_ago


default_args = {
    'owner': 'airflow',
    'depends_on_past': False
    'email': ['xxxxxx@qq.com'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
    # 'queue': 'bash_queue',
    # 'pool': 'backfill',
    # 'priority_weight': 10,
    # 'end_date': datetime(2016, 1, 1),
}

with DAG(
	'demo_test',
	default_args=default_args,
	schedule_interval=timedelta(minutes=1),
	description='A simple tutorial DAG',
	start_date=days_ago(2),
	tags=['test']
) as dag:
	t1 = BashOperator(
		task_id='print_date',
		bash_command='date'
	)
	
	t2 = BashOperator(
		task_id='sleep',
		depends_on_past=False,
		bash_command='sleep 5',
		retries=3
	)
	
	templated_command = (
		"""
		{% for i in range(5) %}
			echo "{{ ds }}"
			echo "{{ macros.ds_add(ds, 7)}}"
			echo "{{ params.my_param }}"
		{% endfor %}
	"""
	)
	
	t3 = BashOperator(
		task_id='templated',
		bash_command=templated_command,
		params={'my_param': 'Parameter I passed in'}
	)
	t2.set_upstream(t1)
	t3.set_upstream(t1)
	#或者 使用 t1 >> [t2, t3]

6.2、重新启动

airflow webserver --port 8080

提示:每分钟执行一次,也可以手动触发 在这里插入图片描述

7、airflow架构

Airflow 的核心概念是 DAG (有向无环图)。DAG 由一个或多个 task 组成,而这个 DAG 正是解决了上文所说任务间的依赖问题。 任务执行的先后依赖顺序、多个 task 之间的依赖关系可以很好的用 DAG 表示完善。

7.1、分布式架构

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 主要是dag_run表和task_instance表 dag_run表记录一个任务,task_instance表记录拆分的多个task 在这里插入图片描述

7.2、组件

元数据库:这个数据库存储有关任务状态的信息。
调度器:Scheduler 是一种使用 DAG 定义结合元数据中的任务状态来决定哪些任务需要被执行以及任务执行优先级的过程。 调度器通常作为服务运行。
执行器:Executor 是一个消息队列进程,它被绑定到调度器中,用于确定实际执行每个任务计划的工作进程。 有不同类型的执行器,每个执行器都使用一个指定工作进程的类来执行任务。 例如,LocalExecutor 使用与调度器进程在同一台机器上运行的并行进程执行任务。 其他像 CeleryExecutor 的执行器使用存在于独立的工作机器集群中的工作进程执行任务。
Workers:这些是实际执行任务逻辑的进程,由正在使用的执行器确定。

7.3、运行流程

在这里插入图片描述

  1. 将要执行的任务发送到redis的队列默认default队列,由work进行处理
  2. 处理完结果celery-task-meta-xxxxx发送到redis由执行器更新task执行结果 1.
用户编写Dag文件
SchedulerJob发现新增DAG文件,根据starttime \endtime\schedule_interval将Dag转为Dagrun。由于Dag仅仅是一个定位依赖关系的文件,因此需要调度器将其转为具体的任务。在细粒度层面,一个Dag转为若干个Dagrun,每个dagrun由若干个任务实例组成,具体来说,每个operator转为一个对应的Taskinstance。Taskinstance将根据任务依赖关系以及依赖上下文决定是否执行。
任务的执行将发送到执行器上执行。具体来说,可以在本地执行,也可以在集群上面执行,也可以发送到celery worker远程执行。
在执行过程中,先封装成一个LocalTaskJob,然后调用taskrunner开启子进程执行任务。

简易安装: ### 离线安装

准备离线包,python可以配置百度源加速下载。

#初始化系统环境
yum -y install epel-release
yum install yum-utils –y
yum install python3 -y
pip install --upgrade pip

#准备python3环境
yumdownloader --resolve --archlist=x86_64 --destdir=/root/mysql-devel mysql-devel gcc gcc-c++ python-devel python3-devel
yumdownloader --resolve --archlist=x86_64 --destdir=/root/python3 python3

#准备pip离线包
mkdir py_packages && cd py_packages

#准备airflow离线包
pip download apache-airflow
pip download celery

#下载mysqlclient需要先安装mysql-devel
pip download mysqlclient
pip download pip

从离线包安装

yum install python3/* -y
yum install mysql-devel/* -y

#升级pip
pip3 install --upgrade --no-index --find-links=file:./py_packages pip
#安装airflow和依赖
pip install --no-index --find-links=file:./py_packages apache-airflow celery mysqlclient

airflow需要配置的项

executor = CeleryExecutor
#数据库连接
sql_alchemy_conn = mysql://root:xxx@10.8.1.189:3307/airflow
#时区
default_timezone = Asia/Shanghai
auth_backend = airflow.api.auth.backend.default
#mq加vhost需要在mq管理界面添加访问路径
broker_url = pyamqp://airflow:dataqin.com@10.8.1.189:5672/vhost_airflow
result_backend = db+mysql://root:xxx@10.8.1.189:3307/airflow