airflow的使用方法

簡(jiǎn)介

airflow是airbnb家的基于DAG(有向無(wú)環(huán)圖)的任務(wù)管理系統(tǒng), 最簡(jiǎn)單的理解就是一個(gè)高級(jí)版的crontab。它解決了crontab無(wú)法解決的任務(wù)依賴問(wèn)題。

類(lèi)似產(chǎn)品比較

系統(tǒng) 介紹
Apache Oozie 使用XML配置, Oozie任務(wù)的資源文件都必須存放在HDFS上. 配置不方便同時(shí)也只能用于Hadoop.
Linkedin Azkaban web界面尤其很贊, 使用java properties文件維護(hù)任務(wù)依賴關(guān)系, 任務(wù)資源文件需要打包成zip, 部署不是很方便.
airflow 具有自己的web任務(wù)管理界面,dag任務(wù)創(chuàng)建通過(guò)python代碼,可以保證其靈活性和適應(yīng)性

web界面使用介紹

DAGS

啟動(dòng)web任務(wù)管理需要執(zhí)行airflow websever -D命令,默認(rèn)端口是8080
http://10.191.76.31:8080/admin/

image.png

  • DAG
    dag_id
  • Schedule
    調(diào)度時(shí)間
  • Owner
    dag擁有者
  • Recent Tasks
    這里包含9個(gè)圓圈,每個(gè)圓圈代表task的執(zhí)行狀態(tài)和次數(shù)
    圈1 success:現(xiàn)實(shí)成功的task數(shù),基本上就是該tag包含多少個(gè)task,這里基本上就顯示幾。
    圈2 running:正在運(yùn)行的task數(shù)
    圈3 failed:失敗的task數(shù)
    圈4 unstream_failed:
    圈5 skipped:跳過(guò)的task數(shù)
    圈6 up_for_retry:執(zhí)行失敗的task,重新執(zhí)行的task數(shù)
    圈7 queued:隊(duì)列,等待執(zhí)行的task數(shù)
    圈8 :
    圈9 scheduled:剛開(kāi)始調(diào)度dag時(shí),這一次執(zhí)行總共調(diào)度了dag下面多少個(gè)task數(shù),并且隨著task的執(zhí)行成功,數(shù)值逐漸減少。
  • Last Run
    dag最后執(zhí)行的時(shí)間點(diǎn)
  • DAG Runs
    這里顯示dag的執(zhí)行信息,包括3個(gè)圓圈,每個(gè)圓圈代表dag的執(zhí)行狀態(tài)和次數(shù)
    圈1 success:總共執(zhí)行成功的dag數(shù),執(zhí)行次數(shù)
    圈2 runing:正在執(zhí)行dag數(shù)
    圈3 faild:執(zhí)行失敗的dag數(shù)
  • Links
link 說(shuō)明
Trigger Dag 人為執(zhí)行觸發(fā)
Tree View 當(dāng)dag執(zhí)行的時(shí)候,可以點(diǎn)入,查看每個(gè)task的執(zhí)行狀態(tài)(基于樹(shù)狀視圖),狀態(tài):success,running,failed,skipped,retry,queued,no status
Graph View 同上,基于圖視圖(有向無(wú)環(huán)圖),查看每個(gè)task的執(zhí)行狀態(tài),狀態(tài):success,running,failed,skipped,retry,queued,no status
Tasks Duration 每個(gè)task的執(zhí)行時(shí)間統(tǒng)計(jì),可以選擇最近多少次執(zhí)行(number of runs)
Task Tries 每個(gè)task的重試次數(shù)
Landing Times
Gantt View 基于甘特圖的視圖,每個(gè)task的執(zhí)行狀態(tài)
  • Code View
    查看任務(wù)執(zhí)行代碼
  • Logs
    查看執(zhí)行日志,比如失敗原因
  • Refresh
    刷新dag任務(wù)
    -Delete Dag
    刪除該dag任務(wù)

當(dāng)某dag執(zhí)行失敗,可以通過(guò)3個(gè)View視圖去查看是哪個(gè)task執(zhí)行失敗。

Data Profiling 數(shù)據(jù)分析

