Airflow入門(mén)和運(yùn)行常用命令

什么是Airflow柑船?

Airflow 是一個(gè)使用 python 語(yǔ)言編寫(xiě)的 data pipeline 調(diào)度和監(jiān)控工作流的平臺(tái)究孕。Airflow 被 Airbnb 內(nèi)部用來(lái)創(chuàng)建洽洁、監(jiān)控和調(diào)整數(shù)據(jù)管道绞惦。任何工作流都可以在這個(gè)使用 Python 來(lái)編寫(xiě)的平臺(tái)上運(yùn)行飒箭。Airflow是通過(guò)DAG(Directed acyclic graph)來(lái)管理任務(wù)流程的任務(wù)調(diào)度工具氛雪,她不需要知道業(yè)務(wù)數(shù)據(jù)的具體內(nèi)容,設(shè)置任務(wù)的依賴(lài)關(guān)系實(shí)現(xiàn)任務(wù)調(diào)度卦尊。

這個(gè)平臺(tái)擁有和 Hive叛拷、Presto、MySQL岂却、HDFS忿薇、Postgres 和 S3 交互的能力,并且提供了鉤子(hook)使得系統(tǒng)擁有很好地?cái)U(kuò)展性躏哩。除了一個(gè)命令行界面署浩,該工具還提供了一個(gè)基于 Web 的用戶(hù)界面讓您可以可視化管道的依賴(lài)關(guān)系、監(jiān)控進(jìn)度扫尺、觸發(fā)任務(wù)等筋栋。

Airflow 的架構(gòu)

在一個(gè)可擴(kuò)展的生產(chǎn)環(huán)境中,Airflow 含有以下組件:

  • 一個(gè)元數(shù)據(jù)庫(kù)(MySQL 或 Postgres)
  • 一組 Airflow 工作節(jié)點(diǎn)
  • 一個(gè)調(diào)節(jié)器(Redis 或 RabbitMQ)
  • 一個(gè) Airflow Web 服務(wù)器


    Airflow Scheduler

功能簡(jiǎn)介

Function

任務(wù)依賴(lài)

通常正驻,在一個(gè)運(yùn)維系統(tǒng)弊攘,數(shù)據(jù)分析系統(tǒng),或測(cè)試系統(tǒng)等大型系統(tǒng)中姑曙,我們會(huì)有各種各樣的依賴(lài)需求襟交。比如:

  • 時(shí)間依賴(lài):任務(wù)需要等待某一個(gè)時(shí)間點(diǎn)觸發(fā)。
  • 外部系統(tǒng)依賴(lài):任務(wù)依賴(lài) Mysql 中的數(shù)據(jù)伤靠,HDFS 中的數(shù)據(jù)等等捣域,這些不同的外部系統(tǒng)需要調(diào)用接口去訪問(wèn)。
  • 機(jī)器依賴(lài):任務(wù)的執(zhí)行只能在特定的某一臺(tái)機(jī)器的環(huán)境中宴合,可能這臺(tái)機(jī)器內(nèi)存比較大焕梅,也可能只有那臺(tái)機(jī)器上有特殊的庫(kù)文件。
  • 任務(wù)間依賴(lài):任務(wù) A 需要在任務(wù) B 完成后啟動(dòng)卦洽,兩個(gè)任務(wù)互相間會(huì)產(chǎn)生影響贞言。
  • 資源依賴(lài):任務(wù)消耗資源非常多,使用同一個(gè)資源的任務(wù)需要被限制逐样,比如跑個(gè)數(shù)據(jù)轉(zhuǎn)換任務(wù)要10個(gè) G蜗字,機(jī)器一共就30個(gè) G打肝,最多只能跑兩個(gè)脂新,我希望類(lèi)似的任務(wù)排個(gè)隊(duì)。
  • 權(quán)限依賴(lài):某種任務(wù)只能由某個(gè)權(quán)限的用戶(hù)啟動(dòng)粗梭。
    也許大家會(huì)覺(jué)得這些是在任務(wù)程序中的邏輯需要處理的部分争便,但是我認(rèn)為,這些邏輯可以抽象為任務(wù)控制邏輯的部分断医,和實(shí)際任務(wù)執(zhí)行邏輯解耦合滞乙。

