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 és utómegjelenítési folyamatok, ahol minden tevékenységnek el kell végeznie, mielőtt a következő tevékenység elkezdődhet.
  • 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 ezt úgy engedélyezheti a(z) BatchJobCreateOptions objektumban, hogy a UsesTaskDependencies tulajdonságot true értékre állítja:

BatchJobCreateOptions unboundJob = new BatchJobCreateOptions("job001", new BatchPoolInfo() { PoolId = "pool001" })
{
    // IMPORTANT: This is REQUIRED for using task dependencies.
    UsesTaskDependencies = true
};
await batchClient.CreateJobAsync(unboundJob);

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 konfigurálja a BatchTaskCreateOptions.DependsOn tulajdonságot a BatchTaskDependencies osztály egy példányával:

// Task 'Flowers' depends on completion of both 'Rain' and 'Sun'
// before it is run.
BatchTaskCreateOptions flowers = new BatchTaskCreateOptions("Flowers", "cmd.exe /c echo Flowers")
{
    DependsOn = new BatchTaskDependencies()
    {
        TaskIds = { "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 esetén ez azt jelenti, hogy a BatchTask.State tulajdonság értéke Completed, a BatchTask BatchTaskExecutionInfo.ExitCode tulajdonság értéke 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ő feladatfüggőség-forgatókönyv használható: egy-az-egyhez viszony, egy-a-többhöz viszony, és feladat azonosító tartományfüggőség. Ez a három forgatókönyv kombinálható egy negyedik forgatókönyv előállításához: több a többhöz.

Forgatókönyv Példa Illusztráció
Egy az egyhez taskB attól függ, hogy taskA

taskB nem kerül végrehajtásra, amíg taskA sikeresen be nem fejeződik

Az egy az egyhez tevékenység függőségi forgatókönyvét bemutató diagram.
Egy-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 függ egy sor feladattól

taskD nem lesz ütemezve végrehajtásra, amíg az azonosítókkal rendelkező 110 feladatok sikeresen be nem fejező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. 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 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.

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üggenek. A függőség létrehozásához állítsa be a BatchTaskDependencies.TaskIds értéket egyetlen tevékenységazonosítóval, amikor feltölti a BatchTaskCreateOptions.DependsOn tulajdonságot.

IList<BatchTaskCreateOptions> tasks = new List<BatchTaskCreateOptions>
{
    // Task 'taskA' doesn't depend on any other tasks
    new BatchTaskCreateOptions("taskA", "cmd.exe /c echo taskA"),

    // Task 'taskB' depends on completion of task 'taskA'
    new BatchTaskCreateOptions("taskB", "cmd.exe /c echo taskB")
    {
        DependsOn = new BatchTaskDependencies() { TaskIds = { "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 töltse ki a BatchTaskDependencies.TaskIds tulajdonságot a szülőfeladatok azonosítóival a BatchTaskCreateOptions.DependsOn tulajdonság kitöltésekor.

IList<BatchTaskCreateOptions> tasks = new List<BatchTaskCreateOptions>
{
    // 'Rain' and 'Sun' don't depend on any other tasks
    new BatchTaskCreateOptions("Rain", "cmd.exe /c echo Rain"),
    new BatchTaskCreateOptions("Sun", "cmd.exe /c echo Sun"),

    // Task 'Flowers' depends on completion of both 'Rain' and 'Sun'
    // before it is run.
    new BatchTaskCreateOptions("Flowers", "cmd.exe /c echo Flowers")
    {
        DependsOn = new BatchTaskDependencies() { TaskIds = { "Rain", "Sun" } }
    },
};

Fontos

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

Feladat-azonosí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 a BatchTaskCreateOptions.DependsOn tulajdonság kitöltésekor töltse ki a BatchTaskDependencies.TaskIdRanges mezőt egy BatchTaskIdRange objektummal.

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 7, de nem 5flamingoes.

A kezdő nullák nem jelentősek a tartományfüggőségek kiértékelésekor, ezért a karakterlánc azonosítókkal 4, 04, és 004 rendelkező tevékenységek tartományon belül vannak, mivel mind úgy vannak kezelve, mint a feladat 4, az első, amelyet befejeznek, kielégíti a függőséget.

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 befejezve, amely egy függőségi művelethez van rendelve, és az Elégedett-re van állítva.

IList<BatchTaskCreateOptions> tasks = new List<BatchTaskCreateOptions>
{
    // 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 BatchTaskCreateOptions("1", "cmd.exe /c echo 1"),
    new BatchTaskCreateOptions("2", "cmd.exe /c echo 2"),
    new BatchTaskCreateOptions("3", "cmd.exe /c echo 3"),

    // Task 4 depends on a range of tasks, 1 through 3
    new BatchTaskCreateOptions("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 BatchTaskIdRange,
        // but their ids (above) are string representations of the ids.
        DependsOn = new BatchTaskDependencies()
        {
            TaskIdRanges = { new BatchTaskIdRange(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:

  • Amikor előfeldolgozási hiba történik.
  • Amikor fájlfeltöltési hiba történik. 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 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 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 be a kilépési feltétel ExitOptions.DependencyAction tulajdonságát az alábbi lehetőségek 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ódnál a Satisfy, minden más kilépési feltételeknél pedig a Block.

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őfeladat nullától eltérő bármely más hibával kilép, a függő feladat futtatható.

IList<BatchTaskCreateOptions> tasks = new List<BatchTaskCreateOptions>
{
    // Task A is the parent task.
    new BatchTaskCreateOptions("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 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).
            DefaultExitOptions = new ExitOptions()
            {
                DependencyAction = DependencyAction.Satisfy
            }
        }
    },
    // Task B depends on task A. Whether it becomes eligible to run depends on how task A exits.
    new BatchTaskCreateOptions("B", "cmd.exe /c echo B")
    {
        DependsOn = new BatchTaskDependencies() { TaskIds = { "A" } }
    },
};

Kódminta

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

  • Feladatfü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 egy számítási csomópontok csoportjá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 munkák és feladatok hibaellenőrzéséről.