airflow2.0.2分布式安裝文本文档

必须安裝的部件

部件 作用
Airflow Webserver 查看数据库以监管和实行DAGs的web页面。
Airflow Scheduler 它查验数据库数据库查询中的DAG和每日任务的情况,
在必需时建立新每日任务,并将每日任务发送至序列。
Airflow Metadata Database 它包括DAG运作和每日任务案例的情况.
Airflow Message Broker 它将在序列中储存要运作的每日任务指令。
Airflow Workers 他们从序列中查找指令,运行命令,并升级数据库。

网络服务器 节点 服务项目
DATACENTER01 master1 webserver, scheduler,worker,rabbitmq(选配)
DATACENTER03 master2 webserver,scheduler
DATACENTER04 worker1 worker
DATACENTER05 worker2 worker

安裝流程:

提前准备自然环境

一、安裝erlang

由于要采用RabbitMQ,因为rabbitmq是根据erlang语言开发设计的,因此务必先安裝erlang。

版本号相匹配,如果没有规定依照文本文档来就可以

  • 安裝依靠

    yum -y install gcc glibc-devel make ncurses-devel openssl-devel xmlto perl wget gtk2-devel binutils-devel

  • 免费下载erlang

    wget http://erlang.org/download/otp_src_24.0.tar.gz

    wget https://fossies.org/linux/misc/otp_src_24.0.tar.gz(较为快)

  • 缓解压力otp_src_24.0.tar.gz

    tar -zxvf otp_src_24.0.tar.gz

  • 挪动部位

    mv otp_src_24.0 /usr/local/

  • 转换文件目录

    cd /usr/local/otp_src_24.0/

  • 建立将要安裝的文件目录

    mkdir ../erlang

  • 配备安装路径

    ./configure --prefix=/usr/local/erlang

    假如碰到以下不正确,无论

  • 安裝

    make && make install

  • 查询一下是不是安裝取得成功

    ll /usr/local/erlang/bin

  • 加上系统变量

    echo 'export PATH=$PATH:/usr/local/erlang/bin' >> /etc/profile

  • 更新系统变量

    source /etc/profile

  • 检测

    erl

  • 撤出

    键入halt().撤出

到此 erlang 安裝进行


二、安裝RabbitMQ
  • 免费下载

    wget https://GitHub.com/rabbitmq/rabbitmq-server/releases/download/v3.8.16/rabbitmq-server-generic-unix-3.8.16.tar.xz

  • 因为是tar.xz文件格式的因此必须采用xz,沒有得话就先安裝(可选)

    yum install -y xz

  • 第一次缓解压力

    /bin/xz -d rabbitmq-server-generic-unix-3.8.16.tar.xz

  • 第二次缓解压力

    tar -xvf rabbitmq-server-generic-unix-3.8.16.tar

  • 挪走

    mv rabbitmq_server-3.8.16/ /usr/local/

  • 更名

    cd /usr/local/
    mv /usr/local/rabbitmq_server-3.7.15 rabbitmq

  • 配备系统变量

    echo 'export PATH=$PATH:/usr/local/rabbitmq/sbin' >> /etc/profile

  • 更新系统变量

    source /etc/profile

  • 建立配备文件目录(未应用独立的环境变量,此流程能够无需)

    mkdir /etc/rabbitmq

  • 运行

    rabbitmq-server -detached

  • 终止

    rabbitmqctl stop

  • 情况

    rabbitmqctl status

  • 打开web软件

    rabbitmq-plugins enable rabbitmq_management

  • 浏览:15672端口号

http://127.0.0.1:15672/

默认设置账户密码:guest guest(这一账户只允许该设备浏览)

  • 查询全部客户

    rabbitmqctl list_users

  • 加上一个客户

    rabbitmqctl add_user lillcol 123456

  • 配备管理权限

    rabbitmqctl set_permissions -p "/" lillcol ".*" ".*" ".*"

  • 查询用户权限

    rabbitmqctl list_user_permissions lillcol

  • 设定tag

    rabbitmqctl set_user_tags lillcol administrator

  • 清理数据(安全起见,删掉默认设置客户)

    rabbitmqctl delete_user guest

  • 配备好客户以后重新启动一下rabbit,随后就可以用新账户开展登录