Airflow的處理依賴(lài)的方式

Airflow 和crontab不同奏纪。crontab 可以很好地處理定時(shí)執(zhí)行任務(wù)的需求,它是一種依賴(lài)管理系統(tǒng)斩启,而且只管理時(shí)間上的依賴(lài)序调。Airflow 的核心概念,是 DAG (有向無(wú)環(huán)圖)兔簇,DAG 由一個(gè)或多個(gè) TASK 組成发绢,而這個(gè) DAG 正是解決了上文所說(shuō)的任務(wù)間依賴(lài)。Task A 執(zhí)行完成后才能執(zhí)行 Task B垄琐,多個(gè)Task之間的依賴(lài)關(guān)系可以很好的用DAG表示完善边酒。

Airflow 完整的支持 crontab 表達(dá)式,也支持直接使用 python 的 datatime 表述時(shí)間狸窘,還可以用 datatime 的 delta 表述時(shí)間差墩朦。這樣可以解決任務(wù)的時(shí)間依賴(lài)問(wèn)題。

Airflow 在 CeleryExecuter 下可以使用不同的用戶(hù)啟動(dòng) Worke r翻擒,不同的 Worker 監(jiān)聽(tīng)不同的 Queue 氓涣,這樣可以解決用戶(hù)權(quán)限依賴(lài)問(wèn)題。Worker 也可以啟動(dòng)在多個(gè)不同的機(jī)器上陋气,解決機(jī)器依賴(lài)的問(wèn)題春哨。

Airflow 可以為任意一個(gè) Task 指定一個(gè)抽象的 Pool,每個(gè) Pool 可以指定一個(gè) Slot 數(shù)恩伺。每當(dāng)一個(gè) Task 啟動(dòng)時(shí)赴背,就占用一個(gè) Slot ,當(dāng) Slot 數(shù)占滿(mǎn)時(shí)晶渠,其余的任務(wù)就處于等待狀態(tài)凰荚。這樣就解決了資源依賴(lài)問(wèn)題。

Airflow 中有 Hook 機(jī)制(其實(shí)我覺(jué)得不應(yīng)該叫 Hook )褒脯,作用時(shí)建立一個(gè)與外部數(shù)據(jù)系統(tǒng)之間的連接便瑟,比如 Mysql,HDFS番川,本地文件系統(tǒng)(文件系統(tǒng)也被認(rèn)為是外部系統(tǒng))等到涂,通過(guò)拓展 Hook 能夠接入任意的外部系統(tǒng)的接口進(jìn)行連接,這樣就解決的外部系統(tǒng)依賴(lài)問(wèn)題颁督。

Airflow的命令

  • airflow webserver -p 8080 打開(kāi)webserver
  • airflow scheduler 調(diào)度器践啄,必須啟動(dòng),不然dag沒(méi)法run起來(lái)(使用CeleryExecutor沉御、LocalExecutor時(shí))
  • airflow run dagid [time] run task instance
  • airflow backfill [dagid] -s[startTime] -e [endTime] run a backfill over 2 days
run的demo
# run your first task instance
airflow run example_bash_operator runme_0 2018-01-11

# run a backfill over 2 days
airflow backfill example_bash_operator -s 2018-01-10 -e 2018-01-11

基于CeleryExecutor方式的系統(tǒng)架構(gòu)

基于CeleryExecutor方式的系統(tǒng)架構(gòu)
使用celery方式的系統(tǒng)架構(gòu)圖(官方推薦使用這種方式屿讽,同時(shí)支持mesos方式部署)。turing為外部系統(tǒng)吠裆,GDags服務(wù)幫助拼接成dag伐谈,可以忽略烂完。
1.master節(jié)點(diǎn)webui管理dags、日志等信息诵棵。scheduler負(fù)責(zé)調(diào)度抠蚣,只支持單節(jié)點(diǎn),多節(jié)點(diǎn)啟動(dòng)scheduler可能會(huì)掛掉
2.worker負(fù)責(zé)執(zhí)行具體dag中的task履澳。這樣不同的task可以在不同的環(huán)境中執(zhí)行柱徙。

celery executor

基于LocalExecutor方式的系統(tǒng)架構(gòu)圖

