1. 安装MySQL
首先确保已经安装好 MySQL,最少是 5.7 版本以上,个人建议 MySQL 8.0。
2. 配置相关数据库
使用 MySQL root 账户创建 airflow 数据库、用户以及相关权限,后续我们将配置 MySQL 作为 Backend 数据库。当然,如果你只是想尝试一下,可以直接跳到第 3 步。
> CREATE DATABASE airflow;> ALTER DATABASE airflow CHARACTER SET utf8;> CREATE USER 'airflow'@'localhost' IDENTIFIED BY 'airflow1234';> GRANT ALL PRIVILEGES ON airflow.* TO 'airflow'@'localhost';> FLUSH PRIVILEGES;> SET GLOBAL explicit_defaults_for_timestamp=1;
3. 安装Airflow
关于 Airflow 安装,其实官网上已经非常详细了,直接使用 pip 就可以进行安装。值得一提的是,如果你后续想要将Airflow、Zeppelin 和 Superset 放在一个环境中使用的话,个人推荐还是使用 Python 3.7 环境。
$ export AIRFLOW_HOME=~/bigdata/airflow$ AIRFLOW_VERSION=2.3.0$ PYTHON_VERSION=3.9$ CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt"# For example: https://raw.githubusercontent.com/apache/airflow/constraints-2.0.2/constraints-3.6.txt$ pip install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}"
4. 安装第三方插件
Airflow 有很多非常好用的第三方插件,提供了功能非常丰富的 Hooks 和 Operators,目前官方(2.2 版本) 所列出来的第三方插件如下:
在终端中执行以下代码来安装常用的第三方插件,其中 pykerberos 、pyodbc、mysqlclient 需要先使用 conda 进行安装:
$ conda install pykerberos pyodbc mysqlclient -y$ pip install 'apache-airflow[async, celery, cgroups, cncf.kubernetes, dask, github_enterprise, google_auth]'$ pip install 'apache-airflow[kerberos, ldap, leveldb, pandas, password, rabbitmq, sentry, statsd, virtualenv]'$ pip install 'apache-airflow[docker, jenkins, mongo, neo4j, redis, postgres, microsoft.mssql, odbc, mysql, hdfs]'$ pip install 'apache-airflow[ftp, grpc, http, imap, jdbc, papermill, sftp, sqlite, ssh]'$ pip install 'apache-airflow[dingding, jira, tableau]'
5. 命令行补全
Airflow 提供了命令行 Tab 补全,通过以下方式进行安装和激活:
$ pip install argcomplete$ activate-global-python-argcomplete
添加下面内容到 .zshrc,然后执行 source ~/.zshrc:
export AIRFLOW_HOME=$HOME/bigdata/airflowexport SLUGIFY_USES_TEXT_UNIDECODE=yesexport PYTHONPATH="/home/yumingmin/bigdata/airflow/plugins"autoload bashcompinitbashcompiniteval "$(register-python-argcomplete airflow)"
6. 配置Airflow
6.1 AIR_HOME变量
在 ~/.zshrc、~/.bash_profile 中添加 AIRFLOW_HOME 变量:
export AIRFLOW_HOME=$HOME/bigdata/airflowexport SLUGIFY_USES_TEXT_UNIDECODE=yes
6.2 修改airflow.cfg
先执行 airflow db init 来在制定目下生成相关文件(该方式使用的数据库是 sqlite),我们在相关文件上进行修改就比较简单了。
主要关注以下几个地方需要进行修改:
[core]default_timezone = Asia/Shanghaiexecutor = CeleryExecutorsql_alchemy_conn = mysql+pymysql://airflow:airflow1234@localhost:3306/airflow?charset=utf8&unix_socket=/var/run/mysqld/mysqld.socksql_alchemy_pool_size = 0sql_alchemy_max_overflow = -1parallelism = 64dag_concurrency = 32load_examples = Falseload_default_connections = False[webserver]base_url = http://localhost:9000default_ui_timezone = Asia/Shanghaiweb_server_port = 9000reload_on_plugin_change = True# 下面2行是没有的,需要添加authenticate = Trueauth_backend = airflow.contrib.auth.backends.password_auth[smtp]smtp_host = airflow.comsmtp_starttls = Truesmtp_ssl = Falsesmtp_user = airflowsmtp_password = airflow1234smtp_port = 25smtp_mail_from = airflow@airflow.com[celery]worker_concurrency = 32broker_url = redis://localhost:6379/0flower_url_prefix = /flowerresult_backend = db+pymysql://airflow:airflow1234@localhost:3306/airflow?charset=utf8&unix_socket=/var/run/mysqld/mysqld.sock
7. 创建用户
$ airflow users create --username admin --firstname Mingmin --lastname Yu --role Admin --email yu_mingm623@163.com
8. 一些常见问题总结
8.1 MySQLdb库为安装
在使用 airflow db init 命令来初始化时,如果你连接的数据库是 MySQL,经常会遇到提示 MySQLdb 库还未安装。
解决办法:可以先尝试安装以下 mysqlclient 库,看看能不能解决:
$ pip install mysqlclient
8.2 _mysql is not defined
解决办法:如果上述方法并不能解决问题,这个时候我们可以使用 pymysql 库来替代,这在 Python 3.x 是非常常见的做法。在 ~/bigdata/miniconda3/lib/python3.6/site-packages/airflow/__init__.py 头部添加以下代码:
import pymysql# pymysql.version_info = (1, 4, 13, "final", 0) # 如果提示 MySQLdb 版本太低,可以手动指定版本pymysql.install_as_MySQLdb()
8.3 DateTime2literal问题
修改完之后,再次运行 airflow db init 还是有报错,但是这次报错如下:
File "~/bigdata/miniconda3/lib/python3.6/site-packages/airflow/settings.py", line 333, in configure_adaptersMySQLdb.converters.conversions[Pendulum] = MySQLdb.converters.DateTime2literalAttributeError: module 'pymysql.converters' has no attribute 'DateTime2literal'
解决办法:打开 ~/bigdata/miniconda3/lib/python3.6/site-packages/airflow/settings.py 文件,找到 configure_adapters 函数,注释掉以下内容:
try:import MySQLdb.convertersMySQLdb.converters.conversions[Pendulum] = MySQLdb.converters.DateTime2literalexcept ImportError:pass
8.4 Specified key was too long; max key length is 3072 bytes
解决办法:修改 MySQL 中 airflow 数据库的编码
> ALTER DATABASE airflow CHARACTER SET utf8;
9. 启动
$ airflow webserver$ airflow scheduler# 如果安装 apache-airflow[celery] 的话$ airflow celery flower$ airflow celery worker
