調(diào)度工具Airflow

1. 什么是Airflow

?Airflow是Airbnb開源的data pipeline調(diào)度和監(jiān)控工作流的平臺,用于用來創(chuàng)建、監(jiān)控和調(diào)整data pipeline(ETL)。

2. 簡單的定時任務(wù)cron

?假設(shè)我們想要定時調(diào)用一個程序棚辽,比如說:每天定時從Web抓數(shù)據(jù),我們可以使用cron。cron是一個Linux下的后臺服務(wù)诅诱,用來定期的執(zhí)行一些任務(wù),在/etc/crontab中設(shè)置后即可送朱,基本寫法如下:

# 分鐘 小時 日 月 周 用戶  命令 
17 * * * * root date >> /tmp/time.log 

?它的意思是每個小時的第18分鐘娘荡,將當前時間寫入log文件,注意各值的取值范圍(分鐘 0 - 59驶沼,小時0 - 23炮沐,天1 - 31,月1 - 12回怜,星期0 - 6大年,0表示星期天) 修改/etc/crontab后,還需要用 $ sudo service cron restart命令重啟crontab任務(wù)玉雾,才能生效翔试。

3. 為什么要用Airflow

?有了cron為什么還需要airflow?以抓取web數(shù)據(jù)為例抹凳,可能在某天抓取數(shù)據(jù)時遏餐,網(wǎng)斷或者關(guān)機了,當天的數(shù)據(jù)沒抓進來赢底,這種情況下失都,只能通過寫日志定時分析日志,以及在程序中定時重連的方式保證數(shù)據(jù)完整幸冻,相對比較零碎和麻煩粹庞。另外,如果crontab設(shè)置文件中有幾十上百條任務(wù)時洽损,就比較頭疼了庞溜。

?Airflow支持圖形界面和命令行兩種方式,管理起來比較方便,另外流码,它可以把幾個相互依賴的任務(wù)編成一組又官,并監(jiān)督執(zhí)行是否正常,如果不正常漫试,調(diào)用程序重試等等六敬。

?當然,Airflow也不全是優(yōu)點驾荣,比如需要使用python腳本來定義任務(wù)間的依賴關(guān)系外构,相對于手動編輯crontab文件,相對難一些播掷。因此审编,如果只調(diào)用簡單的任務(wù),使用cron即可歧匈,復(fù)雜的再考慮airflow垒酬。

4. Airflow的基礎(chǔ)概念

?Airflow 中最基本的兩個概念是:DAG 和 task。DAG 的全稱是 Directed Acyclic Graph 是所有你想執(zhí)行的任務(wù)的集合眯亦,在這個集合中可以定義了他們的依賴關(guān)系伤溉,一個 DAG object可以用 Python 腳本中配置完成般码。每個 DAG object 代表了一個 workflow妻率,每個 workflow 都可以包含任意個 task,task就是具體的任務(wù)板祝。

5. Airflow安裝和使用

(1) 安裝airflow

$ sudo pip install airflow 

?可以通過環(huán)境變量AIRFLOW_HOME 設(shè)置airflow的工作目錄宫静,默認為$HOME/airflow/

(2) Mysql支持

?如果想使用mysql存儲airflow內(nèi)容,請按如下方法設(shè)置mysql券时;如果不設(shè)置孤里,airflow在其工作目錄下建立db文件,以sqlite方式存儲橘洞。

$ mysql -u root -p

mysql> create database airflow default charset utf8 collate utf8_general_ci;
mysql> create user airflow@'localhost' identified by 'airflow';
mysql> grant all on airflow.* to airflow@'localhost';
mysql> flush privileges;

?修改配置文件 $AIRFLOW_HOME/airflow.cfg捌袜,把sql_alchemy_conn對應(yīng)語句替換成:

sql_alchemy_conn = mysql://airflow:airflow@localhost:3306/airflow

(3) 運行

$ airflow initdb
$ airflow worker
$ airflow webserver -p 8080 # 一直運行
$ airflow scheduler # 一直運行  

?此時在瀏覽器中輸入:http://localhost:8080,即可看到airflow界面炸枣,其中有很多demo可以參考虏等。

(4) 建立第一個DAG:Hellow world

$ mkdir $AIRFLOW_HOME/dags/
$ vi $AIRFLOW_HOME/dags/hello_word.py # 內(nèi)容如下:
 # -*- coding: utf-8 -*-

