Oozie重啓任務策略研究及總結

目錄

1 引 言

2 Oozie重啓任務方法

2.1 重新運行一個Coordinator job

​2.2 Oozie重新運行一個workflow 中的某個子任務

2.3 Oozie按照時間的range重跑歷史任務

2.4 Oozie重啓任務監控腳本代碼編寫

3 小 結


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 參數含義:

true指在失敗的節點重新運行
false指不在失敗的節點運行
oozie.wf.rerun.skip.nodes 指定跳過哪些節點運行

注意點:

       該參數必須指定的參數,如果不指定會報如下錯誤:

  • 執行rerun的時候需要在該腳本目錄下執行,否則會報相關文件找不到
  • 切換到oozie用戶

 如果只想重新運行一個workflow 可以通過如下命令

oozie job -rerun 0000048-200508144016595-oozie-oozi-W -config rerun workflow.xml -D oozie.wf.rerun.failnodes=false

重新運行後具體結果如下:

注意: 使用rerun重新運行workflowjob時,在coordinator中配置的參數會失效,因此通常是rerun一個coordinator程序。

另外在worfkflow程序中,也可以按照如下配置來自動重試:

retry-max: 表示重試次數,如果該配置大於系統的配置最大重試次數,則取系統配置的最大次數
retry-interval: 重試時間間隔,3分鐘。 

     總體可以解釋爲:每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點開始跑,那麼:

2020-02-20T00:10+0800::2020-02-21T14:00+0800 => 會運行20,21號的任務,因爲end time 超過了2113:00
2020-02-20T00:10+0800::2020-02-21T10:00+0800 => 只會運行20號的任務,因爲end time 沒有超過了2113:00

總之,就是取一個閉區間,執行這個區間內所有本該運行的任務:
[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的重啓策略進行總結,所有的操作均得到實踐驗證

參考文獻:

https://www.cnblogs.com/30go/p/9244142.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章