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 |
|
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 |
|
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 1–10. azonosítójú tevékenységek sikeresen be nem fejeződnek |
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égeket7
3
, de nem5flamingoes
.
A kezdő nullák nem jelentősek a tartományfüggőségek kiértékelésekor, így a sztringazonosítóval 004
4
04
rendelkező tevékenységek mind a tartományban lesznek, mivel mind feladatként 4
lesznek 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
- Ismerje meg a Batch alkalmazáscsomag-funkcióját , amely egyszerű módot kínál a feladatok által a számítási csomópontokon végrehajtott alkalmazások üzembe helyezésére és verziószámba helyezésére.
- További információ a feladatok és tevékenységek hibaellenőrzéséről.