1. 程式人生 > >排程系統Airflow1.10.4調研與介紹和docker安裝

排程系統Airflow1.10.4調研與介紹和docker安裝

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:

  • 基於DAG的分散式任務排程平臺-Maat
  • 阿里如何實現秒級百萬TPS?搜尋離線大資料平臺架構解讀

有贊基於airflow二次開發了大資料任務排程平臺:

  • 每日 7 千次的跨部門任務排程,有贊怎麼設計大資料開發平臺?

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

使用方式很簡單:

  1. clone 專案
  2. 構建airflow映象
make build
  1. 啟動
docker-compose -f docker-compose-CeleryExecutor.yml up -d
  1. 瀏覽器訪問localhost:8089可以檢視dag

  1. 瀏覽器訪問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