三、安裝python3.7.5

经检测,3.7.5一下版本号安装airflow全过程中会发生各种各样难题,因此必须安裝3.7.5,(3.7.5 没检测不清楚是否会出难题)

  • 安裝编译程序有关专用工具
yum -y groupinstall "Development tools"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
yum install libffi-devel -y
  • 下载安装包缓解压力

    wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tar.xz

    tar -xvJf Python-3.7.5.tar.xz

  • 编译程序安裝python

    mkdir /usr/python3.7 #建立编译程序安装文件

    cd Python-3.7.5

    ./configure --prefix=/usr/python3.7 --enable-optimizations

    make && make install

  • 创建软连接

    ln -s /usr/python3.7/bin/python3 /usr/bin/python3.7

    ln -s /usr/python3.7/bin/pip3 /usr/bin/pip3.7

  • 认证是不是取得成功

    python3.7 -V

    pip3.7 -V

[root@DATACENTER04 bin]# python3.7 -V
Python 3.7.5
[root@DATACENTER04 bin]# pip3.7 -V

pip 19.2.3 from /usr/python3.7/lib/python3.7/site-packages/pip (python 3.7)
  • 升級pip3.7

    安装airflow pip版本过低会造成 不兼容

    pip3.7 install --upgrade pip==21.1.2
[root@DATACENTER04 bin]# pip3.7 install --upgrade pip==21.1.2
[root@DATACENTER04 bin]# pip3.7 -V
pip 21.1.2 from /usr/python3.7/lib/python3.7/site-packages/pip (python 3.7)
  • 安裝gunicorn

    pip3.7 install --upgrade pip==21.1.2
三、配备mysql

这里应用mysql开展元数据管理,规定mysql 5.7 之上版本号。

  • 建立airflow_db库
    CREATE DATABASE airflow_db CHARACTER SET UTF8米b3 COLLATE utf8_general_ci;

留意要用UTF8米b3,UTF8米b4在检测全过程中发生不正确

  • 改动管理权限
CREATE USER 'airflow' IDENTIFIED BY 'airflow123';
GRANT ALL PRIVILEGES ON airflow_db.* TO 'airflow';

安装airflow

一、安装airflow
  • 配备apps sudo管理权限(root)

    给apps客户sudo管理权限,vi /etc/sudoers,,添加下边句子,不然安裝install的情况下很有可能会不成功
## Allow root to run any commands anywhere 
root	ALL=(ALL) 	ALL
apps    ALL=(ALL)                NOPASSWD: ALL #添加这一句
  • 配备airflow系统变量(root)

    安装完后airflow安装路径默认设置为:/home/apps/.local/bin,vi /etc/profile尾端添加以下內容:

    export PATH=$PATH:/usr/python3/bin:/home/apps/.local/bin

    source /etc/profile

这里的/home/apps/.local/bin 为~/.local/bin,

依据具体配备PATH=$PATH:~/.local/bin

  • 配备hosts(root),vi /etc/hosts,添加下边句子
199.232.68.133 raw.githubusercontent.com
  • 配备系统变量(apps)(可选,默认设置~/airflow)
export AIRFLOW_HOME=~/airflow
  • 配备版本信息(apps)
AIRFLOW_VERSION=2.0.2 # airflow版本号
PYTHON_VERSION="$(python3.7 --version | cut -d " " -f 2 | cut -d "." -f 1-2)" # python版本号
CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt" # 管束url
  • 安装airlfow(apps)

    实行安裝指令,留意得加sudo,不然会出现一部分缺少,可是沒有出错
sudo pip3.7 install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}" --use-deprecated legacy-resolver  [-i https://pypi.douban.com/simple]
  • 假如上边的流程顺利实行,这时会出现airflow指令,而且会建立~/airflow,进到airflow文件目录以下

注:以上流程必须在全部安裝节点开展实际操作


二、配备airflow

再看一遍安裝整体规划

