airflow 使用心得,從環境到部署上線

使用版本:
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"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章