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 képkockáját külön, párhuzamos feladatokkal jeleníti meg. Az utolsó feladat a renderelt kereteket csak akkor egyesíti a teljes filmben, ha az összes képkockát sikeresen renderelték. Más szóval az utolsó feladat az előző szülőfeladatoktól függ.

Néhány forgatókönyv, ahol a tevékenységfüggőségek hasznosak, többek között a következők:

  • MapReduce típusú 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őrendelő és utólagos renderelési folyamatok, ahol az egyes tevékenységeknek a következő tevékenység megkezdése előtt kell befejeződniük.
  • Minden más olyan feladat, amelyben az alárendelt tevékenységek a felsőbb rétegbeli tevékenységek kimenetétől függenek.

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 a függő tevékenység futtatásához akkor is, ha a szülőfeladat meghiúsul.

Ebből a cikkből megtudhatja, 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 CloudJob-on , 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 "Flowers" tevékenységazonosítójú függő feladatot hoz létre. A "Virágok" feladat az "Eső" és a "Nap" tevékenységektől függ. A "Virágok" tevékenység csak az "Eső" és a "Nap" tevékenységek sikeres befejezése után lesz ütemezve a számítási csomóponton való futtatásra.

Megjegyzés

Alapértelmezés szerint egy 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

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

Eset Példa Illusztráció
Egy-az-egyhez taskB attól függ, hogy a taskA

taskB nem lesz ütemezve végrehajtásra, 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ó ábra.
Egy-a-többhöz 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ó ábra.
Tevékenységazonosító tartománya taskD attól függ, hogy a taskD tevékenységek

egy tartománya nem lesz ütemezve végrehajtásra, amíg az 110. azonosítójú tevékenységek sikeresen be nem fejeződnek

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

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üggnek. Ez hasznos lehet például olyan párhuzamos előfeldolgozási forgatókönyvekben, ahol az alárendelt 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őfeladatok sikeres befejezése után fut. Ez a viselkedés a függő tevékenységek 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.

Egy-az-egyhez

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

// 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-többhöz

Egy-a-többhöz kapcsolatban a tevékenységek több szülőfeladat befejezésétől függnek. A függőség létrehozásához adja meg a tevékenységazonosítók gyűjteményét a TaskDependencies.OnIds statikus metódusnak, amikor feltölti a CloudTask.DependsOn tulajdonságot.

// '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ég-azonosítók együttes hossza meghaladja a 64000 karaktert. Ha nagy számú szülőtevékenységet szeretne megadni, fontolja meg inkább a Tevékenységazonosító tartomány használatát.

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 attól függnek, hogy a megadott tartományon belülre eső azonosítóval rendelkező tevékenységek befejeződnek-e.

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 és a tevékenységeket73, de nem5flamingoes.

A kezdő nullák nem jelentősek a tartományfüggőségek kiértékelésekor, így a sztringazonosítóval 004404 rendelkező tevékenységek mind a tartományban lesznek, mivel mind feladatként 4lesznek kezelve, az első befejezett feladat megfelel a függőségnek.

Ahhoz, hogy a függő tevékenység fusson, a tartományban lévő összes tevékenységnek meg kell felelnie a függőségnek, akár sikeres végrehajtással, akár egy Olyan hibával, amely megfelel egy Kielégítés nevű függőségi műveletnek.

// 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, még akkor is, ha a szülőfeladat meghiúsul. Az alapértelmezett viselkedést felülbírálhatja 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 a felsőbb rétegbeli tevékenység befejezésének adataira vár. 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 egy 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űveletek a szülőfeladat kilépési feltételén alapulnak. A következő kilépési feltételek bármelyikéhez megadhat függőségi műveletet:

  • Ha előfeldolgozási hiba történik.
  • Fájlfeltöltési hiba esetén. Ha a feladat kilépési kóddal lép ki, amelyet az exitCodes vagy az exitCodeRanges parancs használatával adott meg, majd fájlfeltöltési hibát tapasztal, 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 feladat kilép egy kilépési kóddal, amely az ExitCodeRanges tulajdonság által megadott tartományba esik.
  • Az alapértelmezett eset, ha a feladat kilépési kóddal lép ki, amelyet nem az ExitCodes vagy az ExitCodeRanges határoz meg, vagy ha a feladat 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:

  • Megfelelő: 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ő, a Blokkolás pedig az összes többi kilépési feltételnél.

Az alábbi kódrészlet egy szülőfeladat DependencyAction tulajdonságát állítja be. Ha a szülőfeladat 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 hiba miatt 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őket mutatja be:

  • Tevékenységfüggőség engedélyezése egy feladathoz.
  • 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