Úlohy přípravy a vydávání úloh na výpočetních uzlech Služby Batch

Úloha Azure Batch často vyžaduje nastavení před spuštěním svých úkolů a údržbu po dokončení úloh. Po dokončení úlohy můžete například potřebovat stáhnout běžná vstupní data úkolů do výpočetních uzlů nebo nahrát výstupní data úkolů do služby Azure Storage. Pro tyto operace můžete použít úlohy přípravy úloh a úlohy uvolnění .

  • Úkol přípravy úlohy běží před úkoly úlohy na všech výpočetních uzlech naplánovaných tak, aby spustil alespoň jeden úkol.
  • Úloha uvolnění úlohy se spustí po dokončení úlohy na každém uzlu ve fondu, na kterém se spustila úloha přípravy úlohy.

Stejně jako u jiných úloh služby Batch můžete zadat příkazový řádek, který se má vyvolat při spuštění úlohy přípravy nebo vydání úlohy. Úlohy přípravy a vydávání úloh nabízejí známé funkce úloh služby Batch, jako jsou:

  • Stažení souboru prostředku.
  • Provádění se zvýšenými oprávněními.
  • Vlastní proměnné prostředí.
  • Maximální doba provádění.
  • Počet opakování.
  • Doba uchovávání souborů.

Tento článek ukazuje, jak používat třídy JobPreparationTask a JobReleaseTask v knihovně Batch .NET .

Tip

Úlohy přípravy a vydávání úloh jsou užitečné zejména v prostředích sdíleného fondu , ve kterých mezi spuštěními úloh přetrvává fond výpočetních uzlů a používá ho mnoho úloh.

Případy použití pro úlohy přípravy a uvolnění úloh

Úlohy přípravy a uvolnění úloh jsou vhodné pro následující scénáře:

  • Stáhněte si běžná data úkolů. Dávkové úlohy často vyžadují společnou sadu dat jako vstup pro úkoly úlohy. Úlohu přípravy úlohy můžete použít ke stažení těchto dat do každého uzlu před provedením dalších úkolů úlohy.

    Například ve výpočtech denní analýzy rizik jsou data o trhu specifická pro úlohu, ale společná pro všechny úkoly v úloze. Úlohu přípravy úlohy můžete použít ke stažení těchto dat o trhu, která mají často velikost několika gigabajtů, do každého výpočetního uzlu, aby je mohly používat všechny úlohy spuštěné na uzlu.

  • Odstranit úlohu a výstup úkolu. V prostředí sdíleného fondu, kde se výpočetní uzly fondu nevyřadí z provozu mezi úlohami, může být potřeba odstranit data úloh mezi spuštěními. Můžete například potřebovat šetřit místo na disku na uzlech nebo vyhovět zásadám zabezpečení vaší organizace. Úlohu uvolnění úlohy můžete použít k odstranění dat, která stáhl úkol přípravy úlohy nebo který se vygeneroval.

  • Zachovejte protokoly. Můžete si nechat kopii souborů protokolu, které vygenerují vaše úkoly, nebo soubory výpisu stavu systému, které aplikace generují. Pomocí úlohy uvolnění úlohy můžete tato data zkomprimovat a nahrát do účtu Služby Azure Storage.

Úkol přípravy úlohy

Před spuštěním úloh služba Batch spustí úlohu přípravy úlohy na každém výpočetním uzlu naplánovaném ke spuštění úlohy. Služba Batch ve výchozím nastavení čeká na dokončení úkolu přípravy úlohy před spuštěním naplánovaných úloh, ale můžete ji nakonfigurovat tak, aby nečekal.

Pokud se uzel restartuje, úloha přípravy úlohy se znovu spustí, ale toto chování můžete také zakázat. Pokud máte úlohu s přípravným úkolem úlohy a úlohou správce úloh, spustí se úkol přípravy úlohy před úkolem správce úloh a před všemi ostatními úkoly. Úloha přípravy úlohy se vždy spustí jako první.

Úloha přípravy úlohy se spouští pouze na uzlech, na kterých je naplánováno spuštění úlohy. Toto chování zabraňuje zbytečným spuštěním na uzlech, kterým nejsou přiřazeny žádné úkoly. Uzlům nemusí být přiřazeny žádné úkoly, pokud je počet úkolů úloh menší než počet uzlů ve fondu. Toto chování platí také v případě, že je povolené souběžné provádění úkolů , což některé uzly ponechá v nečinnosti, pokud je počet úloh nižší než celkový počet možných souběžných úloh.

Poznámka

JobPreparationTask se liší od CloudPool.StartTask v tom, že JobPreparationTask se spustí na začátku každé úlohy, zatímco StartTask se spustí pouze při prvním připojení výpočetního uzlu k fondu nebo restartování.

