Airflow 初探

本文原載于:https://old-panda.com/2018/10/26/airflow-101/

距離上回寫小作文過了多半年芍锚,這幾個月來發(fā)生了一些事情萧福,最大的就是這個月初我換了工作绎狭,從抬闯、 Palo Alto 換到了 Mountain View 溉躲,附近吃的喝的玩的較之以前有了很大的提升星岗。但總歸主業(yè)是過來干活的,上班大概三周了首有,很開心剛?cè)肼毦妥屛已芯块_發(fā)一個新項目燕垃,其核心就是 Airflow ,一個有向無環(huán)圖任務(wù)( Directed Acyclic Graph – DAG)的調(diào)度工具井联,看了不少文檔博客卜壕,踩了大大小小的坑,算是成功的把它運(yùn)行到了服務(wù)器上烙常,下一步就可以在這個基礎(chǔ)上開發(fā)一些東西轴捎。既然告一段落,那么應(yīng)該寫點(diǎn)文字蚕脏,以 Airflow 為例轮蜕,簡單描述如何把一個程序作為一個服務(wù)運(yùn)行在 Linux 機(jī)器上。

安裝

我創(chuàng)建了一個用戶 airflow 專門負(fù)責(zé) Airflow 的運(yùn)行蝗锥,即無論是安裝運(yùn)行 Airflow ,還是修改 Airflow 的配置率触,都通過該用戶來進(jìn)行终议,為了進(jìn)展順利,給這個用戶開了綠燈葱蝗,授予 root 權(quán)限穴张。安裝 Airflow 這一步其實是最簡單的,官網(wǎng)有詳細(xì)的說明两曼。我的環(huán)境是 Python 3.6.6 皂甘, Airflow 的版本是 1.10.0 ,為了避免與已有的包沖突悼凑,我將其安裝在一個 virtualenv 中偿枕,在 /home/airflow 下執(zhí)行如下命令

virtualenv venv -p `which python3`
source venv/bin/activate
pip install apache-airflow[postgres,crypto,gcp_api]==1.10.0

方括號中的是可選的依賴,在這里我用 PostgreSQL 作為 Airflow metadata 的數(shù)據(jù)庫(默認(rèn)是 SQLite )户辫,并且想要加密我的各種鏈接參數(shù)如密碼渐夸,同時想要與谷歌云服務(wù)進(jìn)行交互,所以安裝這三個渔欢。用戶可以根據(jù)自己的實際情況選擇不同的依賴墓塌,詳細(xì)說明可以參考官方文檔

插一句題外話, 如果想給自己開發(fā)的 Python 包添加可選依賴的話(方括號)苫幢,可以通過定義 setup.pyextra_require 來實現(xiàn)访诱,具體可參考這里

配置文件

因為我們希望把 Airflow 作為一個服務(wù)運(yùn)行起來韩肝,便于以后的繼續(xù)開發(fā)及維護(hù)触菜,而不是運(yùn)行一次給人看看效果就拉倒,所以我采用了 systemd 來管理 Airflow 進(jìn)程的運(yùn)行伞梯。

關(guān)于 systemd 的配置玫氢, Airflow 的文檔上有個簡要介紹,具體來說谜诫,在我的配置中漾峡,我將環(huán)境變量 AIRFLOW_HOME 設(shè)置為 /etc/airflow ,將 AIRFLOW_CONFIG 設(shè)置為 /etc/airflow/airflow.cfg 喻旷,這樣生逸,在我的文件 /etc/sysconfig/airflow 中只有這兩行環(huán)境變量

AIRFLOW_CONFIG=/etc/airflow/airflow.cfg
AIRFLOW_HOME=/etc/airflow

為了將 Airflow 能順利運(yùn)行起來,有兩個必需的服務(wù)且预,一個 webserver 槽袄,用于顯示 web UI ,一個 scheduler 锋谐,用于執(zhí)行 DAG 中的任務(wù)遍尺,好在 Airflow 已經(jīng)提供給了我們這兩個服務(wù)的示例文件airflow-webserver.serviceairflow-scheduler.service ,唯一需要修改的一行就是 ExecStart 涮拗,因為我們將要在虛擬環(huán)境中運(yùn)行 Airflow 乾戏,最終這兩個文件分別如下所示

  • airflow-webserver.service
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

[Unit]
Description=Airflow webserver daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service

[Service]
EnvironmentFile=/etc/sysconfig/airflow
User=airflow
Group=airflow
Type=simple
ExecStart=/bin/bash -c 'source /home/airflow/venv/bin/activate ; airflow webserver --pid /run/airflow/webserver.pid'
Restart=on-failure
RestartSec=5s
PrivateTmp=true

[Install]
WantedBy=multi-user.target
  • airflow-scheduler.service
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

[Unit]
Description=Airflow scheduler daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service

[Service]
EnvironmentFile=/etc/sysconfig/airflow
User=airflow
Group=airflow
Type=simple
ExecStart=/bin/bash -c 'source /home/airflow/venv/bin/activate ; airflow scheculer'
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

