Megosztás a következőn keresztül:


Tevékenységfüggőségek létrehozása más tevékenységektől függő tevékenységek futtatásához

A Batch-tevékenységfüggőségekkel olyan tevékenységeket hozhat létre, amelyek egy vagy több szülőtevékenység befejezése után a számítási csomópontokon való végrehajtásra vannak ütemezve. Létrehozhat például egy feladatot, amely egy 3D-s film minden egyes keretét különálló, párhuzamos feladatokkal jeleníti meg. Az utolsó feladat a renderelt kereteket csak az összes képkocka sikeres megjelenítése után egyesíti a teljes filmbe. Más szóval az utolsó tevékenység az előző szülőtevékenységektől függ.

Néhány olyan forgatókönyv, amelyben a tevékenységfüggőségek hasznosak:

  • MapReduce stílusú számítási feladatok a felhőben.
  • Azok a feladatok, amelyek adatfeldolgozási feladatai irányított aciklikus gráfként (DAG) fejezhetők ki.
  • Előzetes renderelési és utólagos renderelési folyamatok, ahol az egyes tevékenységeknek el kell végezniük a következő tevékenység megkezdése előtt.
  • Minden más feladat, amelyben az alsóbb rétegbeli tevékenységek a felsőbb rétegbeli tevékenységek kimenetétől függnek.

Alapértelmezés szerint a függő tevékenységek csak akkor lesznek végrehajtásra ütemezve, ha a szülőtevékenység sikeresen befejeződött. Igény szerint megadhat egy függőségi műveletet az alapértelmezett viselkedés felülbírálásához, és futtathatja a függő tevékenységet akkor is, ha a szülőfeladat meghiúsul.

Ebben a cikkben bemutatjuk, hogyan konfigurálhatja a tevékenységfüggőségeket a Batch .NET-kódtár használatával. Először bemutatjuk, hogyan engedélyezheti a tevékenységek függőségét a feladatokhoz, majd bemutatjuk, hogyan konfigurálhat egy tevékenységet függőségekkel. Azt is ismertetjük, hogyan adhat meg függőségi műveletet a függő tevékenységek futtatásához, ha a szülő meghibásodik. Végül bemutatjuk a Batch által támogatott függőségi forgatókönyveket .

Tevékenységfüggőségek engedélyezése

Ha tevékenységfüggőségeket szeretne használni a Batch-alkalmazásban, először konfigurálnia kell a feladatot tevékenységfüggőségek használatára. A Batch .NET-ben engedélyezze a CloudJobban, ha a UsesTaskDependencies tulajdonságát a következőre trueállítja:

CloudJob unboundJob = batchClient.JobOperations.CreateJob( "job001",
    new PoolInformation { PoolId = "pool001" });

// IMPORTANT: This is REQUIRED for using task dependencies.
unboundJob.UsesTaskDependencies = true;

Az előző kódrészletben a "batchClient" a BatchClient osztály egy példánya.

Függő tevékenységek létrehozása

Ha olyan tevékenységet szeretne létrehozni, amely egy vagy több szülőtevékenység befejezésétől függ, megadhatja, hogy a tevékenység "függ" a többi tevékenységtől. A Batch .NET-ben konfigurálja a CloudTask.DependsOn tulajdonságot a TaskDependencies osztály egy példányával:

// 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")
},

Ez a kódrészlet egy függő feladatot hoz létre "Virágok" tevékenységazonosítóval. A "Virágok" tevékenység az "Eső" és a "Nap" tevékenységektől függ. A "Virágok" tevékenység csak az "Eső" és a "Sun" tevékenységek sikeres befejezése után lesz ütemezve a számítási csomóponton való futtatásra.

Feljegyzés

Alapértelmezés szerint a feladat sikeresen befejezettnek minősül, ha befejezett állapotban van, és a kilépési kódja .0 A Batch .NET-ben ez azt jelenti, hogy a CloudTask.State tulajdonság értéke, Completed a CloudTask TaskExecutionInformation.ExitCode tulajdonságértéke pedig 0. Ennek módosításáról a Függőségi műveletek szakaszból tájékozódhat.

