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 |
|
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 |
|
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 1–10 azonosítójú tevékenységek sikeresen befejező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ü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 7
nem 5flamingoes
.
A kezdő nullák nem jelentősek a tartományfüggőségek kiértékelésekor, ezért a sztringazonosítókkal 4
rendelkező tevékenységek mind 004
04
a tartományon belül lesznek, mivel az összeset feladatként 4
kezelik, 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.