Úloha uvolnění úlohy

Jakmile označíte úlohu jako dokončenou, úloha uvolnění úlohy se spustí na každém uzlu ve fondu, na kterém se spustil úkol přípravy úlohy. Úlohu označíte jako dokončenou odesláním žádosti o ukončení. Tento požadavek nastaví stav úlohy na ukončení, ukončí všechny aktivní nebo spuštěné úlohy přidružené k úloze a spustí úlohu uvolnění úlohy. Úloha se pak přesune do stavu dokončeno .

Poznámka

Odstranění úlohy také spustí úlohu uvolnění úlohy. Pokud je však úloha již ukončena, úloha vydané verze se nespustí podruhé, pokud je později odstraněna.

Úlohy uvolnění úloh můžou běžet maximálně 15 minut, než je služba Batch ukončí. Další informace najdete v referenční dokumentaci k rozhraní REST API.

Úlohy přípravy a vydání úloh se službou Batch .NET

Pokud chcete spustit úlohu přípravy úlohy, přiřaďte objekt JobPreparationTask vlastnosti CloudJob.JobPreparationTask vaší úlohy. Podobně platí, že pokud chcete použít úlohu uvolnění úlohy, inicializujte jobReleaseTask a přiřaďte ho ke své úloze CloudJob.JobReleaseTask.

V následujícím fragmentu kódu myBatchClient je instance BatchClient a myPool je existujícím fondem v rámci účtu 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();

Úloha uvolnění úlohy se spustí při ukončení nebo odstranění úlohy. Ukončíte úlohu pomocí JobOperations.TerminateJobAsync a odstraníte úlohu pomocí JobOperations.DeleteJobAsync. Úlohu obvykle ukončíte nebo odstraníte při dokončení jejích úkolů nebo při dosažení vámi definovaného časového limitu.

// 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");

Ukázka kódu na GitHubu

Pokud chcete zobrazit úkoly přípravy a vydávání úloh v akci, sestavte a spusťte ukázkový projekt JobPrepRelease z GitHubu. Tato konzolová aplikace provede následující akce:

  1. Vytvoří fond se dvěma uzly.
  2. Vytvoří úlohu s přípravou, uvolněním a standardními úlohami.
  3. Spustí úlohu přípravy úlohy, která nejprve zapíše ID uzlu do textového souboru ve sdíleném adresáři uzlu.
  4. Spustí úlohu na každém uzlu, který zapíše ID úkolu do stejného textového souboru.
  5. Po dokončení všech úkolů nebo dosažení časového limitu vytiskne obsah textového souboru jednotlivých uzlů do konzoly.
  6. Spustí úlohu uvolnění úlohy, která po dokončení úlohy odstraní soubor z uzlu.
  7. Vytiskne ukončovací kódy úloh přípravy a vydání úloh pro každý uzel, na který byly spuštěny.
  8. Pozastaví provádění, aby bylo možné potvrdit odstranění úlohy nebo fondu.

Výstup z ukázkové aplikace je podobný následujícímu příkladu:

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...

Poznámka

Různá doba vytváření a spouštění uzlů v novém fondu znamená, že některé uzly jsou připravené pro úkoly před ostatními, takže se může zobrazit jiný výstup. Vzhledem k tomu, že se úkoly dokončí rychle, může jeden z uzlů fondu spouštět všechny úkoly úlohy. Pokud k tomu dojde, úlohy přípravy a vydání úlohy neexistují pro uzel, na který nebyly spuštěny žádné úlohy.

Zobrazení úkolů přípravy a vydání úloh v Azure Portal

Pomocí Azure Portal můžete zobrazit vlastnosti a úkoly úloh služby Batch, včetně úkolů přípravy a uvolnění úloh. Na stránce účtu Batch v levém navigačním panelu vyberte Úlohy a pak vyberte úlohu. Pokud spustíte ukázkovou aplikaci, přejděte na stránku úlohy po dokončení úkolů, ale před odstraněním úlohy a fondu.

Průběh a stav úlohy můžete monitorovat rozbalením přibližného počtu úkolů na stránce Přehled úlohy nebo Úkoly .

Snímek obrazovky znázorňující průběh úlohy v Azure Portal

Následující snímek obrazovky ukazuje stránku JobPrepReleaseSampleJob po spuštění ukázkové aplikace. Tato úloha měla úkoly přípravy a vydání, takže můžete v levém navigačním panelu vybrat Úkoly přípravy nebo Úlohy uvolnění a zobrazit jejich vlastnosti.

Snímek obrazovky zobrazující vlastnosti úlohy vydané verze v Azure Portal

Další kroky