2016-01-05 52 views
4

目前,我有一堆排隊在一起的luigi任務,帶有一個簡單的依賴鏈(a -> b -> c -> d)。 d首先執行,最後執行aa是被觸發的任務。如何重置luigi任務狀態?

a之外的所有目標均返回一個luigi.LocalTarget()對象,並且具有一個字符串(包含日期和時間)的通用luigi.Parameter()。在Luigi中央服務器上運行(已啓用歷史記錄)。

的問題是,當我重新運行的任務說a,路易吉檢查歷史,如果某個任務已運行之前,如果它曾經有過的DONE狀態看,它不運行的任務(d在這種情況下),我不能這樣做,更改字符串並沒有幫助(將隨機微秒添加到它)。我如何強制運行任務?

+0

您能否詳細介紹每項任務?你如何爲每個構建LocalTarget文件名? – matagus

+0

@matagus LocalTarget目錄名稱和路徑基於日期時間參數。每個任務只需從文件(csv和pandas)中讀取。做X操作並推回去,最後一個任務會推送到數據庫(不使用luigi,而是使用熊貓)。 – HackToHell

+0

luigi是否使用輸出文件夾(ifexists)來安排任務? – HackToHell

回答

6

首先評論:Luigi任務是冪等的。如果您運行具有相同參數值的任務,無論您運行多少次,它都必須始終返回相同的輸出。因此,不止一次運行它是沒有意義的。這使得Luigi變得強大:如果你有一項大任務使得很多事情花費很多時間,並且在某個地方失敗了,那麼你必須從頭開始重新運行它。如果將它分成更小的任務,運行它並失敗,則只需運行管道中的其餘任務。

當您運行任務時,Luigi會檢查該任務的輸出以確定它們是否存在。如果他們不這樣做,Luigi會檢查它所依賴的任務的輸出。如果它們存在,那麼它將只運行當前任務並生成輸出Target。如果依賴關係輸出不存在,那麼它將運行該任務。

所以,如果你想重新運行一個任務,你必須刪除它的Target輸出。如果你想重新運行整個管道,你必須刪除所有任務依賴級聯的所有任務的輸出。

Luigi存儲庫中有一個ongoing discussion in this issue。看一看this comment,因爲它會指向一些腳本,用於獲取給定任務的輸出目標並將其刪除。

+0

啊哈,它會讀取目標上的鏈條,所以我將不得不沿着鏈條移除輸出,以便正確安排它。 – HackToHell

+0

而這個問題正是我所期待的,謝謝:) – HackToHell

+0

@matagus雖然我有更新最新數據文件的要求。我不想用時間戳生成文件,而是使用最新的後綴「foo_latest.txt」生成它。那麼luigi開發者能幫我解決這個問題嗎?我認爲需要將'dont_filter = False'標誌設置爲用於多次重新運行任務的luigi.Task init參數。 –