网络服务器 节点 服务项目
DATACENTER01 master1 webserver, scheduler,worker,rabbitmq(选配)
DATACENTER03 master2 webserver,scheduler
DATACENTER04 worker1 worker
DATACENTER05 worker2 worker

这时的构架以下




序列服务项目及元数据库查询(Metestore)的高可用性

序列服务项目选用RabbitMQ,早已安裝在DATACENTER01,能够根据布署高可用性完成序列的高可用性,(本实例沒有对序列做高可用性)

元数据库查询(Metestore) 高可用性
在于所应用的数据库查询,这里选用mysql。能够根据布署主从关系备份数据完成高可用性

  • 配备scheduler高可用性

    我们可以根据第三方部件 airflow-scheduler-failover-controller 完成 scheduler 的高可用性,安裝配备流程以下:
1. 免费下载failover
gitclone https://github.com/teamclairvoyant/airflow-scheduler-failover-controller
//网络不好有时下不出来,能够去找别的資源随后提交网络服务器安裝

2. 安裝failover
cd{AIRFLOW_FAILOVER_CONTROLLER_HOME}
sudo pip3.7 install -e . [-i https://pypi.douban.com/simple] 

3. 复位 failover
sudo pip3.7 install -e . [-i https://pypi.douban.com/simple] 
//复位 failover 会向${AIRFLOW_HOME}/airflow.cfg中增加內容

4. 变更${AIRFLOW_HOME}/airflow.cfg配备,4~7 流程以后的全部流程能够后边统一实际操作
scheduler_nodes_in_cluster= DATACENTER01,DATACENTER03

5. 配备DATACENTER01,DATACENTER03中间免密支付登录

6. 检测免密支付登录
scheduler_failover_controller test_connection  
scheduler_failover_controller get_current_host //获得当今的host,能够用以查询安裝状况

7. 运行failover
nohup scheduler_failover_controller start >/dev/null 2>&1 &
  1. failover必须在运作scheduler的网络服务器上布署,这里必须在DATACENTER01,DATACENTER03布署
  2. 免密支付登录配备参照Centos7下完成免登录密码
  • 配备{AIRFLOW_HOME}/airflow.cfg

    将一下內容配备进{AIRFLOW_HOME}/airflow.cfg
1.  Executor 为 CeleryExecutor
# executor = LocalExecutor
executor = CeleryExecutor

2. 特定元数据库查询(metestore)
#sql_alchemy_conn = sqlite:////home/apps/airflow/airflow.db
sql_alchemy_conn = mysql pymysql://airflow:airflow123@10.0.0.1:3306/airflow_db

3. 设定broker,即消息队列,这里应用 RabbitMQ
# broker_url = redis://redis:6379/0
broker_url = amqp://lillcol:123456@DATACENTER01:5672/

4. 设置結果储存后端开发 backend
# result_backend = db postgresql://postgres:airflow@postgres/airflow
# 自然您还可以应用 Redis :celery_result_backend =redis://{REDIS_HOST}:6379/1
# celery_result_backend = db mysql://airflow:airflow123@10.0.0.1:3306/airflow_db 
# 留意这里要用result_backend,有一些blog应用celery_result_backend,可是在检测全过程中会无法识别
result_backend = db mysql://airflow:airflow123@10.0.0.1:3306/airflow_db

5. 配备scheduler_nodes_in_cluster容错机制节点
scheduler_nodes_in_cluster= DATACENTER01,DATACENTER03

6.改动时区时间 
# default_timezone = utc
default_timezone = Asia/Shanghai

7. 配备web端口(默认设置8080,由于已被占有这里改成8081)
endpoint_url = http://localhost:8081
base_url = http://localhost:8081
web_server_port = 8081

8. 关掉载入实例(可选)
# load_examples = True
load_examples = False

9. 电子邮件有关配备(可选)
[smtp]
smtp_host = mail.ndpmedia.com
smtp_starttls = True
smtp_ssl = False
smtp_user = user
smtp_password = pass
smtp_port = 25
smtp_timeout = 30
smtp_mail_from =与user同样
smtp_retry_limit = 5

将改动后的{AIRFLOW_HOME}/airflow.cfg同歩到全部安装airflow的网络服务器上


三、运行airflow群集
  • 复位数据库查询(apps@DATACENTER0):airflow db init

次流程会在mysql上建立有关元数据分析表

  • 建立客户(apps@DATACENTER01):
airflow users create \
    --username admin \
    --firstname Peter \
    --lastname Parker \
    --role Admin \
    --email spiderman@superhero.org
Password:123456
  • 运行webserver:
airflow webserver -D

次流程在DATACENTER01,DATACENTER03实行

  • 运行scheduler
#1. 必须先运行scheduler容错机制软件scheduler_failover_controller,
#   此流程在DATACENTER01,DATACENTER03实行
nohup scheduler_failover_controller start >/dev/null 2>&1 &

#2. 运行scheduler,次流程只必须在DATACENTER01实行
nohup airflow scheduler >/dev/null 2>&1 &

同一时间只有运行一个scheduler,一旦运作 scheduler xinetd的设备发生常见故障,马上运行另一台设备上的 scheduler 。

  • 运行worker
#1. 保证 必需手机软件早已安裝
sudo pip3.7 install pymysql
sudo pip3.7 install celery
sudo pip3.7 install flower
sudo pip3.7 install psycopg2-binary

#2. 先运行flower,在必须运行worker网络服务器实行,这里在DATACENTER01,DATACENTER04实行
airflow celery flower -D

#3. 运行worker,在必须运行worker网络服务器实行,这里在DATACENTER01,DATACENTER04实行
airflow celery worker -D

保证 worker的8793早已对外开放,WEB UI查询log的情况下没法载入有关日志


四、运行airflow群集
  • 登录web UI
# 由于在DATACENTER01、DATACENTER03运行了webserver,能够根据下边二选一开启WEB UI
http://DATACENTER01:8081
http://DATACENTER03:8081

账户:Admin 登陆密码:123456

登录后能够增加别的的客户

五、配备、实行dag

  • 配备dags

    airflow 的dags默认设置在{AIRFLOW_HOME}/dags

    每日任务根据scheduler生产调度,并根据worker实行

    因此在全部有运行scheduler和worker的网络服务器上面要有同样的dags与有关脚本制作

    即大家必须确保全部节点下的{AIRFLOW_HOME}/dags及其依靠的脚本制作是一致的

    假如不一致很有可能造成 2个結果:
  1. WEB UI中的dags与{AIRFLOW_HOME}/dags中不一致

在于当今scheduler上边的{AIRFLOW_HOME}/dags

  1. 每日任务实行不成功

在相匹配的woker上找不着实行的dag或有关脚本制作

例如现阶段scheduler 运作在DATACENTER03,这时{AIRFLOW_HOME}/dags以下:

[apps@DATACENTER03 dags]$ ll
total 40
-rw-r--r-- 1 apps dolphinscheduler 12513 May 28 15:14 DAG_**_D2.py
-rw-r--r-- 1 apps dolphinscheduler 12512 May 25 17:51 DAG_**_D.py
drwxr-xr-x 2 apps dolphinscheduler   132 Jun  4 18:03 __pycache__
-rw-r--r-- 1 apps dolphinscheduler  1381 Jun  4 16:43 TEST_RUN2.py
-rw-r--r-- 1 apps dolphinscheduler  1380 Jun  1 09:02 TEST_RUN.py

WEB UI以下:

  • 运行每日任务

  • 观察实行状况

执行任务的(woker)节点为:DATACENTER01

执行任务的(woker)节点为:DATACENTER04

因此大家务必确保全部节点的dags 与 依靠脚本制作同歩


处理错误

  • Specified key was too long
[apps@DATACENTER03 airflow]$ airflow db init
...
    raise errorclass(errno, errval)
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1071, 'Specified key was too long; max key length is 3072 bytes')
[SQL: ALTER TABLE xcom ADD CONSTRAINT pk_xcom PRIMARY KEY (dag_id, task_id, `key`, execution_date)]

解决方案:

#建立airflow_db情况下特定编号
#CREATE DATABASE airflow_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE DATABASE airflow_db CHARACTER SET UTF8米b3 COLLATE utf8_general_ci;

CREATE USER 'airflow' IDENTIFIED BY 'airflow123';
GRANT ALL PRIVILEGES ON airflow_db.* TO 'airflow';

  • explicit_defaults_for_timestamp 不正确
MySQL [(none)]> show global variables like '%timestamp%';
 --------------------------------- -------- 
| Variable_name                   | Value  |
 --------------------------------- -------- 
| explicit_defaults_for_timestamp | OFF    |
| log_timestamps                  | SYSTEM |
 --------------------------------- -------- 
2 rows in set (0.02 sec)

# 改动explicit_defaults_for_timestamp=1
MySQL [(none)]> set global explicit_defaults_for_timestamp =1;
Query OK, 0 rows affected (0.00 sec)

MySQL [(none)]> show global variables like '%timestamp%';
 --------------------------------- -------- 
| Variable_name                   | Value  |
 --------------------------------- -------- 
| explicit_defaults_for_timestamp | ON     |
| log_timestamps                  | SYSTEM |
 --------------------------------- -------- 

  • -bash: airflow: command not found

    安装完后沒有发生airflow指令及其有关构造,解决方案有两个
  1. 卸载掉apache-airflow,重装一次,指令以下:
sudo pip3.7 uninstall apache-airflow==2.0.2
pip3.7 install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}" --use-deprecated legacy-resolver
  1. 将~/.local/bin添加PATH ,(强烈推荐,在airflow安裝前配备)
PATH=$PATH:~/.local/bin

  • No module named 'airflow'
# 在运行webserver的情况下很有可能会发生下边的不正确,一样的解决方式
No module named 'airflow'
No module named 'airflow.www'
No module named 'airflow.www.gunicorn_config'
FileNotFoundError: [Errno 2] No such file or directory: 'gunicorn': 'gunicorn'

解决方案:

#建立/usr/python3.7/bin/gunicorn的导电软连接更换原先的gunicorn,
#很有可能在``/usr/python3/bin``或``/usr/bin``下,实际看情况实际操作
1. 删掉原先的导电软连接 
sudo rm -rf /usr/python3/bin/gunicorn
2. 建立新的导电软连接 
sudo ln -s /usr/python3.7/bin/gunicorn /usr/python3/bin

airflow webserver运作时,会启用subprocess.Popen建立子过程,webserver应用gunicorn

实行gunicorn运作时,很有可能是在PATH中找不着该指令出错

也可能是gunicorn的版本号过低造成 出错

现阶段的版本号最少是gunicorn (version 19.10.0)

  • ModuleNotFoundError: No module named 'MySQLdb'

    运行worker的情况下ModuleNotFoundError: No module named 'MySQLdb'

    解决方案安裝mysqlclient(python 3.7 要安裝mysqlclient):
