文章目錄
1、框架
服務器環境介紹:
- Ubuntu 16.04.5 LTS
- 配置:8核 16G
框架介紹:
Celery 是分佈式任務隊列,與調度工具 airflow 強強聯合,可實現複雜的分佈式任務調度,這就是CeleryExecutor。
Celery 需要一個發送和接受消息的傳輸者 broker。RabbitMQ 和 Redis 是官方推薦的生產環境級別的 broker,我們選擇Redis。
MySQL:後端數據庫
CeleryExecutor:執行器
Redis:Message broker,消息中間件
2、搭建過程
說明:
/data/projects/code
:存儲各個項目。
/data/projects/airflow_config
:存儲airflow相關的文件。
2.1 基礎工作-新建airflow用戶和目錄
登陸服務器切換到root
用戶,然後新建目錄用於存放Python項目代碼:
sudo bash
mkdir /data/projects/code
新建airflow的用戶並修改文件權限``:
# 新建
adduser af_user
# 修改該用戶對logs文件、代碼文件目錄的權限:
chown af_user:af_user /data/projects
新建目錄:
mkdir -p /data/projects/airflow_config
mkdir -p /data/projects/code
2.2 下載並安裝anaconda:miniconda
miniconda就夠用了。
1、下載
root
用戶下,下載anaconda安裝包:
a.打開 anaconda清華鏡像源
b.選擇linux-x86的一個版本,右鍵拷貝鏈接地址。
c.下載:例如,
cd /data
# wget url
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh
如果連接超時,看是否是因爲禁止訪問外網。
如果下載特別慢,那就本地下載後上傳包至服務器。
2、安裝anaconda
a.安裝
#sh [安裝包名]
sh Miniconda3-latest-Linux-x86_64.sh
注意:安裝過程中,會提示安裝目錄,修改一下,選擇 /data/anaconda3
作爲安裝目錄(必須是一個不存在的目錄)。
b.確保添加了環境變量:vim /etc/profile
,如果沒有,則末尾一行添加:export PATH="/data/anaconda3/bin:$PATH"
2.3 新建airflow的python環境
1、創建環境,root
用戶下:
conda create -n airflow-py36 python=3.6
2、切換到新建的af_user
用戶:
su -l af_user
3、初始化anaconda:conda init
,如果前面沒有在/etc/profile
添加anaconda的PATH,那就得這樣:/data/anaconda3/bin/conda init
4、激活剛剛創建的py環境並安裝包:
# 激活環境
conda activate airflow-py36
# 看下當前的pip是否正確:應該輸出的是 airflow-py36下的bin/pip
which pip
安裝所需的包:按需安裝吧。
pip install apache-airflow
pip install 'apache-airflow[async]'
pip install 'apache-airflow[celery]'
pip install 'apache-airflow[redis]'
pip install pymysql
pip install mysqlclient
airflow被安裝到了/home/af_user/.local/
下。
另外,如果pip安裝特別慢的話,需要配置pip源,即 在~/
新建 .pip/pip.conf
文件:
cd ~
mkdir -pv .pip
vim ~/.pip/pip.conf
可以配置阿里雲鏡像源,或其他的鏡像源:
[global]
index-url=http://mirrors.cloud.aliyuncs.com/pypi/simple/
[list]
format=columns
[install]
trusted-host=mirrors.cloud.aliyuncs.com
5、添加環境變量
由root
用戶切換到af_user
並編輯.bashrc
文件
su -l af_user
vim ~/.bashrc
export AIRFLOW_HOME="/data/projects/airflow_config"
export PYTHONPATH="/data/projects/code/[YOUR_PYHTON_PROJECT_NAME]:$PYTHONPATH"
export PATH="/data/anaconda3/envs/air-py36/bin:$PATH"
其中,
a. export
第一行,若不指定AIRFLOW_HOME,則默認是 ~/airflow
,爲了方便管理可以修改爲我們最開始指定的路徑,這樣在後面運行airflow時會在$AIRFLOW_HOME
下生成airflow.cfg
文件以及logs等目錄。
b. export
第二行,Python搜索路徑,默認我們import
的模塊都會從PYTHONPATH
裏面尋找,這裏可以把項目路徑添加進來。
c.export
第三行,添加airflow的python路徑。
注意:~/.bashrc 文件只對當前用戶生效。
2.4 初始化airflow
執行airflow就會初始化:airflow
發現在$AIRFLOW_HOME
下新增了幾個文件和目錄。
2.5 修改配置文件
第一次運行airflow時,它會在$AIRFLOW_HOME
目錄中創建一個名爲airflow.cfg的配置文件。
文件的各項參數解釋見:https://www.cnblogs.com/skyrim/p/7456166.html
下面列舉需要修改的參數:
[core]
dags_folder
:dag python文件目錄,需要修改,指定到python裏專門存放dag文件的目錄例如/data/projects/code/[YOUR_PYTHON_PROJECT_NAME]/dags
。base_log_folder
:主日誌目錄,默認是$AIRFLOW_HOME/logs
,存儲dag裏的task執行日誌存儲目錄。child_process_log_directory
:scheduler的日誌文件存儲路徑,默認是$AIRFLOW_HOME/logs/scheduler
,例如/data/projects/airflow_config/logs/scheduler
dag_processor_manager_log_location
:默認是$AIRFLOW_HOME/logs/dag_processor_manager/dag_processor_manager.log
plugins_folder
:默認是$AIRFLOW_HOME下/plugins
,例如/data/work/airflow_config/plugins
。default_timezone
:時區,默認是UTC,需要修改爲Asia/Shanghai
。executor
:CeleryExecutor
- 後端數據庫配置
# airflow後端數據庫地址,數據庫需提前建好.
sql_alchemy_conn = mysql+mysqldb://[your_db_user_name]:[your_db_pwd]@[your_mysql_host_address]:[port]/[your_schema_name]
# 編碼,如果上面的conn結尾指定了 添加了?charset=utf8mb4,則需註釋掉 sql_engine_encoding。
sql_engine_encoding = utf-8
dags_are_paused_at_creation
:dag在創建以後是否是暫停狀態,改爲False
,這樣新建dag提交後會打開,省去麻煩。
[webserver]
- web url配置:
base_url = http://[xx.xx.xx.xx]:8080
web_server_host = [IP]
web_server_port = [port]
- web頁面權限控制:需要密碼。
authenticate = True
auth_backend = airflow.contrib.auth.backends.password_auth
[smtp]
12.
smtp_host = smtp.exmail.qq.com
smtp_starttls = False
smtp_ssl = True
# Example: smtp_user = airflow
smtp_user = [xxxxx]@[公司域名]
# Example: smtp_password = airflow
smtp_password = [PWD]
smtp_port = 465
smtp_mail_from = [xxxxx]@[公司域名]
[celery]
13.
broker_url = redis://:[pwd_redis]@[redis_host_adddress]:[port]/[db編號不能重複]
result_backend = redis://:[pwd_redis]@[redis_host_adddress]:[port]/[db編號不能重複]
2.6 初始化後端數據庫
airflow inintdb
如果提示缺少MySQLdb模塊,則 pip install mysqlclient
。安好後再次初始化。
記住:如果初始化過一次,那麼最好把後端數據庫先清空,然後再初始化。不然可能會和我一樣,初始化以及啓動web server、sheduler時遇到各種後端數據庫表 column notfound的問題,血坑啊……
2.7 爲訪問airflow web時添加用戶
設置web server的用戶名和密碼:
https://airflow.apache.org/docs/stable/security.html
切換root用戶:sudo bash
激活airflow的python環境: conda activate airflow-py36
進入pythonj交互:pyhton
開始新建用戶。代碼參考。
import airflow
from airflow import models, settings
from airflow.contrib.auth.backends.password_auth import PasswordUser
user = PasswordUser(models.User())
user.username = 'YOUR_WEB_USER_NAME'
user.password = 'YOUR_WEB_USER_PWD'
session = settings.Session()
session.add(user)
session.commit()
session.close()
exit()
假如在import airflow時 有報缺少包的錯誤,就一一安裝。
3、啓動服務
在af_user
下,激活airlfow的python環境:conda activate airflow-py36
在af_user
用戶下分別執行:
airflow webserver
airflow scheduler
airflow worker
啓動webserver後:在瀏覽器打開url,輸入用戶名和密碼,
OK,就到這裏了。
以後有時間介紹下通過tmux
啓動airlfow服務,這樣即使關閉了與服務器的ssh連接,airflow的服務也會正常運行,不會被打斷。
感興趣的可以參考這篇自學tmux
:tmux的使用方法
參考資料:
airflow中文文檔
官網(新建web 用戶名&添加密碼)
Celery-簡書
airflow 配置 CeleryExecutor
Airflow安裝
使用Celery擴大規模
airflow + CeleryExecutor 環境搭建
AirFlow使用指南一 安裝與啓動