調度系統Airflow1.10.4調研與介紹和docker安裝
- 2019 年 10 月 3 日
- 筆記
Airflow1.10.4介紹與安裝
現在是9102年,8月中旬。airflow當前版本是1.10.4.
隨著公司調度任務增大,原有的,基於crontab和mysql的任務調度方案已經不太合適了,需要尋找一個可以支援分散式擴容的調度系統解決方案。
最初瞄準azkaban來著,想著基於這個的二次開發。對比功能和社區熱度之後,Airflow比較符合我們尋找的調度系統。
什麼是Airflow
Airflow是一個以編程方式創作,安排和監控工作流程的平台。對比crontab來看,它是一個可以定時調度任務的系統,只不過,airflow的調度更容易管理。
- airflow支援任務依賴pipeline, 這是crontab以及quartz所不支援的。
- airflow調度系統和業務系統解耦。業務單獨編寫流程,支援任務熱載入。
- airflow支援crontab定時格式
- airflow通過Python來定義task,可以實現複雜的邏輯,支援分支條件等
- airflow有一套完整的UI和管理系統
- airflow有強大的插件擴展方式,各種插件很豐富,很容易二次開發,添加新功能
- airflow是分散式設計,支援水平擴容
- airflow支援task實例,並支援數據業務日期bizdate, 也叫 execution_date.
- airflow支援任務補錄backfill
- airflow支援任務之間數據傳遞(這個任務依賴於上個任務的變數)
- airflow支援序列執行(這個周期的任務依賴於上一個周期的執行結果是否成功)
Airflow 於 2014 年 10 月由 Airbnb 的 Maxime Beauchemin 開始。它是第一次提交的開源,並在 2015 年 6 月宣布正式加入 Airbnb Github。
該項目於 2016 年 3 月加入了 Apache Software Foundation 的孵化計劃。
關於airflow具體使用細節,後面再詳細介紹,這裡就是一些在調度系統選型過程中查找的資料。
阿里基於airflow二次開發了調度平台Maat:
有贊基於airflow二次開發了大數據任務調度平台:
Google cloud提供了基於airflow的數據分析產品:
微軟Azure支援airflow的運行:
當然,這些雲廠商很可能是為了讓你使用他們的數據產品,比如對象存儲,lambda等。
社區異常活躍,star破萬,更新頻繁, Apache背書。據說作者早期在Facebook搞過一套調度系統,到airbnb就開源了airflow。大公司背書。
slack群組也很活躍
雖然是Python開發的,我也沒玩過Python web, 但調研結果就是: 用Airflow吧。
Airflow的安裝
官方文檔有非常詳細的安裝教程。這裡不再贅述。
想要記錄的是基於docker安裝airflow,以及做了一些特定的修改。
最終docker鏡像為: https://github.com/Ryan-Miao/docker-airflow
使用方式很簡單:
- clone 項目
- 構建airflow鏡像
make build
- 啟動
docker-compose -f docker-compose-CeleryExecutor.yml up -d
- 瀏覽器訪問localhost:8089可以查看dag
- 瀏覽器訪問localhost:5555可以查看worker
擴容3個worker
docker-compose -f docker-compose-CeleryExecutor.yml scale worker=3
所做的一些修改
修改時區為utc+8
Docker容器的時區
ENV LANGUAGE zh_CN.UTF-8 ENV LANG zh_CN.UTF-8 ENV LC_ALL zh_CN.UTF-8 ENV LC_CTYPE zh_CN.UTF-8 ENV LC_MESSAGES zh_CN.UTF-8 sed -i 's/^# zh_CN.UTF-8 UTF-8$/zh_CN.UTF-8 UTF-8/g' /etc/locale.gen && locale-gen /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
web server ui顯示的時區,以及任務運行時的ds等時區:
參考https://blog.csdn.net/Crazy__Hope/article/details/83688986,
airflow.cfg
default_timezone = Asia/Shanghai
/usr/local/lib/python3.7/site-packages/airflow/utils/timezone.py
在 utc = pendulum.timezone(『UTC』) 這行(第27行)程式碼下添加,
from airflow import configuration as conf try: tz = conf.get("core", "default_timezone") if tz == "system": utc = pendulum.local_timezone() else: utc = pendulum.timezone(tz) except Exception: pass
修改utcnow()函數 (在第69行)
原程式碼 d = dt.datetime.utcnow() 修改為 d = dt.datetime.now()
/usr/local/lib/python3.7/site-packages/airflow/utils/sqlalchemy.py
在utc = pendulum.timezone(『UTC』) 這行(第37行)程式碼下添加
from airflow import configuration as conf try: tz = conf.get("core", "default_timezone") if tz == "system": utc = pendulum.local_timezone() else: utc = pendulum.timezone(tz) except Exception: pass
/usr/local/lib/python3.7/site-packages/airflow/www/templates/admin/master.html
把程式碼 var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000); 改為 var UTCseconds = x.getTime(); 把程式碼 "timeFormat":"H:i:s %UTC%", 改為 "timeFormat":"H:i:s",
webserver查看日誌,中文亂碼問題
容器編碼設置沒問題,進去看日誌文件也沒問題,但是webserver查看的時候日誌中文亂碼。原因是http請求的mime
沒設置編碼。
/usr/local/lib/python3.7/site-packages/airflow/bin/cli.py
修改mime
mimetype="application/json;charset=utf-8",
Hive beeline認證
airflow支援beeline, 在connection里填寫beeline的配置後,使用HiveOperator進行hive操作。我們的hive
沒有使用kerberos, 而是ldap的帳號密碼認證。需要對後台的hvie任務做認證的修改。
修改hive_hooks.py的認證部分即可。Dockerfile注釋掉的部分就是。
添加hive的支援
github的airflow docker沒有hive相關的lib。我在Dockerfile里添加了hive的環境,這個後面再做優化,針對
不同的pool,安裝不同的依賴。
ldap配置
參見https://www.cnblogs.com/woshimrf/p/ldap.html 配置我們的ldap服務。
然後修改airflow.cfg. 找到263行
authenticate = False # 設置為True並打開ldap即可使用ldap配置 # auth_backend = airflow.contrib.auth.backends.ldap_auth
以及518行
[ldap] # set this to ldaps://<your.ldap.server>:<port> uri = ldap://192.168.2.2:389 user_filter = objectClass=inetOrgPerson user_name_attr = sn group_member_attr = memberOf superuser_filter = memberOf=cn=g-admin,ou=group,dc=demo,dc=com data_profiler_filter = memberOf=cn=g-users,ou=group,dc=demo,dc=com bind_user = cn=admin,dc=demo,dc=com bind_password = admin basedn = dc=demo,dc=com cacert = search_scope = SUBTREE
參考
- airflow官方文檔: https://airflow.apache.org/
- airflow中文文檔: http://airflow.apachecn.org/#/zh/howto/operator
- airflow源碼: https://github.com/apache/airflow
- airflow docker: https://github.com/Ryan-Miao/docker-airflow