新增、排程或執行 Azure Batch 作業和工作時,可能會發生各種錯誤。 可以直接偵測新增作業和工作時發生的錯誤。 API、命令列或使用者介面通常會立即傳回任何失敗。 本文涵蓋在提交作業和工作之後可能發生的錯誤,以及如何檢查和處理這些錯誤。
作業失敗
作業是指一或多個工作的群組,這些工作指定了要執行的命令行。 新增作業時,可以指定下列選擇性參數。 這些參數會影響作業失敗的方式。
JobConstraints。 可以選擇性使用
maxWallClockTime屬性,以設定作業在作用中或執行中的時間上限。 如果作業超過maxWallClockTime,作業就會終止,且terminateReason中的屬性MaxWallClockTimeExpiry將被設定為。JobPreparationTask。 可以選擇性地一個作業準備工作,讓其在排程執行作業工作的每個計算節點上執行。 節點會在首次執行作業的工作之前執行作業準備工作。 如果作業準備工作失敗,則工作不會執行,且作業也不會完成。
JobReleaseTask。 選擇性地為具有作業準備工作的作業指定作業釋放工作。 當作業終止時,作業釋放工作會在執行作業準備工作的每個集區節點上執行。 如果作業釋放工作失敗,則作業仍會移至
completed狀態。
在 Azure 入口網站中,您可以在批次 [新增作業] 畫面的 [作業管理員]、[準備和釋放工作] 和 [進階] 區段中設定這些參數。
作業屬性
檢查 JobExecutionInformation 中的下列作業屬性是否存在錯誤:
terminateReason屬性指示MaxWallClockTimeExpiry作業是否超出作業條件約束中指定的maxWallClockTime,因此作業已終止。 如果作業的taskFailed屬性設定為onTaskFailure,則此屬性也可設為performExitOptionsJobAction,並且如果具有退出條件約束指定jobAction的terminatejob,則工作會失敗。如果發生排程錯誤,則會設定 JobSchedulingError 屬性。
作業準備工作
當節點第一次執行作業的工作時,作業準備工作的執行個體會在每個計算節點上執行。 您可以將作業準備工作視為工作範本,其中可執行多個執行個體,數目最多可與集區中的節點數目一樣。 檢查作業準備工作執行個體,確認是否存在錯誤。
您可以使用 Job - List Preparation and Release Task Status API,列出指定作業的所有作業準備和釋放工作執行個體的執行狀態。 如同其他工作,JobPreparationTaskExecutionInformation 具有 failureInfo、exitCode 和 result 等屬性。
當作業準備工作執行時,觸發作業準備工作的工作會移至 的 preparing。 如果作業準備工作失敗,則觸發工作會還原為 active 狀態,並且不會執行。
如果作業準備工作失敗,則觸發作業工作不會執行。 作業未完成且停滯不前。 如果沒有包含可排程工作的其他作業,則集區可能會閒置。
作業釋放工作
在執行作業準備工作的每個節點上,當作業終止時,則作業釋放工作執行個體會執行。 檢查作業釋放工作執行個體,確認是否存在錯誤。
您可以使用 Job - List Preparation and Release Task Status API,列出指定作業的所有作業準備和釋放工作執行個體的執行狀態。 如同其他工作,JobReleaseTaskExecutionInformation 具有 failureInfo、exitCode 和 result 等屬性。
如果一或多個作業釋放工作失敗,則作業仍會終止,並移至 completed 狀態。
工作失敗
作業工作可能會因為以下原因而失敗:
- 工作命令列失敗,並傳回非零的結束代碼。
- 為工作指定的一或多個
resourceFiles未下載。 - 為工作指定的一或多個
outputFiles未上傳。 - 工作的已耗用時間超過
maxWallClockTime中指定的屬性 。
在所有情況下,檢查下列屬性是否有錯誤,並查看錯誤的相關資訊:
TaskExecutionInformation 屬性包含多個可提供錯誤相關資訊的屬性。 taskExecutionResult 會指出工作失敗的原因,而
exitCode和failureInfo提供有關失敗的詳細資訊。無論工作成功或失敗,工作一律會移至
completedTaskState。
考慮工作失敗對作業以及任何工作相依性的影響。 您可以指定 ExitConditions 來設定相依性和作業設定動作。
- DependencyAction 控制是要封鎖或執行相依於失敗工作的工作。
- JobAction 控制失敗的工作是否會導致作業停用、終止或保持不變。
工作命令列
工作命令列不會在計算節點上的殼層下執行,因此其無法以原生方式利用殼層功能,例如環境變數擴充。 若要利用此類功能,您必須在命令列中叫用殼層。 如需詳細資訊,請參閱環境變數的命令列擴充功能。
工作命令行輸出會寫入 stderr.txt 和 stdout.txt 檔案。 應用程式還可能會寫入應用程式專屬的記錄檔。 請務必為應用程式實行全面的錯誤檢查,以便即時偵測並診斷問題。
工作記錄
如果執行工作的集區節點仍然存在,則可以取得並檢視工作記錄檔。 數個 API 允許列出和取得工作檔案,例如 File - Get From Task。 您也可以使用 Azure 入口網站列出和檢視工作或節點的記錄檔。
在節點的 [概觀] 頁面頂端,選取 [上傳批次記錄]。
在 [上傳 Batch 記錄] 頁面上,選取 [選擇儲存體容器],選取要上傳至的 Azure 儲存體容器,然後選取 [開始上傳]。
您可以從儲存體容器頁面檢視、開啟或下載記錄。
輸出檔案
由於 Batch 集區和集區節點通常是暫時性節點,因此在持續新增和刪除節點的情況下,最好在作業執行時儲存記錄檔。 工作輸出檔案是將記錄檔儲存至 Azure 儲存體的簡便方式。 如需詳細資訊,請參閱使用 Batch 服務 API 將工作資料保存到 Azure 儲存體。
每次上傳檔案時,Batch 都會將 fileuploadout.txt 和 fileuploaderr.txt 兩個記錄檔寫入計算節點中。 若要進一步了解特定錯誤,您可以檢查這些記錄檔。 如果從未嘗試上傳檔案 (例如因為工作本身無法執行),則這些記錄檔不會存在。
下一步
- 深入了解 Batch 作業和工作,以及作業準備和釋放工作。
- 了解 Batch 集區和節點錯誤。