1. 引言
眾所周知,Oozie(1, 2)是基于時(shí)間條件與數(shù)據(jù)生成來(lái)做工作流調(diào)度的,但是Oozie的數(shù)據(jù)觸發(fā)條件只支持HDFS路徑,故而面臨著這樣的問題:
- 無(wú)法判斷Hive partition是否已存在;
- 無(wú)法判斷Elasticsearch index是否已寫入完成;
- ...
因此,靈活可擴(kuò)展的工作流引擎才是正確姿勢(shì)!下面,我將介紹如何用Crontab來(lái)打造一個(gè)類似于Oozie的簡(jiǎn)易工作流引擎;對(duì)標(biāo)Oozie,其應(yīng)滿足功能:
- 時(shí)間條件與數(shù)據(jù)生成觸發(fā)任務(wù),如Oozie coordinator的datasets與input-events;
- 支持觸發(fā)條件的輪詢;
- 支持任務(wù)并行執(zhí)行,如Oozie workflow的fork與join;
- 捕獲錯(cuò)誤及運(yùn)行狀態(tài)日志。
2. 實(shí)現(xiàn)
觸發(fā)條件
判斷Hive partition是否已存在,思路比較簡(jiǎn)單——show partitions <tb_name>后能否grep到該partition:
# check wheter $1's partition ($2) exists hive_partition_exists() {
table_name=$1
partition=$2
hive -e "show partitions ${table_name}" | grep ${partition}
[ $? == 0 ]
}