sudo pip3.7 install mysqlclient

  • 没法载入worker端log

    airlfow日志默认设置储存在{AIRFLOW_PATH}/logs/{dag}/...下,

    这时在载入在web 端载入不上日志很有可能有二种状况
  1. 未对外开放worker的8793端口号,解决方案开放端口
  2. 此文件目录的的管理权限难题,对外开放{AIRFLOW_PATH}的管理权限就可以

  • 配备免密支付登录,可是实行scheduler_failover_controller test_connection的情况下或是必须输入支付密码

    免密支付配备难题,很有可能2个缘故:
  1. 管理权限难题

    sshd为了更好地安全性,对属主的文件目录和文件权限有一定的规定。假如管理权限不对,则ssh的免登陆密码登录不起效。
    规定以下:
#客户文件目录管理权限为 755 或是 700,便是不可以是77x。
#.ssh文件目录管理权限一般为755或是700。
#rsa_id.pub 及authorized_keys管理权限一般为644
#rsa_id管理权限务必为600
将文件目录改为相匹配的管理权限就可以
  1. 服务器防火墙的难题

    关闭防火墙检测
systemctl status firewalld

参照文本文档:

官方网安裝文本文档

airflow 的安裝布署与填大坑


怎样布署一个健硕的 apache-airflow 智能监控系统

评论(0条)

刀客源码 游客评论