Függőségi forgatókönyvek

Az Azure Batchben három alapvető tevékenységfüggőség-forgatókönyv használható: egy-az-egyhez, egy-a-többhöz és tevékenységazonosító tartományfüggőség. Ez a három forgatókönyv kombinálható egy negyedik forgatókönyv biztosításához: több-a-többhöz.

Forgatókönyv Példa Illusztráció
Egyhez A taskB attól függ, hogy a taskA

taskB nem lesz végrehajtásra ütemezve, amíg a taskA sikeresen be nem fejeződik

Az egy az egyhez tevékenység függőségi forgatókönyvét bemutató diagram.
Egy-a-többhöz A taskC attól függ, hogy a taskA és a taskB

taskC mindaddig nem lesz végrehajtásra ütemezve, amíg a taskA és a taskB is sikeresen be nem fejeződik

Az egy-a-többhöz tevékenység függőségi forgatókönyvét bemutató diagram.
Tevékenységazonosító tartománya A taskD egy tevékenységtartománytól

függ, a taskD csak akkor lesz végrehajtásra ütemezve, ha az 110 azonosítójú tevékenységek sikeresen befejeződnek

A tevékenységazonosító tartomány tevékenységfüggőség-forgatókönyvét bemutató diagram.

Tipp.

Több-a-többhöz kapcsolatok hozhatók létre, például ahol a C, D, E és F tevékenységek az A és a B tevékenységtől függenek. Ez hasznos lehet például párhuzamos előfeldolgozási forgatókönyvekben, ahol az alsóbb rétegbeli tevékenységek több felsőbb rétegbeli tevékenység kimenetétől függenek.

Az ebben a szakaszban szereplő példákban egy függő tevékenység csak a szülőtevékenységek sikeres befejezése után fut. Ez a viselkedés egy függő tevékenység alapértelmezett viselkedése. Függő tevékenységet futtathat, ha egy szülőfeladat meghiúsul, ha megad egy függőségi műveletet az alapértelmezett viselkedés felülbírálásához.

Egyhez

Az egy-az-egyhez kapcsolatokban a tevékenységek az egyik szülőtevékenység sikeres befejezésétől függenek. A függőség létrehozásához adjon meg egyetlen tevékenységazonosítót a TaskDependencies.OnId statikus metódusnak a CloudTask.DependsOn tulajdonság feltöltésekor.

// 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")
},

Egy a sokhoz

Az egy-a-többhöz kapcsolatokban a tevékenységek több szülőtevékenység befejezésétől függenek. A függőség létrehozásához adjon meg egy adott tevékenységazonosító-gyűjteményt a TaskDependencies.OnIds statikus metódusnak a CloudTask.DependsOn tulajdonság feltöltésekor.

// '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")
},

Fontos

A függő tevékenység létrehozása sikertelen lesz, ha a szülő tevékenységazonosítók együttes hossza meghaladja a 64000 karaktert. Ha nagy számú szülőtevékenységet szeretne megadni, érdemes inkább tevékenységazonosító-tartományt használnia.

Tevékenységazonosító tartománya

A szülőtevékenységek tartományától való függőség esetén a tevékenységek azon tevékenységek befejezésétől függenek, amelyek azonosítói az Ön által megadott tartományon belül találhatók.

A függőség létrehozásához adja meg a tartomány első és utolsó tevékenységazonosítóját a TaskDependencies.OnIdRange statikus metódusnak a CloudTask.DependsOn tulajdonság feltöltésekor.

Fontos

Ha tevékenységazonosító-tartományokat használ a függőségekhez, a tartomány csak az egész számértékeket képviselő azonosítókat tartalmazó tevékenységeket választja ki. A tartomány 1..10 például kijelöli a tevékenységeket 3 , és 7nem 5flamingoes.

A kezdő nullák nem jelentősek a tartományfüggőségek kiértékelésekor, ezért a sztringazonosítókkal 4rendelkező tevékenységek mind 004 04 a tartományon belül lesznek, mivel az összeset feladatként 4kezelik, az első befejezett feladat megfelel a függőségnek.

