Batch 計算節點上的作業準備與發行工作

Azure 批次作業通常需要在執行任務前先設定,完成後則需進行維護。 例如,你可能需要在工作完成後,將常見的任務輸入資料下載到運算節點,或是將任務輸出資料上傳到 Azure 儲存裝置。 你可以使用 工作準備工作釋放 任務來執行這些操作。

  • 工作準備任務將在所有排定執行至少一個任務的運算節點上,先於工作任務執行。
  • 作業發行工作會在作業完成後執行,並在集區中每一個曾執行作業準備工作的節點上各執行一次。

跟其他批次任務一樣,您可以指定一個命令列,在作業準備或釋放任務執行時呼叫。 工作準備與發布任務提供熟悉的批次任務功能,例如:

  • 資源檔案下載
  • 執行力提升。
  • 自訂環境變數。
  • 最大執行時間。
  • 重試次數。
  • 檔案保留時間。

本文說明如何在 Batch .NET 函式庫中使用 JobPreparationTaskJobReleaseTask 類別。

小提示

工作準備與發布任務在 共享池 環境中特別有用,因為在這些運算池中,計算節點池會在工作執行間持續存在,並被多個工作使用。

作業準備與發行工作的使用案例

工作準備與職務釋放任務適合以下情境:

  • 下載常見任務資料。 批次作業通常需要一組共同的資料作為作業任務的輸入。 你可以使用工作準備任務,在執行該工作其他任務前,先將這些資料下載到每個節點。

    例如,在每日風險分析計算中,市場數據雖針對特定職務,但對所有工作任務皆有共通性。 你可以使用工作準備任務,將這些通常有數GB大小的市場資料下載到每個運算節點,讓任何在該節點上執行的任務都能使用。

  • 刪除工作和任務輸出。 在共用集區環境中,當集區的計算節點不會在作業之間解除配置時,您可能需要在每次執行之間刪除作業資料。 例如,你可能需要節省節點的磁碟空間,或符合組織的安全政策。 你可以使用工作釋放任務來刪除工作準備任務下載的資料,或該任務執行產生的資料。

  • 保留記錄。 您可能會想保留工作所產生的記錄檔,或是失敗的應用程式所產生的當機傾印檔。 你可以使用工作釋放任務來壓縮並上傳這些資料到 Azure Storage 帳號

工作準備任務

在執行工作任務之前,批次會先對每個排程執行任務的計算節點執行工作準備任務。 預設情況下,批次會等待工作準備任務完成後再執行排程工作任務,但你可以設定它不等待。

如果節點重新啟動,工作準備任務會再次執行,但你也可以停用這個行為。 如果你有一個工作包含工作準備任務和工作管理員任務,工作準備任務會先於工作管理員任務,且在所有其他任務之前執行。 作業準備工作一律最先執行。

工作準備任務僅在被排程執行任務的節點上執行。 這種行為可防止在未被指派任務的節點上進行不必要的執行。 當工作任務數量少於池中節點數量時,節點可能不會被指派任何任務。 當啟用 並行任務執行 時,當任務數量低於可能的並行任務總數時,這種行為同樣適用,導致部分節點處於閒置狀態。

備註

JobPreparationTask 與 CloudPool.StartTask 的不同之處在於JobPreparationTask 會在每個工作開始時執行,而只有StartTask在運算節點首次加入池或重新啟動時才會執行。

作業發行工作

一旦您將作業標示為已完成,作業發行工作就會在集區中每一個曾執行作業準備工作的節點上執行。 你透過發出終止申請來標記工作已完成。 此請求將工作狀態設為 終止,終止與工作相關的任何活躍或執行任務,並執行工作釋放任務。 工作接著會進入 完成 狀態。

備註

刪除作業也會執行作業發行工作。 然而,如果作業已經終止,之後再刪除該作業時,發行工作不會再次執行。

作業發行工作最長可執行 15 分鐘,超過後將由 Batch 服務加以終止。 欲了解更多資訊,請參閱 REST API 參考文件

使用 Batch .NET 的工作準備與發布任務

要執行工作準備任務,請將 JobPreparationTask 物件指派到你的工作 CloudJob.JobPreparationTask 屬性中。 同樣地,要使用工作釋放任務,請初始化 JobReleaseTask ,並將其指派到你工作的 CloudJob.JobReleaseTask

以下程式碼片段中, myBatchClientBatchClient 的實例,且 myPool 是批次帳號內的一個現有池。

// 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. 執行工作準備任務,先將節點 ID 寫入節點 共享 目錄中的文字檔。
  4. 在每個將任務 ID 寫入相同文字檔的節點執行任務。
  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 入口 網站查看批次工作屬性和任務,包括工作準備和發布任務。 在您的批次帳戶頁面中,從左側導覽選取工作,然後選擇一個職位。 如果您執行範例應用程式,請在工作完成後、但在刪除作業與集區之前,前往作業頁面。

你可以透過在工作總覽任務頁面展開「近似任務數量」來監控工作進度與狀態。

顯示 Azure 入口網站中工作任務進度的截圖。

以下截圖顯示範例應用程式執行後的 JobPrepReleaseSampleJob 頁面。 這個工作有準備和釋放任務,你可以在左側導覽中選擇 準備任務釋放任務 來查看它們的屬性。

顯示 Azure 入口網站中工作發布任務屬性的截圖。

後續步驟