Airflow 安装

前言

本次安装Airflow版本为1.10,其需要依赖Python和DB,本次选择的DB为Mysql。

本次安装组件及版本如下:

 
  1. Airflow == 1.10

  2. Python == 3.6.5

  3. Mysql == 5.7

Python安装

略 详见:Python3安装(Linux环境)

安装mysql

略 详见:http://note.youdao.com/noteshare?id=d9233511a08f557b9bf4cf939f42d0b2

建库、建用户

建库

库名为airflow

create database airflow;

建用户

用户名为airflow,并且设置所有ip均可以访问。

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

  2. create user 'airflow'@'localhost' identified by 'airflow';

用户授权

这里为新建的airflow用户授予airflow库的所有权限

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

  2. flush privileges;

Airflow安装

环境变量设置如下代码配置环境变量,此环境变量仅需要设置成临时变量即可并不需要配置成永久变量。

export SLUGIFY_USES_TEXT_UNIDECODE=yes

接下来利用pip安装airflow。

pip install apache-airflow==1.10

此时airflow会被安装到Python下的第三方包中,请记住这个地址,路径一般为${PYTHON_HOME}/lib/python3.6/sit-packages/airflow。

修改AIRFLOW_HOME 环境变量

笔者此次安装仅把HOME变量设置成临时变量,并未设置永久变量。

export AIRFLOW_HOME=/servers/airflow

执行airflow命令

在${PYTHON_HOME}/lib/python3.6/sit-packages/airflow/bin目录下执行

./airflow

此步骤是将airflow安装到刚刚设置的AIRFLOW_HOME目录下。执行这个命令可能汇报一些错误,可以不用太关注,只要保证AIRFLOW_HOME目录下生成了文件即证明本次执行成功。

安装Mysql模块

pip install "airflow[mysql]"

这里可以简单说下,airflow依赖的其他组件均可以此方式安装。在之后安装password组件同样是通过此方式。

修改Airflow DB配置

修改${AIRFLOW_HOME}/airflow.cfg

sql_alchemy_conn = mysql://airflow:airflow@localhost:3306/airflow

参数的格式为mysql://帐号:密码@ip:port/db

初始化db

新建airflow依赖的表。

./airflow initdb

修改时区为东八区

Airflow默认的时间是GMT时间,比北京时间早8小时。这种设计是为了当Airflow集群分布在不同时区的时候时间依然是相同的,不会出现时间不同步的问题。

但是在笔者接触到的场景中为单节点服务,并且即使之后拓展也是在同一个时区,所有决定将时区修改为东八时区即北京时间。

修改时区分为以下几步:

  1. 修改:airflow.cfg文件。
default_timezone = Asia/Shanghai

这里修改的是schedule的调度时间,即在编写调度时间时可以直接写北京时间。

2. 修改webserver界面右上角当前时间

修改${PYTHON_HOME}/lib/python3.6/sitepackages/airflow/www/templates/admin/master.html。

将注释部分的代码修改成红框内的代码。注释内的代码即为将系统时间转为GMT时间,修改后的代码为直接取系统时间,不做时区转换。

修改后的效果如图红框处的效果。

3. 修改webserver lastRun时间

  • 修改 ${PYTHON_HOME}/lib/python3.6/site-packages/airflow/models.py在get_last_dagrun方法上添加
 
  1. def utc2local(self,utc):

  2. import time

  3. epoch = time.mktime(utc.timetuple())

  4. offset = datetime.fromtimestamp(epoch) - datetime.utcfromtimestamp(epoch)

  5. return utc + offset

图示如下:

  • 修改${PYTHON_HOME}/lib/python3.6/site-packages/airflow/www/templates/airflow/dags.html中 last_run.execution_date..strftime("%Y-%m-%d %H:%M")和last_run.start_date.strftime("%Y-%m-%d %H:%M")分别为:
 
  1. dag.utc2local(last_run.execution_date).strftime("%Y-%m-%d %H:%M")

  2. dag.utc2local(last_run.start_date).strftime("%Y-%m-%d %H:%M")