具體 bash 的位置因系統(tǒng)而異,需要注意的一點(diǎn)就是必須用絕對路徑來執(zhí)行三热。然后將兩者置于 /etc/systemd/system 下鼓择。還有一個文件是不可缺少的 airflow.conf ,這個直接抄下來放在 /etc/systemd 里就漾。

這樣 systemd 的部分算是完成了呐能,但還不算完,我們還需要一個 airflow.cfg 來告訴 Airflow 如何配置抑堡。每個用戶的具體情況不一樣摆出,我就不一一贅述了,這里只提幾個比較重要的夷野。

  • sql_alchemy_conn = postgresql+psycopg2://<user>:<password>@<host>:<port> 我們在生產(chǎn)環(huán)境采用 PostgreSQL 作為 metadata 數(shù)據(jù)庫
  • load_examples = False 示例 DAG 自己在開發(fā)測試的時候是很好的參考懊蒸,但明顯在生產(chǎn)環(huán)境中用不到它們,所以關(guān)掉
  • fernet_key = <some base64 string> 這個肯定得有悯搔,要不然 Airflow 會把各種鏈接的敏感參數(shù)存成明文骑丸,生成方法可以參考這里
  • executor = LocalExecutor LocalExecutor 可以最大程度的利用單機(jī)的并行能力舌仍,即運(yùn)行多個進(jìn)程來同時執(zhí)行不同的任務(wù),對于目前的需求來說是足夠了通危,以后還可以考慮使用 redis + celery 的方式進(jìn)行橫向擴(kuò)展

運(yùn)行

首先要初始化數(shù)據(jù)庫铸豁,這個得手動搞,還是以 airflow 的身份運(yùn)行

source ~/venv/bin/activate
export AIRFLOW_HOME=/etc/airflow
airflow initdb

然后就可以用 systemd 來控制 Airflow 的啟停了

sudo systemctl [start|stop|restart|status] airflow-webserver
sudo systemctl [start|stop|restart|status] airflow-scheduler

每次希望新加入一個 DAG 時菊碟,只需要把 Python 文件放到 /etc/airflow/dags 里即可节芥。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逆害,隨后出現(xiàn)的幾起案子头镊,更是在濱河造成了極大的恐慌,老刑警劉巖魄幕,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件相艇,死亡現(xiàn)場離奇詭異,居然都是意外死亡纯陨,警方通過查閱死者的電腦和手機(jī)坛芽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翼抠,“玉大人咙轩,你說我怎么就攤上這事∫跤保” “怎么了活喊?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長量愧。 經(jīng)常有香客問我胧弛,道長,這世上最難降的妖魔是什么侠畔? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮损晤,結(jié)果婚禮上软棺,老公的妹妹穿的比我還像新娘。我一直安慰自己尤勋,他們只是感情好喘落,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著最冰,像睡著了一般瘦棋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上暖哨,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天赌朋,我揣著相機(jī)與錄音,去河邊找鬼。 笑死沛慢,一個胖子當(dāng)著我的面吹牛赡若,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播团甲,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逾冬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了躺苦?” 一聲冷哼從身側(cè)響起身腻,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匹厘,沒想到半個月后嘀趟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡集乔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年去件,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扰路。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡尤溜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出汗唱,到底是詐尸還是另有隱情宫莱,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布哩罪,位于F島的核電站授霸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏际插。R本人自食惡果不足惜碘耳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望框弛。 院中可真熱鬧辛辨,春花似錦、人聲如沸瑟枫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慷妙。三九已至僻焚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膝擂,已是汗流浹背虑啤。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工隙弛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咐旧。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓驶鹉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铣墨。 傳聞我的和親對象是個殘疾皇子室埋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

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

  • 簡述 前端時間嘗試著搭建了airflow的高可用(HA)環(huán)境,為避免自己遺忘伊约,現(xiàn)將安裝過程整理成文檔姚淆。公司環(huán)境沒有...
    samsing閱讀 7,132評論 0 15
  • 1.環(huán)境準(zhǔn)備 centos7 1.1、yum安裝設(shè)置 yum list |grep openstackcentos...
    davisgao閱讀 5,489評論 1 16
  • 在快速啟動部分中設(shè)置很簡單屡律,構(gòu)建生產(chǎn)級環(huán)境需要更多的工作腌逢,下面來了解一下。 1. 設(shè)置配置選項 第一次運(yùn)行Airf...
    路小漫閱讀 9,456評論 0 3
  • 本文參加#感悟三下鄉(xiāng),青春筑夢行#活動霍殴,本人承諾媒惕,文章內(nèi)容為原創(chuàng),且未在其他平臺發(fā)表過来庭。 近年來妒蔚,高速發(fā)展的經(jīng)濟(jì)使...
    Krystal_bf10閱讀 524評論 0 1
  • 將士百戰(zhàn)身先死,功成名就萬骨枯月弛。馬革裹尸無人知肴盏,烈烈戰(zhàn)馬嘶風(fēng)鳴。自古勝王留青史帽衙,收藏公明利與祿菜皂。待我踏破這山河,封...
    剎那時光閱讀 446評論 0 0