使用版本:
python 3.6.8
apache-airflow 1.10.3
文章目錄
安裝
python 環境準備
apache-airflow 對於 python 版本限制如下:
requires Python '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*'
# wget 用於下載源碼包, gcc 和 make 用於編譯
yum install wget gcc make
# 下載 python 安裝包,使用源碼安裝
wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
# 解包,解壓縮
xz -d Python-3.6.8.tar.xz
tar -xvf Python-3.6.8.tar
# 編譯
cd Python-3.6.8
./configure --prefix=/usr/local/python3.6.8 --enable-optimizations --with-openssl=/usr/bin/openssl
make && make install
# 添加 python3.6 爲環境變量 或 建立軟連接
export PATH="/usr/local/python3.6.8/bin:$PATH"
sudo ln -s /usr/local/python3.6.8/bin/python3.6 /usr/bin/python3.6
# 創建一個名爲 airflow_env 的虛擬環境, 並指定 python 版本
cd ~
python3.6 -m venv airflow_env
# 切換到虛擬環境
source ~/_pyenv/airflow_env/bin/activate
ps: 如果不想用源碼安裝,可以選擇方便的yum
安裝 airflow
# 由於打算使用MYSQL,要求MYSQL版本 5.6.4+
pip install 'apache-airflow[mysql]'
ps:若安裝失敗
1、報錯:Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-l2qrj2co/pendulum
maybe 需要升級一下
pip install --upgrade pip
pip install --upgrade setuptools
# 需要設置一個 airflow 的家目錄,
第一次運行 Airflow 時,它將創建一個 airflow.cfg 在 $AIRFLOW_HOME 目錄中(默認情況下在 ~/airflow )。此文件包含 Airflow 的配置。
初始化數據庫後端
使用MYSQL的前置條件
1 確保 在[mysqld]下的my.cnf中指定了explicit_defaults_for_timestamp = 1
否則會報錯:Exception: Global variable explicit_defaults_for_timestamp needs to be on (1) for mysql
解決方法:在my.cnf中添加或修改explicit_defaults_for_timestamp=true
2 參考修改配置文件 ~/airflow/airflow.cfg
[core]
executor = LocalExecutor # 代表本地任務可並行執行
sql_alchemy_conn = mysql+mysqldb://root:[email protected]:3306/airflow
ps:不能用pymysql,在看log的時候會報錯 pendulum object has no attribute 'translate'.
# executor 簡介
SequentialExecutor:單進程順序執行任務,默認執行器,通常只用於測試
LocalExecutor:多進程本地執行任務
CeleryExecutor:分佈式調度,生產常用
DaskExecutor :動態任務調度,主要用於數據分析
# 建數據庫
CREATE DATABASE airflow;
# 初始表結構
airflow initdb
# 重置表結構
airflow resetdb
數據表結構如下:
啓動
airflow webserver -p 8081
# 啓動報錯
如果頁面出現莫名報錯:TypeError: b'80dc9b2e9f690fa57819e2f6538ec2adc788110f' is not JSON serializable
請清空你的瀏覽器cookies,或者用無痕模式避免
打開調度器
airflow scheduler
創建任務文件夾
在 ~/airflow 文件夾下創建文件夾 tags
也可以自定義文件夾,在 ~/airflow/airflow.cfg 中通過 dags_floder 指定, 注意:dags_floder 會自動尋找子目錄下的dag
添加任務
airflow內置了豐富的任務處理器,用於實現不同類型的任務:
BashOperator : 執行bash命令
PythonOperator : 調用python代碼
EmailOperator : 發送郵件
HTTPOperator : 發送 HTTP 請求
SqlOperator : 執行 SQL 命令
airflow 直接給出了豐富的各類任務處理器的例子,dag文件怎麼寫,task怎麼寫,灰常清楚。
舉例:創建 bash 命令的任務,點擊進去之後,可以清楚看到詳情,dag 文件中清楚描述了執行 bash 命令的任務如何寫,以及如何創建 bash 命令之間的依賴關係
賬戶安全性配置
只通過賬號密碼控制
在 airflow.cfg 文件中 [webserver] 下添加如下配置
[webserver]
authenticate = True
auth_backend = airflow.contrib.auth.backends.password_auth
啓用密碼身份驗證後,需要先創建初始用戶,然後其他賬戶才能登陸
進入 python 命令行,執行以下命名, 或者通過運行python腳本,設置 airflow 的用戶名和密碼,若提示缺失包,直接通過 pip 安裝即可,
用戶信息會存入 users 表中
import airflow
from airflow import models, settings
from airflow.contrib.auth.backends.password_auth import PasswordUser
user = PasswordUser(models.User())
user.username = 'new_user_name'
user.email = '[email protected]'
user.password = 'set_the_password'
session = settings.Session()
session.add(user)
session.commit()
session.close()
通過賬號密碼➕角色權限控制來登陸
在 airflow.cfg 文件中 [webserver] 下添加如下配置
[webserver]
security = Flask AppBuilder
secure_mode = True
rbac=True
ps: 和第一種方式不共存,必須刪除 authenticate 和 auth_backend 的配置
添加配置之後,需要重建數據庫表:
airflow resetdb
這種情況下,創建用戶必須使用命令行 airflow create_user
例如:
airflow create_user --lastname user --firstname admin --username admin --email [email protected] --role Admin --password admin123
airflow create_user --lastname user --firstname view --username view --email [email protected] --role Viewer --password view123
此時, admin 角色的用戶 UI 界面會出現 Security 的 Tab, 就可以愉快的通過 UI 界面來添加/修改用戶了
nginx 配置
airflow.cfg 配置如下:
[webserver]
base_url = http://127.0.0.1:8080
web_server_host = 127.0.0.1
web_server_port = 8080
nginx應配置如下:
server {
listen 80;
server_name your_host;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
ps: nginx reload 的時候記得也要指定conf文件地址
supervisor 配置
[group:airflow]
programs=airflow_webserver,airflow_scheduler
[program:airflow_webserver]
command= /home/deploy/_pyenv/airflow_env/bin/airflow webserver ;
process_name=%(program_name)s_%(process_num)d ;
stdout_logfile=/home/deploy/_log/supervisord/airflow/airflow_webserver.out ;
stderr_logfile=/home/deploy/_log/supervisord/airflow/airflow_webserver.err ;
loglevel=info ;
numprocs=1 ;
numprocs_start=8080 ;
user=deploy ;
environment=AIRFLOW_HOME="~/airflow",PATH="/home/deploy/_pyenv/airflow_env/bin:%(ENV_PATH)s" ;
[program:airflow_scheduler]
command= /home/deploy/_pyenv/airflow_env/bin/airflow scheduler ;
process_name=%(program_name)s_%(process_num)d ;
stdout_logfile=/home/deploy/_log/supervisord/airflow/airflow_scheduler.out ;
stderr_logfile=/home/deploy/_log/supervisord/airflow/airflow_scheduler.err ;
loglevel=info ;
numprocs=1 ;
numprocs_start=8001 ;
user=deploy ;
environment=AIRFLOW_HOME="~/airflow",PATH="/home/deploy/_pyenv/airflow_env/bin:%(ENV_PATH)s" ;
其他設置
airflow.cfg 中都有每個配置的詳細說明,可以都看一下,以下是一些常用配置:
不加載example dag
修改 airflow.cfg 配置
load_examples = False # 這個配置只有在第一次啓動airflow之前設置纔有效
如果這個方法不生效,可以刪除${PYTHON_HOME}/site-packages/airflow/example_dags目錄,也是同樣的效果。
修改檢測新dag間隔
最好還是修改一下,因爲默認爲0,沒有時間間隔, 很耗資源。
[scheduler]
min_file_process_interval = 10
時區
(1) log 之類的時區
時區默認爲 utc ,如果有需要更改,可以在 airflow.cfg 文件中 [core] 進行配置,比如:修改爲 亞洲/上海,這時候我們可以發現 log 之類的都已經被修改爲了上海時間
[core]
default_timezone = Asia/Shanghai
(2)定時任務的時區問題
需要在 dag 的 arg 中 start_date 指定時區,這樣定時任務就會按照上海時間來執行
import pendulum
from datetime import datetime
from airflow.models import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.dummy_operator import DummyOperator
local_tz = pendulum.timezone("Asia/Shanghai")
args = {
'owner': 'Airflow',
'start_date': datetime(2019, 1, 1, tzinfo=local_tz),
}
dag = DAG(
dag_id='bash_test',
default_args=args,
schedule_interval='* * * * *',
)
(3) UI 管理頁面右上角的時間
目前官方不支持修改,實在想改,可以直接改源碼
使用 celery
安裝準備:
安裝 pip install 'apache-airflow[celery]'
安裝 rabbitmq brew install rabbitmq
airflow.cfg 配置準備:
應根據自己的情況添加配置,舉例如下:
[core]
executor = CeleryExecutor
[celery]
celery_app_name = airflow.executors.celery_executor
broker_url = amqp://root:[email protected]:5672/airflow
result_backend = db+mysql://root:[email protected]:3306/airflow
添加mq的vhost
rabbitmqctl add_vhost airflow
界面http://127.0.0.1:15672添加用戶 默認用戶名密碼 guest guest
root rabbitmq 給root用戶配置權限 set permission set topic permission
啓動:
啓動 rabbitmq : rabbitmq-server
啓動 worker: airflow worker
遇到問題
1)報錯:python3.7 No module named _ssl
解決:
第一步:安裝最新的openssl
wget http://www.openssl.org/source/openssl-1.1.1.tar.gz
tar -zxvf openssl-1.1.1.tar.gz
cd openssl-1.1.1
./config --prefix=$HOME/openssl shared zlib
make && make install
第二步:重新裝python 編譯
ps: openssl配置是用config,而不是configure,另外openssl編譯安裝依賴zlib動態庫,所以一定要shared zlib
(2)查看duration時報錯:TypeError: unsupported operand type(s) for +=: ‘int’ and ‘NoneType’
原因:task_fail 表中失敗任務 duration 字段爲 null
解決:UPDATE task_fail SET duration=0 WHERE duration IS NULL;
(3)Airflow 404 = lots of circles
原因:要麼是配置文件錯了,要麼是請求的 airflow 網址錯了
(4)運行 airflow scheduler 出現 {sqlalchemy.py:81} WARNING - DB connection invalidated. Reconnecting…
這個錯誤並不影響 airflow 正常執行任務
(5) supervisor 啓動 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'
原因:環境錯誤
解決:如果是用 supervisor 啓動,需要添加環境變量 PATH="/home/deploy/_pyenv/airflow_env/bin:%(ENV_PATH)s"