實(shí)用調(diào)度工具Airflow
引言
前面寫過(guò)一篇文章《端午搬磚:聊聊調(diào)度云服務(wù)》,主要講云服務(wù)的。如果企業(yè)也業(yè)務(wù)上云,可以優(yōu)先選用這些服務(wù),減少工作量。
而在傳統(tǒng)企業(yè)內(nèi)部,數(shù)據(jù)集成是基礎(chǔ),更是每個(gè)企業(yè)里面都至少有一個(gè)ETL工具或者調(diào)度+業(yè)務(wù)代碼實(shí)現(xiàn)ETL。
Kettle
說(shuō)到ETL,開源比較有名的是kettle(Kettle英文是水壺的名字,你要是去美國(guó)或者歐洲出差,很多酒店是不提供熱水的,你可以電話前臺(tái)要一個(gè)kettle)?,F(xiàn)在有一家叫petaho的公司專門做kettle的商業(yè)版本。
kettle是純java工具,Kettle 是一款國(guó)外開源的 ETL 工具,純 Java 編寫,Kettle 中有兩種腳本文件,transformation 和 job,transformation 完成針對(duì)數(shù)據(jù)的基礎(chǔ)轉(zhuǎn)換,job 則完成整個(gè)工作流的控制。這個(gè)工具發(fā)展很久了,不過(guò)感覺很重型,又是個(gè)C/S框架的,不是很推薦。Github上看,支持的人還是比較少。
一個(gè)通用的ETL工具其實(shí)是比較難的,主要是業(yè)務(wù)邏輯通常會(huì)靈活性和復(fù)雜度比較高,通過(guò)界面能全部配置出來(lái)太理想化了。所以反而是一些簡(jiǎn)單的調(diào)度工具會(huì)適用范圍比較廣,業(yè)務(wù)邏輯由企業(yè)開發(fā)人員代碼實(shí)現(xiàn),只解決基本調(diào)度的問題。
Airflow
這里介紹一個(gè)Airflow,這個(gè)是由Airbnb公司貢獻(xiàn)的,(Airbnb,是一個(gè)讓大眾出租住宿民宿的網(wǎng)站,提供短期出租房屋或房間的服務(wù)。最近業(yè)務(wù)也開到中國(guó)來(lái)了) 。這家公司前面還有一個(gè)基于mesos的chronos調(diào)度服務(wù),見文章《Chronos:數(shù)據(jù)中心的任務(wù)調(diào)度器(job scheduler)》,不過(guò)現(xiàn)在已經(jīng)停止更新了。Airflow是由airbnb的Maxime Beauchemin創(chuàng)建,目前是apache孵化項(xiàng)目,很有特點(diǎn):
1. 主要是由Python實(shí)現(xiàn)的。Job定義也是靠python,不提供xml和界面定義的方式。下面是一個(gè)pipeline的定義例子,python本身是一種比較簡(jiǎn)潔的語(yǔ)言,容易上手,所以經(jīng)過(guò)一定的學(xué)習(xí)還是很容易掌握的。
- """
- Code that goes along with the Airflow tutorial located at:
- https://github.com/airbnb/airflow/blob/master/airflow/example_dags/tutorial.py
- """
- from airflow import DAG
- from airflow.operators.bash_operator import BashOperator
- from datetime import datetime, timedelta
- default_args = {
- 'owner': 'airflow',
- 'depends_on_past': False,
- 'start_date': datetime(2015, 6, 1),
- 'email': ['airflow@airflow.com'],
- 'email_on_failure': False,
- 'email_on_retry': False,
- 'retries': 1,
- 'retry_delay': timedelta(minutes=5),
- # 'queue': 'bash_queue',
- # 'pool': 'backfill',
- # 'priority_weight': 10,
- # 'end_date': datetime(2016, 1, 1),
- }
- dag = DAG('tutorial', default_argsdefault_args=default_args)
- # t1, t2 and t3 are examples of tasks created by instantiating operators
- t1 = BashOperator(
- task_id='print_date',
- bash_command='date',
- dagdag=dag)
- t2 = BashOperator(
- task_id='sleep',
- bash_command='sleep 5',
- retries=3,
- dagdag=dag)
- templated_command = """
- {% for i in range(5) %}
- echo "{{ ds }}"
- echo "{{ macros.ds_add(ds, 7)}}"
- echo "{{ params.my_param }}"
- {% endfor %}
- """
- t3 = BashOperator(
- task_id='templated',
- bash_command=templated_command,
- params={'my_param': 'Parameter I passed in'},
- dagdag=dag)
- t2.set_upstream(t1)
- t3.set_upstream(t1)
2. 使用Jinja來(lái)做模板引擎,所以支持模板,Jinja也是Python實(shí)現(xiàn)的,對(duì)Python真是真愛呀。
3. 雖然不支持常見的UI定義Pipeline,但是還是有豐富的UI界面來(lái)幫助pipeline的維護(hù)和管理。
(1)pipeline狀態(tài)
(2)任務(wù)進(jìn)度
(3)依賴關(guān)系管理
(4)甘特圖可讓您分析任務(wù)持續(xù)時(shí)間和重疊。幫助快速找出瓶頸以及大部分時(shí)間花在特定DAG運(yùn)行中的位置。
(5)過(guò)去N批次運(yùn)行不同任務(wù)的持續(xù)時(shí)間。快速查找異常值,并快速了解在多個(gè)運(yùn)行中在DAG中花費(fèi)的時(shí)間。
(6)更有意思的是,還支持交互式查詢,一些基本,簡(jiǎn)單的數(shù)據(jù)分析在工具中就可以完成,所見即所得,不用編寫pipeline,等任務(wù)完成之后才知道結(jié)果。
http://airflow.incubator.apache.org/profiling.html
4. 擴(kuò)展性方面支持和Celery和mesos集成
5. ***再看看社區(qū)狀況,人不少,281個(gè)
不過(guò)14年的項(xiàng)目,現(xiàn)在還沒有畢業(yè),時(shí)間有點(diǎn)長(zhǎng)了,可能是Airbnb也并不熱衷這個(gè)事情。一個(gè)好的開源軟件,背后一定要看到一個(gè)商業(yè)公司來(lái)推動(dòng)他的發(fā)展,否則穩(wěn)定性和未來(lái)的發(fā)展可能會(huì)一定的問題。
總結(jié)建議
***,我個(gè)人的建議是,如果你想對(duì)調(diào)度工具有很強(qiáng)的掌控力,且有能力維護(hù),就考慮選擇airflow吧,否則還是算了吧。
【本文為51CTO專欄作者“大數(shù)據(jù)和云計(jì)算”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)微信公眾號(hào)獲取聯(lián)系和授權(quán)】