图示如下:

* (可选操作) 重启webserver

如果按照本文顺序安装则不需要执行此步骤。如果在修改时区前已经启动过airflow则需要重启webserver。启动方式在后文会写到,停服务的方式直接kill进程的方式即可。

修改后效果如图:

用户认证

本文采用的用户认证方式为password方式,其他方式如LDAP同样支持但是本文不会介绍。笔者在安装时实验过LDAP方式但是未成功过。

  1. 安装passsword组件
thopip install "airflow[password]"

2. 修改 airflow.cfg

 
  1. [webserver]

  2. authenticate = True

  3. auth_backend = airflow.contrib.auth.backends.password_auth

3. 在python环境中执行如下代码以添加账户:

 
  1. import airflow

  2. from airflow import models, settings

  3. from airflow.contrib.auth.backends.password_auth import PasswordUser

  4. user = PasswordUser(models.User())

  5. user.username = 'admin' # 用户名

  6. user.email = 'emailExample@163.com' # 用户邮箱

  7. user.password = 'password' # 用户密码

  8. session = settings.Session()

  9. session.add(user)

  10. session.commit()

  11. session.close()

  12. exit()

配置邮件服务

此配置设置的是dag的task失败或者重试时发送邮件的发送者。配置如下:

 
  1. [smtp]

  2. # If you want airflow to send emails on retries, failure, and you want to use

  3. # the airflow.utils.email.send_email_smtp function, you have to configure an

  4. smtp_host = smtp.163.com

  5. smtp_starttls = True

  6. smtp_ssl = False

  7. # Uncomment and set the user/pass settings if you want to use SMTP AUTH

  8. smtp_user = mailExample@163.com

  9. smtp_password = password

  10. smtp_port = 25

  11. smtp_mail_from = mailExample@163.com

接下来简单把dag的Python代码列出来,以供参考:

 
  1. default_args = {

  2. 'owner': 'ownerExample',

  3. 'start_date': datetime(2018, 9, 18),

  4. 'email': ['mailReceiver@163.com'], # 出问题时,发送报警Email的地址,可以填多个,用逗号隔开。

  5. 'email_on_failure': ['mailReceiver@163.com'], # 任务失败且重试次数用完时发送Email。

  6. 'email_on_retry': True, # 任务重试时是否发送Email

  7. 'depends_on_past': False, # 是否依赖于过去。如果为True,那么必须要昨天的DAG执行成功了,今天的DAG才能执行。

  8. 'retries': 3,

  9. 'retry_delay': timedelta(minutes=3),

  10. }

设置Executor

修改:airflow.cfg

executor = LocalExecutor

本文中由于只有单节点所以使用的是LocalExecutor模式。

修改log地址

 
  1. [core]

  2. base_log_folder = /servers/logs/airflow

  3. [scheduler]

  4. child_process_log_directory = servers/logs/airflow/scheduler

修改webserver地址

 
  1. [webserver]

  2. base_url = http://host:port

可以通过上面配置的地址访问webserver。

启动Airflow

启动schedule

nohup airflow schedule &

启动webserver

nohup airflow webserver -p 8080 &

问题汇总

以下几点为笔者在安装过程总所遇问题及解决方法。

  1. pip install apache-airflow==1.10 时报错:

To avoid this dependency set SLUGIFY_USES_TEXT_UNIDECODE=yes in your environment when you install

这是由于在安装之前没有添加环境变量,执行如下代码即可:

export SLUGIFY_USES_TEXT_UNIDECODE=yes

2. 初始化db时报错:

Global variable explicit_defaults_for_timestamp needs to be on (1) for mysql

修改Mysql配置文件my.cnf,具体步骤如下:

  • 查找my.cnf文件位置
mysql --help | grep my.cnf

下图红框处为my.cnf文件所在位置:

  • 修改文件
explicit_defaults_for_timestamp=true

修改后代码如图:

注意:必须写在【mysqld】下

  • 重启Mysql