image.png
  • Ad Hoc Query:特殊查詢
    通過(guò)UI界面對(duì)一些數(shù)據(jù)庫(kù),數(shù)據(jù)倉(cāng)庫(kù)的進(jìn)行簡(jiǎn)單的SQL交互操作.


    Ad Hoc Query

    image.png
  • Charts:圖表
    實(shí)現(xiàn)數(shù)據(jù)可視化和圖表的工作。通過(guò)SQL去源數(shù)據(jù)庫(kù)檢索一些數(shù)據(jù),保存下來(lái),供后續(xù)使用。

These charts are basic, but they’re easy to create, modify and share


Charts

Charts.png

You can even use the same templating and macros available when writing airflow pipelines, parameterizing your queries and modifying parameters directly in the URL.


image.png
  • Known Events:已知的事件


    Known Events

Browse 瀏覽

Browse
  • SLA Misses

  • Task Instances:查看每個(gè)task實(shí)例執(zhí)行情況


    Task Instances
  • Logs:查看所有dag下面對(duì)應(yīng)的task的日志,并且包含檢索


    image.png
  • Jobs:查看dag的執(zhí)行狀態(tài),開(kāi)始時(shí)間和結(jié)束時(shí)間等指標(biāo)


    image.png
  • DAG Runs

Admin:管理員

image.png
  • Pools:

  • Configuration:查看airflow的配置,即:./airflow_home/airflow.cfg

  • Users:查看用戶列表,創(chuàng)建用戶,刪除用戶

  • Connections
    我們的Task需要通過(guò)Hook訪問(wèn)其他資源, Hook僅僅是一種訪問(wèn)方式, 就像是JDBC driver一樣, 要連接DB, 我們還需要DB的IP/Port/User/Pwd等信息. 這些信息不太適合hard code在每個(gè)task中, 可以把它們定義成Connection, airflow將這些connection信息存放在后臺(tái)的connection表中. 我們可以在WebUI的Admin->Connections管理這些連接.

  • Variables
    Variable 沒(méi)有task_id/dag_id屬性, 往往用來(lái)定義一些系統(tǒng)級(jí)的常量或變量, 我們可以在WebUI或代碼中新建/更新/刪除Variable. 也可以在WebUI上維護(hù)變量.
    Variable 的另一個(gè)重要的用途是, 我們?yōu)镻rod/Dev環(huán)境做不同的設(shè)置, 詳見(jiàn)后面的開(kāi)發(fā)小節(jié).

  • XComs
    XCom和Variable類(lèi)似, 用于Task之間共享一些信息. XCom 包含task_id/dag_id屬性, 適合于Task之間傳遞數(shù)據(jù), XCom使用方法比Variables復(fù)雜些. 比如有一個(gè)dag, 兩個(gè)task組成(T1->T2), 可以在T1中使用xcom_push()來(lái)推送一個(gè)kv, 在T2中使用xcom_pull()來(lái)獲取這個(gè)kv.

Docs

image.png
  • 官方文檔
  • Github地址

Dag提交-python配置任務(wù)

  • DAG 基本參數(shù)配置
default_args = {
    'owner': 'airflow',
    'depends_on_past': False,   # 是否依賴上一個(gè)自己的執(zhí)行狀態(tài) 
    'start_date': datetime.datetime(2019, 1, 1),
    'email': ['wangzhenjun@gmail.com'], # 需要在airflow.cfg中配置下發(fā)件郵箱
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': datetime.timedelta(minutes=5),
    # 'end_date': datetime(2020, 1, 1),   # 結(jié)束時(shí)間,注釋掉也就會(huì)一直執(zhí)行下去
}
  • DAG對(duì)象
    設(shè)置dag的執(zhí)行周期:schedule_interval.該參數(shù)可以接收cron 表達(dá)式和datetime.timedelta對(duì)象,另外airflow還預(yù)置了一些調(diào)度周期。
