2015-06-20 65 views
2

我已經使用Oozie創建了一個工作流,它由多個操作節點組成,並且已經成功地通過協調器運行。如何通過shell腳本調用oozie工作流並阻止/等到工作流完成

我想通過包裝器外殼腳本來調用Oozie工作流。

包裝腳本應調用Oozie命令,等待oozie作業完成(成功或錯誤)並返回Oozie成功狀態代碼(0)或失敗的oozie動作節點的錯誤代碼(如果任何節點oozie工作流程失敗)。

從我迄今看到的情況來看,只要我調用oozie命令來運行工作流程,該命令就會退出,同時將作業ID打印在Linux控制檯上,而oozie作業仍在異步運行後端。

我想我的包裝腳本阻塞,直到oozie協調器作業完成並返回成功/錯誤代碼。

你可以讓我知道如何使用任何oozie功能來實現這個功能嗎?

我在Linux中使用Oozie版本3.3.2和bash shell。

注意:如果有人對我爲什麼需要這樣的功能感到好奇 - 要求是我的包裝器腳本應該知道oozie作業已經運行了多長時間,當oozie作業完成時,並相應地返回退出代碼,以便調用封裝腳本的父進程知道作業是否成功完成,如果發生錯誤,請爲支持團隊提出警報/故障單。

回答

2

爲工作流定義上傳到HDFS使用以下命令:

hdfs dfs -copyFromLocal -f workflow.xml /user/hdfs/workflows/workflow.xml

火起來Oozie的工作,你在下面 需要這兩個命令請注意,寫在每一行。

JOB_ID=$(oozie job -oozie http://<oozie-server>/oozie -config job.properties -submit)

oozie job -oozie http://<oozie-server>/oozie -start ${JOB_ID#*:} -config job.properties

你需要分析導致下面的命令來當回result = 0否則就是失敗。在每次試驗後簡單地睡眠X時間。

oozie job -oozie http://<oozie-server>/oozie -info ${JOB_ID#*:}

echo $? //shows whether command executed successfully or not

+3

感謝您的回答,如果你寫兩個之間的事情'中間的文字將被突出顯示,如:'example',通常代碼寫在你的答案這樣的點擊編輯,你會看到我是如何享福,並澄清你的答案。此外,如果你在其他職位採取看看你會看到沒有人使用的問候實際上問候職位通常是由社區members.Please通過點擊遊覽按鈕,在頂部或幫助下拉看不慣得到通知徽章,然後單擊在巡演中仔細閱讀。 – Zich

+0

我正在爲你寫這篇評論,因爲你的回答發送給我,由社區審查。 – Zich

3

你可以通過使用作業ID然後開始一個循環,並解析的Oozie的信息輸出。以下是相同的shell代碼。

開始Oozie的工作

oozie_job_id=$(oozie job -oozie http://<oozie-server>/oozie -config job.properties -run); 
echo $oozie_job_id; 
sleep 30; 

解析工作從輸出ID。這裏JOB_ID格式爲「工作:作業ID」在固定時間間隔

job_id=$(echo $oozie_job_id | sed -n 's/job: \(.*\)/\1/p'); 
echo $job_id; 

檢查作業狀態,如果它的運行或不

while [ true ] 
do 
    job_status=$(oozie job --oozie http://<oozie-server>/oozie -info $job_id | sed -n 's/Status\(.*\): \(.*\)/\2/p'); 
    if [ "$job_status" != "RUNNING" ]; 
    then 
     echo "Job is completed with status $job_status"; 
     break; 
    fi 
    #this sleep depends on you job, please change the value accordingly 
    echo "sleeping for 5 minutes"; 
    sleep 5m 
done 

這是做基本的方式,你可以修改它按照你用例。