另一種啟動(dòng)方式的思考,一個(gè)dag分配到1臺(tái)機(jī)器上執(zhí)行奇昙。如果task不復(fù)雜同時(shí)task環(huán)境相同护侮,可以采用這種方式,方便擴(kuò)容储耐、管理羊初,同時(shí)沒(méi)有master單點(diǎn)問(wèn)題。


local executor

從安裝airflow到成功運(yùn)行什湘,踩了很多坑长赞,憑借著回憶簡(jiǎn)單記錄一下。

運(yùn)行常用命令

  • Initialize the db 第一次安裝完初始化airflow
    airflow initdb
  • 開(kāi)啟webserver闽撤,登陸網(wǎng)頁(yè)http://localhost:8080可以看到dag運(yùn)行狀況
    airflow webserver --port 8080
  • test the 單個(gè)DAG
$ python airflow_dag.py #先編譯python
編譯成功之后test:
#格式:airflow test dag_id task_id execution_time
$ airflow test airflow_tutorial print_world 2017-07-01
  • 測(cè)試成功之后運(yùn)行
#開(kāi)啟調(diào)度任務(wù)器
$ airflow scheduler 
# 開(kāi)始運(yùn)行任務(wù)
$ airflow trigger {$dag}.py
這一步也可以在web界面點(diǎn)trigger按鈕

一點(diǎn)總結(jié)

我用airflow執(zhí)行的任務(wù)是從一個(gè)數(shù)據(jù)庫(kù)中同步數(shù)據(jù)到另一個(gè)數(shù)據(jù)庫(kù)得哆。本來(lái)想用airflow里的hook連數(shù)據(jù)庫(kù),進(jìn)行同步哟旗,但是程序死卡在running死活不運(yùn)行贩据。這樣研究了好久也沒(méi)研究出來(lái)原因。網(wǎng)上關(guān)于airflow的文檔都停留在介紹和入門(mén)闸餐,很少有實(shí)際運(yùn)行的例子饱亮。
后來(lái)才發(fā)現(xiàn),其實(shí)沒(méi)必要非去使用airflow連數(shù)據(jù)庫(kù)的方法舍沙。airflow相當(dāng)于一個(gè)工具近上,一個(gè)嵌入在python文件中的工具。所以在寫(xiě)airflow時(shí)拂铡,其他部分功能定義正常寫(xiě)壹无,連數(shù)據(jù)庫(kù)啊,分割字符串啊感帅,這些都按照python里的方法來(lái)寫(xiě)就可以了斗锭,最后再用airflow定義task前后依賴(lài)關(guān)系。
搞清楚這點(diǎn)留瞳,就會(huì)發(fā)現(xiàn)其實(shí)airflow非常好用拒迅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市她倘,隨后出現(xiàn)的幾起案子璧微,更是在濱河造成了極大的恐慌,老刑警劉巖硬梁,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件前硫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荧止,警方通過(guò)查閱死者的電腦和手機(jī)屹电,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)跃巡,“玉大人危号,你說(shuō)我怎么就攤上這事∷匦埃” “怎么了外莲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)兔朦。 經(jīng)常有香客問(wèn)我偷线,道長(zhǎng),這世上最難降的妖魔是什么沽甥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任声邦,我火速辦了婚禮,結(jié)果婚禮上摆舟,老公的妹妹穿的比我還像新娘亥曹。我一直安慰自己,他們只是感情好恨诱,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布歇式。 她就那樣靜靜地躺著,像睡著了一般胡野。 火紅的嫁衣襯著肌膚如雪材失。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天硫豆,我揣著相機(jī)與錄音龙巨,去河邊找鬼。 笑死熊响,一個(gè)胖子當(dāng)著我的面吹牛旨别,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汗茄,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼秸弛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起递览,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叼屠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后绞铃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體镜雨,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年儿捧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荚坞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡菲盾,死狀恐怖颓影,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情懒鉴,我是刑警寧澤诡挂,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站疗我,受9級(jí)特大地震影響咆畏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吴裤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一旧找、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧麦牺,春花似錦钮蛛、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吱晒,卻和暖如春甸饱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仑濒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工叹话, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人墩瞳。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓驼壶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親喉酌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子热凹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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