sudo systemctl restart mysql.service
  • 查看修改是否生效。执行如下SQL,如果值为1则为生效。

3. 启动webService报错:

No such file or directory: 'gunicorn': 'gunicorn'

增加环境变量:

export ${PYTHON_HOME}/bin

具体原因请看下面链接,这里不再展开讨论。

启动airflow webserver报错:FileNotFoundError: [Errno 2] No such file or directory: 'gunicorn'​www.cnblogs.com

 

4. pip install "airflow[mysql]"报错:

mysql_config not found

安装mysql-devel:

  • 首先查看是否有mysql_config文件。
find / -name mysql_config

  • 如果没有安装mysql-devel
yum install mysql-devel
  • 安装之后再次查找,结果如图:

5. 执行./aiflow 报错:

cannot import name 'CSRFProtect'

安装Flask-WTF

pip install Flask-WTF==0.14

6. 启动webserver报错:

No module named 'pymysql'

安装PyMysql

pip install PyMysql

7. 启动webserver时报错:

Error: 'python:airflow.www.gunicorn_config' doesn't exist

安装指定版本gunicorn。

Airflow1.10版本安装19.4.0版本:

pip install gunicorn==19.4.0

Airflow1.8版本安装19.3.0版本:

pip install gunicorn==19.3.0

 

 

附件dag

 
  1. #!/usr/bin/python3

  2. from airflow import DAG

  3. from airflow.operators.bash_operator import BashOperator

  4. from datetime import datetime, timedelta

  5.  
  6. default_args = {

  7. 'owner': 'zll',

  8. 'depends_on_past': False,

  9. 'start_date': datetime(2018, 12, 15),

  10. 'email': ['zhoull@getui.com'],

  11. 'email_on_failure': True,

  12. 'email_on_retry': True,

  13. 'retries': 1,

  14. 'retry_delay': timedelta(minutes=500),

  15. # 'queue': 'bash_queue',

  16. # 'pool': 'backfill',

  17. # 'priority_weight': 10,

  18. # 'end_date': datetime(2016, 1, 1),

  19. }

  20.  
  21. dag = DAG('zll1', default_args=default_args)

  22.  
  23. # t1, t2 and t3 are examples of tasks created by instantiating operators

  24. t1 = BashOperator(

  25. task_id='print_date',

  26. bash_command='date',

  27. dag=dag)

  28.  
  29. t2 = BashOperator(

  30. task_id='sleep',

  31. bash_command='sleep 5',

  32. dag=dag)

  33.  
  34. t2.set_upstream(t1)

 

 
  1. [program:airflow_webserver]

  2. command=/usr/local/bin/python2.7 /usr/local/bin/airflow webserver

  3. user=airflow

  4. environment=AIRFLOW_HOME="/home/airflow/airflow", PATH="/usr/local/bin:%(ENV_PATH)s"

  5. stderr_logfile=/var/log/airflow-webserver.err.log

  6. stdout_logfile=/var/log/airflow-webserver.out.log

  7.  
  8. [program:airflow_worker]

  9. command=/usr/local/bin/python2.7 /usr/local/bin/airflow worker

  10. user=airflow

  11. environment=AIRFLOW_HOME="/home/airflow/airflow", PATH="/usr/local/bin:%(ENV_PATH)s"

  12. stderr_logfile=/var/log/airflow-worker.err.log

  13. stdout_logfile=/var/log/airflow-worker.out.log

  14.  
  15. [program:airflow_scheduler]

  16. command=/usr/local/bin/python2.7 /usr/local/bin/airflow scheduler

  17. user=airflow

  18. environment=AIRFLOW_HOME="/home/airflow/airflow", PATH="/usr/local/bin:%(ENV_PATH)s"

  19. stderr_logfile=/var/log/airflow-scheduler.err.log

  20. stdout_logfile=/var/log/airflow-scheduler.out.log

在特定情况下,修改DAG后,为了避免当前日期之前任务的运行,可以使用backfill填补特定时间段的任务

  • airflow backfill -s START -e END --mark_success DAG_ID

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值