2014-02-07 49 views
0

我在oozie上有一個協調器,負責運行一系列任務,每個任務都取決於最後一個的輸出。 每個任務輸出日期的文件夾,並查找其前身的使用Oozie上的嚴格協調員作業排序

${coord:latest(0)} 

這一切都工作得很好我的開發羣集上在沒有其他正在運行的輸出;每5分鐘oozie就會排隊等待另一份工作,並在5分鐘內完成上一份工作,所以當新工作設置好後,它會看到它需要的目錄。

我遇到了生產集羣上的問題;作業被提交,但被放入隊列中並且不會運行一段時間,但仍然每隔5分鐘就會排隊另一個作業,並且在其初始化階段將其分配給其「前一個」文件夾,該文件夾尚未由於其前身尚未運行,因此「最新」功能可爲其提供與之前工作相同的輸入。然後我得到10個作業全部採取相同的輸入...

我需要的是一種嚴格防止協調器序列中的下一個作業從創建到其前任完成運行的方式。 有沒有辦法做到這一點?

感謝您閱讀

+0

你爲共同領導指定的頻率是多少? –

+0

看看這些例子,https://github.com/yahoo/oozie/wiki/Oozie-Coord-Use-Cases我不確定這是不是最好的主意,但是你可以使用'Coordinator Job With Timeouts'示例來設置超時並消除堆積相同的作業 –

+0

對不起,我錯過了關鍵信息那裏 - 頻率設置爲每天,但我們有積壓舊數據導入,因此它的調度工作更頻繁比這是因爲它們的標稱運行時間在過去。 – user1111284

回答

1

這是Oozie的旨在解決具體使用情況。 Oozie將在啓動之前等待所有數據依賴。

請理解以下CONFIGS在coordinator.xml

<datasets> 
     <dataset name="my_data" frequency="${coord:days(1)}" initial-instance="2013-01-27T00:00Z"> 
      <uri-template>YOUR_DATA/${YEAR}${MONTH}${DAY}</uri-template> 
     </dataset> 
    ... 
    <datasets> 

    <input-events> 
     <data-in name="my_data" dataset="my_data"> 
      <instance>${coord:current(-1)}</instance> 
     </data-in> 
    </input-events> 

    <output-events> 
     <data-out name="my_data" dataset="my_data"> 
      <instance>${coord:current(0)}</instance> 
     </data-out> 
    </output-events> 

的:在輸入事件「座標電流(-1)」是指前面的輸出。它會將數據集URI組件解釋爲「昨天」,並且Oozie將通過檢查成功標誌來檢查數據是否存在於HDFS中,成功標誌默認爲輸出目錄下的名爲「_SUCCESS」的空文件。 Oozie將在啓動當前工作流程之前繼續等待此標誌。

順便說一句,你還可以設置

<coordinator-app name="my_coordinator" frequency="${coord:days(1)}" start="${start_time}" end="${end_time}" ...> 

定義起始時間和協調工作的結束時間,這樣你就可以趕上積壓數據。

+0

我們曾考慮過使用'coord:current(-1)',但我們無法保證數據總是可用於某一天,在這種情況下,我們希望回退到前一天的輸出,因此我們使用'coord:latest (0)」。在多個作業實現的情況下,在前一個作業結束並選擇錯誤輸入之前對其進行評估。雖然規範實質化似乎是不可能的,但我們必須重新配置我們的其餘過程以與此方法兼容。 – user1111284

+0

我嘗試瞭解情況,但仍有點困惑。如果一項新工作取決於以前的工作產出,那麼它又如何能夠平行?如果您不需要追蹤積壓數據,是否嘗試將輸出複製到其他位置,並將該位置用作整個工作流程的唯一輸入?我的意思是這個位置只存儲最新的結果。 – Wenzhong

+0

每個作業都依賴於前一個作業的輸出,但不能保證前一個作業在前一天成功運行,因此需要使用'coord:latest(0)'文件夾。我們可以讓每個作業將其數據輸出到一個通用文件夾,但我們仍然需要一種方法來確保即將運行的最新作業已完成。 – user1111284