Ubuntu上搭建airflow+celery以及配置環境

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]

  1. dags_folder:dag python文件目錄,需要修改,指定到python裏專門存放dag文件的目錄例如 /data/projects/code/[YOUR_PYTHON_PROJECT_NAME]/dags
  2. base_log_folder:主日誌目錄,默認是$AIRFLOW_HOME/logs,存儲dag裏的task執行日誌存儲目錄。
  3. child_process_log_directory:scheduler的日誌文件存儲路徑,默認是$AIRFLOW_HOME/logs/scheduler,例如 /data/projects/airflow_config/logs/scheduler
  4. dag_processor_manager_log_location:默認是$AIRFLOW_HOME/logs/dag_processor_manager/dag_processor_manager.log
  5. plugins_folder:默認是 $AIRFLOW_HOME下/plugins,例如/data/work/airflow_config/plugins
  6. default_timezone:時區,默認是UTC,需要修改爲 Asia/Shanghai
  7. executorCeleryExecutor
  8. 後端數據庫配置
# 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
  1. dags_are_paused_at_creation:dag在創建以後是否是暫停狀態,改爲False,這樣新建dag提交後會打開,省去麻煩。

[webserver]

  1. web url配置:
base_url = http://[xx.xx.xx.xx]:8080
web_server_host = [IP]
web_server_port = [port]
  1. 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的服務也會正常運行,不會被打斷。
感興趣的可以參考這篇自學tmuxtmux的使用方法

參考資料:

airflow中文文檔
官網(新建web 用戶名&添加密碼)
Celery-簡書
airflow 配置 CeleryExecutor
Airflow安裝
使用Celery擴大規模
airflow + CeleryExecutor 環境搭建
AirFlow使用指南一 安裝與啓動

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章