preset Description cron
None Don’t schedule, use for exclusively “externally triggered” DAGs
@once Schedule once and only once
@hourly Run once an hour at the beginning of the hour 0 * * * *
@daily Run once a day at midnight 0 0 * * *
@weekly Run once a week at midnight on Sunday morning 0 0 * * 0
@monthly Run once a month at midnight of the first day of the month 0 0 1 * *
@yearly Run once a year at midnight of January 1 0 0 1 1 *
dag = DAG(
    'tutorial', 
default_args=default_args, 
schedule_interval='* * * * *' # 執(zhí)行周期,crontab形式
)
  • 定義任務(wù)
    在定義這個(gè)任務(wù)的過(guò)程,就像是在寫(xiě)一個(gè) shell 腳本,只是這個(gè)腳本的每個(gè)操作可以有依賴。 不同的操作對(duì)應(yīng)了不同的 Operator,比如 shell 就需要用 BashOperator 來(lái)執(zhí)行。
t1 = BashOperator(   #任務(wù)類(lèi)型是bash
    task_id='echoDate', #任務(wù)id
    bash_command='echo date > /home/datefile', #任務(wù)命令
    dag=dag)
  • 完整樣例
# coding: utf-8

from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime, timedelta



# 定義默認(rèn)參數(shù)
default_args = {
    'owner': 'wangzhenjun',  # 擁有者名稱(chēng)
    'depends_on_past': False,   # 是否依賴上一個(gè)自己的執(zhí)行狀態(tài)
    'start_date': datetime(2019, 1, 15, 10, 00),  # 第一次開(kāi)始執(zhí)行的時(shí)間,為格林威治時(shí)間,為了方便測(cè)試,一般設(shè)置為當(dāng)前時(shí)間減去執(zhí)行周期
    'email': ['wangzhenjun01@corp.netease.com'],  # 接收通知的email列表
    'email_on_failure': True,  # 是否在任務(wù)執(zhí)行失敗時(shí)接收郵件
    'email_on_retry': True,  # 是否在任務(wù)重試時(shí)接收郵件
    'retries': 3,  # 失敗重試次數(shù)
    'retry_delay': timedelta(seconds=5)  # 失敗重試間隔
}

# 定義DAG
dag = DAG(
    dag_id='hello_world',  # dag_id
    default_args=default_args,  # 指定默認(rèn)參數(shù)
    # schedule_interval="00, *, *, *, *"  # 執(zhí)行周期,依次是分,時(shí),天,月,年,此處表示每個(gè)整點(diǎn)執(zhí)行
    schedule_interval=timedelta(minutes=1)  # 執(zhí)行周期,表示每分鐘執(zhí)行一次
)

"""
1.通過(guò)PythonOperator定義執(zhí)行python函數(shù)的任務(wù)
"""
# 定義要執(zhí)行的Python函數(shù)1
def hello_world_1():
    current_time = str(datetime.today())
    with open('/root/tmp/hello_world_1.txt', 'a') as f:
        f.write('%s\n' % current_time)
    assert 1 == 1  # 可以在函數(shù)中使用assert斷言來(lái)判斷執(zhí)行是否正常,也可以直接拋出異常
# 定義要執(zhí)行的Python函數(shù)2
def hello_world_2():
    current_time = str(datetime.today())
    with open('/root/tmp/hello_world_2.txt', 'a') as f:
        f.write('%s\n' % current_time)

# 定義要執(zhí)行的task 1
t1 = PythonOperator(
    task_id='hello_world_1',  # task_id
    python_callable=hello_world_1,  # 指定要執(zhí)行的函數(shù)
    dag=dag,  # 指定歸屬的dag
    retries=2,  # 重寫(xiě)失敗重試次數(shù),如果不寫(xiě),則默認(rèn)使用dag類(lèi)中指定的default_args中的設(shè)置
)
# 定義要執(zhí)行的task 2
t2 = PythonOperator(
    task_id='hello_world_2',  # task_id
    python_callable=hello_world_2,  # 指定要執(zhí)行的函數(shù)
    dag=dag,  # 指定歸屬的dag
)

t2.set_upstream(t1)  # t2依賴于t1;等價(jià)于 t1.set_downstream(t2);同時(shí)等價(jià)于 dag.set_dependency('hello_world_1', 'hello_world_2')
# 表示t2這個(gè)任務(wù)只有在t1這個(gè)任務(wù)執(zhí)行成功時(shí)才執(zhí)行,
# 或者
t1 >> t2