import airflow
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperator
from datetime import timedelta

default_args = {
 'owner': 'yan.xie',
 'depends_on_past': False,
 'start_date': airflow.utils.dates.days_ago(2),
 'retries': 5, # 重試次數(shù)
 'retry_delay': timedelta(minutes=1), # 運行間隔時間
}

dag = DAG(
 'test_my_dag', # DAG名字
 default_args=default_args,
 description='my first DAG',
 schedule_interval=timedelta(days=1))

task1 = BashOperator(
 task_id='task_1', # TASK名
 bash_command='date', # 運行命令
 dag=dag)

task2 = BashOperator(
 task_id='task_2',
 depends_on_past=False,
 bash_command='sleep 5',
 dag=dag)

def print_hello():
 return 'Hello world!'

test3 = PythonOperator(
 task_id='task_3',
 python_callable=print_hello, # 運行python程序
 dag=dag)

task2.set_upstream(task1) # 設(shè)置依賴關(guān)系
test3.set_upstream(task1) 

?保存之后,再瀏覽器刷新一下界面适肠,即可在list中看到該DAG霍衫,點On后,即可運行侯养。

?點開DAG可以看到各Task間的依賴關(guān)系

?以及樹型關(guān)系

(5) 調(diào)試
?有時候敦跌,怕不能一次寫對,可以運行以下命令調(diào)試單個Task

$ airflow test test_my_dag task_3 20181027

(6) 清除全部DAG重置數(shù)據(jù)庫

$ airflow resetdb 

?并刪除 $AIRFLOW_HOME/dags/ 下所有DAG文件逛揩,然后重啟webserver柠傍。

?在Airflow中麸俘,如果改了一個DAG的名字,它會新建一個DAG惧笛,而不僅是改名疾掰,所以舊的DAG還在數(shù)據(jù)庫和列表中存在,可以用 “$ airflow delete_dag DAG名” 的方式刪除它徐紧,但不是每個airflow版本都支持delete_dag命令静檬。此時可以只用resetdb不刪除dags目錄下文件的方式,刪除目錄中沒有對應(yīng)文件的DAG(刪除有風(fēng)險并级,操作須謹慎)拂檩。

6. 參考

(1) Ubuntu下crontab命令的用法
https://www.cnblogs.com/daxian2012/articles/2589894.html

(2) 使用 Airflow 替代你的 crontab
https://www.juhe.cn/news/index/id/2365

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嘲碧,隨后出現(xiàn)的幾起案子稻励,更是在濱河造成了極大的恐慌,老刑警劉巖愈涩,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件望抽,死亡現(xiàn)場離奇詭異,居然都是意外死亡履婉,警方通過查閱死者的電腦和手機煤篙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毁腿,“玉大人辑奈,你說我怎么就攤上這事∫芽荆” “怎么了鸠窗?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胯究。 經(jīng)常有香客問我稍计,道長,這世上最難降的妖魔是什么裕循? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任臣嚣,我火速辦了婚禮,結(jié)果婚禮上费韭,老公的妹妹穿的比我還像新娘茧球。我一直安慰自己,他們只是感情好星持,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布抢埋。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揪垄。 梳的紋絲不亂的頭發(fā)上穷吮,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音饥努,去河邊找鬼捡鱼。 笑死,一個胖子當著我的面吹牛酷愧,可吹牛的內(nèi)容都是我干的驾诈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼溶浴,長吁一口氣:“原來是場噩夢啊……” “哼乍迄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起士败,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淌喻,失蹤者是張志新(化名)和其女友劉穎满着,沒想到半個月后萧恕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸠蚪,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年饥臂,在試婚紗的時候發(fā)現(xiàn)自己被綠了逊躁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡擅笔,死狀恐怖志衣,靈堂內(nèi)的尸體忽然破棺而出屯援,到底是詐尸還是另有隱情猛们,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布狞洋,位于F島的核電站弯淘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏吉懊。R本人自食惡果不足惜庐橙,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望借嗽。 院中可真熱鬧态鳖,春花似錦、人聲如沸恶导。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至邦泄,卻和暖如春删窒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顺囊。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工肌索, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人特碳。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓诚亚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親午乓。 傳聞我的和親對象是個殘疾皇子亡电,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容