Ahhoz, hogy a függő tevékenység fusson, a tartomány minden tevékenységének teljesítenie kell a függőséget, akár sikeresen befejezve, akár egy Olyan hibával, amely megfeleltetés nevű függőségi műveletnek van megfeleltetve.

// 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)
},

Függőségi műveletek

Alapértelmezés szerint egy függő tevékenység vagy tevékenységkészlet csak a szülőtevékenység sikeres befejezése után fut. Bizonyos esetekben érdemes lehet függő tevékenységeket futtatni akkor is, ha a szülőfeladat meghiúsul. Az alapértelmezett viselkedés felülbírálható egy függőségi művelet megadásával, amely jelzi, hogy egy függő tevékenység futtatható-e.

Tegyük fel például, hogy egy függő tevékenység az adatokra vár a felsőbb rétegbeli tevékenység befejezésétől. Ha a felsőbb rétegbeli tevékenység meghiúsul, előfordulhat, hogy a függő tevékenység továbbra is futtatható régebbi adatokkal. Ebben az esetben a függőségi művelet megadhatja, hogy a függő tevékenység a szülőtevékenység hibája ellenére is futtatható legyen.

A függőségi művelet a szülőfeladat kilépési feltételén alapul. A következő kilépési feltételek bármelyikéhez megadhat függőségi műveletet:

  • Előfeldolgozási hiba esetén.
  • Fájlfeltöltési hiba esetén. Ha a feladat kilép az exitCodes vagy exitCodeRanges használatával megadott kilépési kóddal, majd fájlfeltöltési hibába ütközik, a kilépési kód által megadott művelet elsőbbséget élvez.
  • Amikor a feladat kilép az ExitCodes tulajdonság által meghatározott kilépési kóddal.
  • Amikor a tevékenység kilép egy kilépési kóddal, amely az ExitCodeRanges tulajdonság által megadott tartományba esik.
  • Az alapértelmezett eset, ha a tevékenység kilép az ExitCodes vagy az ExitCodeRanges által nem definiált kilépési kóddal, vagy ha a tevékenység előfeldolgozási hibával lép ki, és a PreProcessingError tulajdonság nincs beállítva, vagy ha a feladat fájlfeltöltési hibával meghiúsul, és a FileUploadError tulajdonság nincs beállítva.

A .NET esetében ezek a feltételek az ExitConditions osztály tulajdonságaiként vannak definiálva.

Függőségi művelet megadásához állítsa a kilépési feltétel ExitOptions.DependencyAction tulajdonságát az alábbiak egyikére:

  • Megfeleltetés: Azt jelzi, hogy a függő tevékenységek futtathatók, ha a szülő tevékenység egy megadott hibával kilép.
  • Blokk: Azt jelzi, hogy a függő tevékenységek nem futtathatók.

A DependencyAction tulajdonság alapértelmezett beállítása a 0-s kilépési kódnak megfelelő, az összes többi kilépési feltétel blokkolása.

Az alábbi kódrészlet egy szülőfeladat DependencyAction tulajdonságát állítja be. Ha a szülőtevékenység előfeldolgozási hibával vagy a megadott hibakódokkal lép ki, a függő tevékenység le lesz tiltva. Ha a szülő tevékenység bármely más, nem nulla hibával kilép, a függő tevékenység futtatható.

// 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")
},

Kódminta

A GitHub TaskDependencies mintaprojektje a következőt mutatja be:

  • Tevékenységfüggőség engedélyezése egy feladaton.
  • Más tevékenységektől függő tevékenységek létrehozása.
  • A feladatok végrehajtása számítási csomópontok készletén.

Következő lépések

  • Ismerje meg a Batch alkalmazáscsomagok funkcióját, amely megkönnyíti a feladatok által a számítási csomópontokon végrehajtott alkalmazások üzembe helyezését és verziószámozását.
  • További információ a feladatok és feladatok hibaellenőrzéséről.