"""
2.通過(guò)BashOperator定義執(zhí)行bash命令的任務(wù)
"""
hello_operator = BashOperator(   #通過(guò)BashOperator定義執(zhí)行bash命令的任務(wù)
    task_id='sleep_task',
    depends_on_past=False,
    bash_command='echo `date` >> /home/py/test.txt',
    dag=dag
)
"""
其他任務(wù)處理器:
3.EmailOperator : 發(fā)送郵件
4.HTTPOperator : 發(fā)送 HTTP 請(qǐng)求
5.SqlOperator : 執(zhí)行 SQL 命令
"""

分布式部署

CeleryExecutor is one of the ways you can scale out the number of workers. For this to work, you need to setup a Celery backend (RabbitMQ, Redis, …) and change your airflow.cfg to point the executor parameter to CeleryExecutor and provide the related Celery settings.

我們的生產(chǎn)環(huán)境:
每臺(tái)機(jī)器運(yùn)行的任務(wù)所屬應(yīng)用各不相同,不同應(yīng)用運(yùn)行環(huán)境也不相同,另外不同應(yīng)用也希望達(dá)到集群隔離的目的。如果要實(shí)現(xiàn)這個(gè)功能,需要自己提供隊(duì)列的管理,指定隊(duì)列的任務(wù)節(jié)點(diǎn)會(huì)被調(diào)度到相應(yīng)隊(duì)列的機(jī)器上,相應(yīng)隊(duì)列的機(jī)器也只會(huì)運(yùn)行指定隊(duì)列的任務(wù)節(jié)點(diǎn)。

大部分都是集中在2-3臺(tái)機(jī)器提交,環(huán)境類(lèi)似,各自提交任務(wù),但是任務(wù)通過(guò)主節(jié)點(diǎn)去隨機(jī)分發(fā)到各結(jié)點(diǎn)執(zhí)行,并不能保證環(huán)境的滿足。
現(xiàn)在情況:如果是組內(nèi)使用,各位的環(huán)境差異比較大,首先需要保證各環(huán)境的統(tǒng)一性

面臨的問(wèn)題:

  • 官方文檔+網(wǎng)上的關(guān)于分布式的資料不多,官方文檔更多是一筆帶過(guò)。
image.png

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,185評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,656評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,647評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,446評(píng)論 6 405
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,951評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,189評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,718評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,800評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,419評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,671評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,420評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,755評(píng)論 2 371

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

  • 本文將介紹 Airflow 這一款優(yōu)秀的調(diào)度工具。主要包括 Airflow 的服務(wù)構(gòu)成、Airflow 的 Web...
    a7f00a9019ae閱讀 62,573評(píng)論 6 42
  • Apache Spark 是專(zhuān)為大規(guī)模數(shù)據(jù)處理而設(shè)計(jì)的快速通用的計(jì)算引擎。Spark是UC Berkeley AM...
    大佛愛(ài)讀書(shū)閱讀 2,842評(píng)論 0 20
  • 在快速啟動(dòng)部分中設(shè)置很簡(jiǎn)單,構(gòu)建生產(chǎn)級(jí)環(huán)境需要更多的工作,下面來(lái)了解一下。 1. 設(shè)置配置選項(xiàng) 第一次運(yùn)行Airf...
    路小漫閱讀 9,599評(píng)論 0 3
  • 阿里妹導(dǎo)讀:搜索中臺(tái)建設(shè)過(guò)程中,單個(gè)系統(tǒng)不再能滿足復(fù)雜業(yè)務(wù)的需求,更多時(shí)候需要多個(gè)子系統(tǒng)互相協(xié)作,異步地按照指定流...
    高級(jí)java架構(gòu)師閱讀 4,547評(píng)論 0 7
  • 2016-05-22《解決力》肖威 改變你命運(yùn)的第24課 演講者:肖威 信息整理者:陳安娜 可參考:大前研一——《...
    陳安娜閱讀 1,145評(píng)論 0 0