建立工作相依性,以便執行相依於其他工作的工作
您可以利用 Batch 工作相依性,建立排定於一或多項父系工作完成後,才在計算節點上執行的工作。 例如,您可以建立一個將 3D 電影的每個影格以個別、平行工作轉譯的工作。 在成功轉譯所有影格之後,最終工作會將轉譯的影格合併為一部完整的電影。 換句話說,最終工作相依於先前的父系工作。
一些實用的工作相依性案例包括︰
- 雲端中的 MapReduce 樣式工作負載。
- 資料處理工作可表示為有向非循環圖 (DAG) 的工作。
- 轉譯前和轉譯後程序,其中的每項工作必須在下一項工作開始前完成。
- 下游工作相依於上游工作輸出的任何其他工作。
根據預設,相依工作會排定只會在父系工作順利完成之後執行。 您可以選擇是否指定相依性動作,以覆寫預設行為,並在父系工作失敗時執行相依工作。
在此文章中,我們將討論如何使用 Batch .NET 程式庫來設定工作相依性。 我們會先告訴您如何對作業啟用工作相依性,然後再示範如何設定工作的相依性。 我們也說明如何指定相依性動作,以便在父系失敗時執行相依工作。 最後,我們將討論 Batch 支援的 相依性案例 。
啟用工作相依性
若要在 Batch 應用程式中使用工作相依性,您必須先將作業設定成使用工作相依性。 在 Batch .NET 中,在 CloudJob 上,藉由將其 UsesTaskDependencies 屬性設定為 true
加以啟用:
CloudJob unboundJob = batchClient.JobOperations.CreateJob( "job001",
new PoolInformation { PoolId = "pool001" });
// IMPORTANT: This is REQUIRED for using task dependencies.
unboundJob.UsesTaskDependencies = true;
在上述程式碼片段中,"batchClient" 是 BatchClient 類別的執行個體。
建立相依的工作
若要建立相依於一或多個父系工作完成的工作,您可以指定此工作「相依於」其他工作。 在 Batch .NET 中,使用 TaskDependencies 類別的執行個體來設定 CloudTask.DependsOn 屬性:
// Task 'Flowers' depends on completion of both 'Rain' and 'Sun'
// before it is run.
new CloudTask("Flowers", "cmd.exe /c echo Flowers")
{
DependsOn = TaskDependencies.OnIds("Rain", "Sun")
},
此程式碼片段會使用工作識別碼 "Flowers" 建立相依工作。 "Flowers" 工作相依於 "Rain" 和 "Sun" 工作。 "Flowers" 工作將排定為只會在 "Rain" 和 "Sun" 工作順利完成後,才於計算節點上執行。
注意
根據預設,當工作處於已完成狀態且其結束代碼是 0
時,才會將其視為已順利完成。 在 Batch .NET 中,這表示 CloudTask.State 屬性值為 Completed
,而 CloudTask 的 TaskExecutionInformation.ExitCode 屬性值為 0
。 若要深入了解變更方式,請參閱相依性動作一節。
相依性案例
Azure Batch 中可使用的基本工作相依性案例有三種︰一對一、一對多、工作識別碼範圍相依性。 結合這三種案例即可提供第四種案例:多對多。
狀況 | 範例 | 範例說明 |
---|---|---|
一對一 | taskB 取決於 taskA taskB,在 taskA 成功完成之前,將不會排程執行 taskB |
|
一對多 | taskC 取決於 taskA 和 taskB taskC 不會排程執行,直到 taskA 和 taskB 都成功完成為止 |
|
工作識別碼範圍 | taskD 取決於工作範圍 ,除非標識符為 1 到 10 的工作順利完成,否則工作不會排程執行 |
提示
您可以建立多對多關聯性,例如工作 C、D、E 和 F 均相依於工作 A 和 B。舉例來說,在下游工作相依於多個上游工作輸出的平行前置處理案例中,這種關聯性就很有用。
在本節的範例中,相依工作只會在父系工作順利完成之後才執行。 這種行為是相依工作的預設行為。 指定相依性動作來覆寫預設行為,即可在父系工作失敗時執行相依工作。
一對一
在一對一關聯性中,工作相依於一項父系工作的成功完成。 若要建立相依性,請在填入 CloudTask.DependsOn 屬性時,將單一工作識別碼提供給 TaskDependencies.OnId 靜態方法。
// Task 'taskA' doesn't depend on any other tasks
new CloudTask("taskA", "cmd.exe /c echo taskA"),
// Task 'taskB' depends on completion of task 'taskA'
new CloudTask("taskB", "cmd.exe /c echo taskB")
{
DependsOn = TaskDependencies.OnId("taskA")
},
一對多
在一對多關聯性中,工作相依於多項父工作的完成。 若要建立相依性,請在填入 CloudTask.DependsOn 屬性時,將特定工作識別碼集合提供給 TaskDependencies.OnIds 靜態方法。
// 'Rain' and 'Sun' don't depend on any other tasks
new CloudTask("Rain", "cmd.exe /c echo Rain"),
new CloudTask("Sun", "cmd.exe /c echo Sun"),
// Task 'Flowers' depends on completion of both 'Rain' and 'Sun'
// before it is run.
new CloudTask("Flowers", "cmd.exe /c echo Flowers")
{
DependsOn = TaskDependencies.OnIds("Rain", "Sun")
},
重要
如果父系工作識別碼的合併長度大於 64000 個字元,則將無法建立相依工作。 若要指定大量的父系工作,請考慮改用工作識別碼範圍。
工作識別碼範圍
在父系工作範圍的相依性中,工作相依於識別碼落在指定範圍內的工作完成。
若要建立相依性,請在填入 CloudTask.DependsOn 屬性時,將範圍中第一個和最後一個工作識別碼提供給 TaskDependencies.OnIdRange 靜態方法。
重要
在使用相依性的工作識別碼範圍時,範圍中只會選出識別碼代表的是整數值的工作。 例如,範圍 1..10
會選出工作 3
和 7
,而非 5flamingoes
。
在評估範圍相依性時,前置的零並不具有任何意義,所以字串識別碼為 4
、04
及 004
的工作都會落在範圍「之內」,因為都被視為工作 4
,因此第一項完成的工作將能滿足相依性。
對於要執行的相依工作,範圍中的每項工作必須藉由下列方式來符合相依性:順利完成,或完成但對應至相依性動作的錯誤設定為 [符合]。
// Tasks 1, 2, and 3 don't depend on any other tasks. Because
// we will be using them for a task range dependency, we must
// specify string representations of integers as their ids.
new CloudTask("1", "cmd.exe /c echo 1"),
new CloudTask("2", "cmd.exe /c echo 2"),
new CloudTask("3", "cmd.exe /c echo 3"),
// Task 4 depends on a range of tasks, 1 through 3
new CloudTask("4", "cmd.exe /c echo 4")
{
// To use a range of tasks, their ids must be integer values.
// Note that we pass integers as parameters to TaskIdRange,
// but their ids (above) are string representations of the ids.
DependsOn = TaskDependencies.OnIdRange(1, 3)
},
相依性動作
根據預設,只有在父系工作順利完成後,才會執行一項工作或一組工作。 在某些情況下,即使父系工作失敗,您也想要執行相依工作。 您可以藉由指定相依性動作來覆寫預設行為,以指出相依工作是否符合執行資格。
例如,假設相依工作正在等候上游工作完成的資料。 如果上游工作失敗,相依工作仍然可以使用較舊的資料來執行。 在此情況下,儘管父系工作失敗,相依性動作仍可指定相依工作是否有資格執行。
相依性動作是以父系工作的結束情況為基礎。 您可以針對下列任一個結束條件指定相依性動作:
- 發生前置處理錯誤時。
- 發生檔案上傳錯誤時。 如果工作結束時的結束代碼是透過 exitCodes 或 exitCodeRanges 所指定,又發生檔案上傳錯誤,則優先執行結束代碼指定的動作。
- 工作結束時的結束代碼是由 ExitCodes 屬性所定義。
- 工作結束時的結束代碼落在 ExitCodeRanges 屬性所指定的範圍內。
- 預設的情況是,如果工作結束時的結束代碼不是由 ExitCodes 或 ExitCodeRanges 所定義,或如果工作結束時發生前置處理錯誤且未設定 PreProcessingError 屬性,或如果工作失敗並發生檔案上傳錯誤且未設定 FileUploadError 屬性。
針對 .NET,這些條件會定義為 ExitConditions 類別的屬性。
若要指定相依性動作,請針對下列其中一項的結束條件設定 ExitOptions.DependencyAction 屬性:
- 符合:表示如果父系工作結束時出現指定的錯誤,相依工作就有資格執行。
- 封鎖:表示相依工作沒有資格執行。
結束代碼 0 的DependencyAction 屬性預設設定為 [符合],而所有其他結束情況的預設設定則為 [封鎖]。
下列程式碼片段可設定父系工作的 DependencyAction 屬性。 如果父系工作結束時發生前置處理錯誤,或出現指定的錯誤碼,則會封鎖相依工作。 如果父系工作結束時出現任何其他非零的錯誤,相依工作就有資格執行。
// Task A is the parent task.
new CloudTask("A", "cmd.exe /c echo A")
{
// Specify exit conditions for task A and their dependency actions.
ExitConditions = new ExitConditions
{
// If task A exits with a pre-processing error, block any downstream tasks (in this example, task B).
PreProcessingError = new ExitOptions
{
DependencyAction = DependencyAction.Block
},
// If task A exits with the specified error codes, block any downstream tasks (in this example, task B).
ExitCodes = new List<ExitCodeMapping>
{
new ExitCodeMapping(10, new ExitOptions() { DependencyAction = DependencyAction.Block }),
new ExitCodeMapping(20, new ExitOptions() { DependencyAction = DependencyAction.Block })
},
// If task A succeeds or fails with any other error, any downstream tasks become eligible to run
// (in this example, task B).
Default = new ExitOptions
{
DependencyAction = DependencyAction.Satisfy
}
}
},
// Task B depends on task A. Whether it becomes eligible to run depends on how task A exits.
new CloudTask("B", "cmd.exe /c echo B")
{
DependsOn = TaskDependencies.OnId("A")
},
程式碼範例
GitHub 上的 TaskDependencies 範例專案示範:
- 如何啟用作業的工作相依性。
- 如何建立相依於其他工作的工作。
- 如何在運算節點集區上執行這些工作。
下一步
- 了解 Batch 的應用程式封裝功能,此功能可讓您輕鬆部署您的工作在計算節點上執行的應用程式並設定其版本。
- 了解作業和工作的錯誤檢查。