目錄
2.2 Oozie重新運行一個workflow 中的某個子任務
1 引 言
Oozie作爲一種開源的任務調度引擎,在大數據生態圈中起着舉足輕重的作用。用戶可根據自己實際需求定義工作流,設置定時或觸發任務,可以說Oozie是整個大數據工作中最後的一道關卡,如果任務一旦中斷則給用戶帶來巨大損失。爲了避免損失Oozie提供了任務重試或重啓策略,用戶可根據Oozie的重啓策略對工作流進行監控,一旦發生工作流故障則立馬啓動重啓策略保證任務順利進行。本文針對Oozie的重啓策略進行研究總結,給出了實際中具體應用方法,並針對重啓策略編寫了具體監控腳本,具有一定的實踐指導意義。
2 Oozie重啓任務方法
注:Oozie的重啓策略只針對Oozie任務的意外中斷,而不針對用戶具體腳本執行錯誤進行重啓,如果用戶中腳本中出現bug,無論怎麼重啓都不會重新執行。該策略往往針對網絡中斷或資源不足而造成的,某個任務中斷,此種中斷是可恢復的。
2.1 重新運行一個Coordinator job
重新運行一個Coordinator job,可以通過如下命令:
[oozie@bigdata3 root]$ oozie job -rerun 0000014-200508144016595-oozie-oozi-C -refresh -action 4
refresh參數 保證rerun的時候重新去檢查一下依賴條件的狀態,看看是否能滿足執行的條件。
執行結果如下:
2.2 Oozie重新運行一個workflow 中的某個子任務
具體命令如下:
oozie job -oozie http://10.0.5.18:11000/oozie -config job.properties -rerun 0000392-190417154109373-oozie-oozi-W -D oozie.wf.rerun.failnodes=false -action shell-appv_jttl_pull_day_sync
oozie.wf.rerun.failnodes 參數含義:
注意點:
該參數必須要指定的參數,如果不指定會報如下錯誤:
- 執行rerun的時候需要在該腳本目錄下執行,否則會報相關文件找不到
- 切換到oozie用戶
如果只想重新運行一個workflow 可以通過如下命令
oozie job -rerun 0000048-200508144016595-oozie-oozi-W -config rerun workflow.xml -D oozie.wf.rerun.failnodes=false
重新運行後具體結果如下:
另外在worfkflow程序中,也可以按照如下配置來自動重試:
總體可以解釋爲:每3分鐘重試一次,一共重試5次。
2.3 Oozie按照時間的range重跑歷史任務
具體命令如下:
[oozie@bigdata3 test_ooize3]$ oozie job -oozie http://10.0.5.18:11000/oozie -config job.properties -rerun 0000000-200508144016595-oozie-oozi-C -date 2020-05-08T14:10+0800::2020-05-09T16:00+0800
Action ID Nominal Time
------------------------------------------------------------------------------------------------------------------------------------
0000000-200508144016595-oozie-oozi-C@3 2020-05-08 15:05 CST
0000000-200508144016595-oozie-oozi-C@1 2020-05-08 14:55 CST
0000000-200508144016595-oozie-oozi-C@2 2020-05-08 15:00 CST
通過“-date”來指定時間的range,注意時間的格式是“xxxx-xx-xxTxx:xx+0800::xxxx-xx-xx”,“T”不能少,“0800”指定的是市區,中國處於東八區,所以是0800,兩個時間之間用“::”符號連接,這裏詳細說明下時間範圍的含義:
假設job是每天13點開始跑,那麼:
總之,就是取一個閉區間,執行這個區間內所有本該運行的任務:
[Begin_time, End_time]
2.4 Oozie重啓任務監控腳本代碼編寫
#!/bin/sh
# mysql連接
hostname="localhost"
port="3306"
username="oozie"
password="oozie"
dbname="oozie"
# job的名稱
appname=$1
#當前時間
nowtime=`date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"`
# sql 查詢語句
select_sql="
select concat(a.job_id,',',a.action_number) from COORD_JOBS j,COORD_ACTIONS a
where j.id = a.job_id
and j.app_name = '${appname}'
and j.status = 'running'
and to_days(a.created_time) = TO_DAYS(now())
and a.status != 'SUCCEEDED';
"
# 連接mysql查詢
result=(`mysql -h${hostname} -P${port} -u${username} -p${password} ${dbname} -N -e "${select_sql}"`)
echo ${result}
# 如果查詢結果不爲空,則執行oozie的rerun腳本,並跳過失敗的節點執行
if [ -n "${result}" ] ;then
#echo ${result}
IFS=',' arr=(${result})
echo ${nowtime} ${appname} ${arr[0]} ${arr[1]} >> job_rerun.log
oozie job -rerun ${arr[0]} -refresh -action ${arr[1]} -D oozie.wf.rerun.failnodes=false
fi
3 小 結
本文針對Oozie的重啓策略進行總結,所有的操作均得到實踐驗證
參考文獻: