在 Batch 計算節點上的作業準備和解除工作

Azure Batch 作業在執行其工作之前,通常需要經過設定,並需要在其工作完成時進行後置作業維修。 舉例來說,您可能需要將常見的工作輸入資料下載到計算節點,或在作業完成後,將工作輸出資料上傳至 Azure 儲存體。 您可以使用作業準備作業解除工作來執行這些操作。

  • 在作業工作之前,會在排定執行至少一個工作的所有計算節點上執行作業準備工作。
  • 作業一旦完成,作業解除工作會在集區中的每個節點上執行,集區會執行一項作業準備工作。

如同其他 Batch 工作,您可以指定要在作業準備或解除工作執行時叫用的命令列。 作業準備和解除工作提供熟悉的 Batch 工作功能,例如:

  • 資源檔案下載
  • 提高權限的執行。
  • 自訂環境變數。
  • 最長執行持續時間。
  • 重試次數。
  • 檔案保留時間。

本文將示範如何使用 Batch .NET 程式庫中的 JobPreparationTaskJobReleaseTask 類別。

提示

作業準備和解除工作在「共用集區」環境中特別有用;在這種環境中,計算節點的集區會在作業執行之間保存,並由許多作業使用。

作業準備和解除工作的使用案例

作業準備和作業解除工作適用於下列情況:

  • 下載常見的工作資料。 批次工作通常需要一組常用的資料作為作業工作的輸入。 您可以在作業的其他工作執行之前使用作業準備工作,將此資料下載到每個節點。

    例如,在每日風險分析計算中,市場資料是作業專屬的,也是作業中所有工作通用的。 您可以使用作業準備工作,將此市場資料 (通常是數 GB 的大小) 下載至每個計算節點,讓節點上執行的任何工作都可以使用這些資料。

  • 刪除作業和工作輸出。 在共用集區環境中,作業之間的集區計算節點並未解除委任,因此您可能需要刪除執行之間的作業資料。 例如,您可能需要保留節點上的磁碟空間,或符合組織的安全性原則。 您可以使用作業解除工作,刪除作業準備工作所下載的資料或在工作執行產生的資料。

  • 保留記錄。 您可能想要保留一份工作產生的記錄檔,或失敗應用程式所產生的損毀傾印檔案。 您可以使用作業解除工作,將此資料壓縮並上傳至 Azure 儲存體帳戶

作業準備工作

執行作業的工作之前,Batch 會在每個已排定執行工作的計算節點上執行作業準備工作。 根據預設,Batch 會等待作業準備工作完成後,才執行已排定的作業工作,但您可以將其設為不等待。

如果節點重新啟動,作業準備工作會再次執行,但您也可以停用此行為。 如果作業具有作業準備工作和作業管理員工作,則作業準備工作會在作業管理員工作之前和所有其他工作之前執行。 一律先執行作業準備工作。

作業準備工作只會在排定執行工作的節點上執行。 此行為可防止在未指派任何工作的節點上發生不必要的執行。 當作業工作數目小於集區中節點數目時,則可能不會向節點指派任何工作。 此外,此行為也適用於已啟用並行工作執行的情況,而如果作業計數小於可能的並行工作總數,則會讓一些節點閒置。

注意

JobPreparationTask 不同於 CloudPool.StartTaskJobPreparationTask 會在每個作業開始時執行,而 StartTask 只在計算節點第一次加入集區或重新開機時才執行。

作業解除工作

將作業標示為已完成之後,作業解除工作會在執行作業準備工作的集區中於每個節點上執行。 透過發出終止要求將工作標示為完成。 此要求會將作業狀態設定為正在終止,終止與作業相關聯的任何作用中或執行中工作,並執行作業解除工作。 作業接著會進入「已完成」狀態。

注意

若將工作刪除,系統也會執行作業解除工作。 不過,如果先前已終止作業,當後來刪除該作業時,解除工作不會執行第二次。

作業解除工作最多可執行 15 分鐘,之後就會由 Batch 服務終止。 如需詳細資訊,請參閱 REST API 參考文件

使用 Batch .NET 進行作業準備和解除工作

若要執行作業準備工作,請將 JobPreparationTask 物件指派給作業的 CloudJob.JobPreparationTask 屬性。 同樣地,若要使用作業解除工作,請初始化 JobReleaseTask,並將其指派給作業的 CloudJob.JobReleaseTask

在下列程式碼片段中,myBatchClientBatchClient 的執行個體,myPool 是 Batch 帳戶內的現有集區。

// Create the CloudJob for CloudPool "myPool"
CloudJob myJob =
    myBatchClient.JobOperations.CreateJob(
        "JobPrepReleaseSampleJob",
        new PoolInformation() { PoolId = "myPool" });

// Specify the command lines for the job preparation and release tasks
string jobPrepCmdLine =
    "cmd /c echo %AZ_BATCH_NODE_ID% > %AZ_BATCH_NODE_SHARED_DIR%\\shared_file.txt";
string jobReleaseCmdLine =
    "cmd /c del %AZ_BATCH_NODE_SHARED_DIR%\\shared_file.txt";

// Assign the job preparation task to the job
myJob.JobPreparationTask =
    new JobPreparationTask { CommandLine = jobPrepCmdLine };

// Assign the job release task to the job
myJob.JobReleaseTask =
    new JobReleaseTask { CommandLine = jobReleaseCmdLine };

await myJob.CommitAsync();

作業解除工作會在作業終止或刪除時執行。 您可以使用 JobOperations.TerminateJobAsync 終止作業,並使用 JobOperations.DeleteJobAsync 刪除作業。 您通常會在作業的工作完成時或達到定義之逾時時終止或刪除作業。

// Terminate the job to mark it as completed. Terminate initiates the
// job release task on any node that ran job tasks. Note that the
// job release task also runs when a job is deleted, so you don't
// have to call Terminate if you delete jobs after task completion.

await myBatchClient.JobOperations.TerminateJobAsync("JobPrepReleaseSampleJob");

GitHub 上的程式碼範例

若要了解作業準備和解除工作的運作方式,請建置並執行 GitHub 上的 JobPrepRelease 範例專案。 此主控台應用程式會採取以下動作:

  1. 建立包含兩個節點的集區。
  2. 建立具有作業準備、解除和標準工作的作業。
  3. 執行作業準備工作,將節點識別碼第一次寫入節點的「共用」目錄的文字檔中。
  4. 在每個節點上執行工作,將其工作識別碼寫入同一文字檔案中。
  5. 一旦完成所有工作或達到逾時,會列印每個節點的文字檔案的內容到主控台。
  6. 在作業完成時,執行作業解除工作會將該檔案從節點中刪除。
  7. 列印每個節點上執行的作業準備和解除工作的結束代碼。
  8. 暫停執行以允許確認刪除作業和/或集區。

範例應用程式的輸出類似下列範例:

Attempting to create pool: JobPrepReleaseSamplePool
Created pool JobPrepReleaseSamplePool with 2 nodes
Checking for existing job JobPrepReleaseSampleJob...
Job JobPrepReleaseSampleJob not found, creating...
Submitting tasks and awaiting completion...
All tasks completed.

Contents of shared\job_prep_and_release.txt on tvm-2434664350_1-20160623t173951z:
-------------------------------------------
tvm-2434664350_1-20160623t173951z tasks:
  task001
  task004
  task005
  task006

Contents of shared\job_prep_and_release.txt on tvm-2434664350_2-20160623t173951z:
-------------------------------------------
tvm-2434664350_2-20160623t173951z tasks:
  task008
  task002
  task003
  task007

Waiting for job JobPrepReleaseSampleJob to reach state Completed
...

tvm-2434664350_1-20160623t173951z:
  Prep task exit code:    0
  Release task exit code: 0

tvm-2434664350_2-20160623t173951z:
  Prep task exit code:    0
  Release task exit code: 0

Delete job? [yes] no
yes
Delete pool? [yes] no
yes

Sample complete, hit ENTER to exit...

注意

因為新集區中節點的建立和啟動時間並不一樣 (意味著某些節點比其他節點還早做好工作準備),您可能會看到不同的輸出。 具體而言,因為工作會快速完成,集區的某個節點可能會執行作業的所有工作。 如果發生這種情況,則對於未執行任何工作的節點,作業準備和解除工作並不存在。

在 Azure 入口網站中檢視作業準備和解除工作

您可以使用 Azure 入口網站來檢視 Batch 作業屬性和工作,包括作業準備和解除工作。 從 Batch 帳戶頁面中,從左側導覽中選取 [作業],然後選取作業。 如果您執行範例應用程式,請在工作完成之後,但在刪除作業和集區之前瀏覽至作業頁面。

您可以在作業 [概觀] 或 [工作] 頁面上展開 [約略的工作計數],以監視作業進度和狀態。

Screenshot showing job task progress in the Azure portal.

下列螢幕擷取畫面顯示範例應用程式執行後的 JobPrepReleaseSampleJob 頁面。 此作業有準備和解除工作,因此您可以在左側導覽中選取 [準備工作] 或 [解除工作] 以查看其屬性。

Screenshot showing job release task properties in the Azure portal.

下一步