Feladatadatok megőrzése az Azure Storage-ban a Batch szolgáltatás API-val
Az Azure Batchben futó feladatok kimeneti adatokat hozhatnak létre a futtatáskor. A feladat kimeneti adatait gyakran kell tárolni a feladat más tevékenységei, a feladatot végrehajtó ügyfélalkalmazás vagy mindkettő lekéréséhez. A feladatok kimeneti adatokat írnak egy Batch számítási csomópont fájlrendszerére, de a csomópont összes adata elveszik, amikor újraépül, vagy amikor a csomópont elhagyja a készletet. A tevékenységeknek fájlmegőrzési időszakuk is lehet, amely után a feladat által létrehozott fájlok törlődnek. Ezért fontos, hogy a feladat kimenete megmaradjon, amelyet később egy adattárban, például az Azure Storage-ban kell tárolnia.
A Batch tárfiók-beállításairól a Batch-fiókok és az Azure Storage-fiókok című témakörben olvashat.
A Batch szolgáltatás API támogatja a kimeneti adatok Azure Storage-ba való megőrzését a virtuálisgép-konfigurációval rendelkező készleteken futó feladatokhoz és feladatkezelői feladatokhoz. Feladat hozzáadásakor megadhat egy tárolót az Azure Storage-ban a tevékenység kimenetének célhelyeként. A Batch szolgáltatás ezután a feladat befejezésekor az adott tárolóba írja a kimeneti adatokat.
Ha a Batch szolgáltatás API-ját használja a feladat kimenetének megőrzéséhez, nem kell módosítania azt az alkalmazást, amelyet a feladat futtat. Ehelyett az ügyfélalkalmazás néhány módosításával megőrizheti a tevékenység kimenetét ugyanazon a kódon belül, amely létrehozza a feladatot.
Fontos
A feladatadatok Azure Storage-ba történő megőrzése a Batch szolgáltatás API-val nem működik a 2018. február 1. előtt létrehozott készletekkel.
Mikor használhatom a Batch szolgáltatás API-t a feladat kimenetének megőrzéséhez?
Az Azure Batch több módot is kínál a feladat kimenetének megőrzésére. A Batch szolgáltatás API-jának használata az alábbi helyzetekhez leginkább megfelelő módszer:
- Olyan kódot szeretne írni, amely megőrzi a feladat kimenetét az ügyfélalkalmazásban anélkül, hogy módosítaná a feladat által futtatott alkalmazást.
- Meg szeretné őrizni a Batch-tevékenységek és a feladatkezelői feladatok kimenetét a virtuális gép konfigurációjával létrehozott készletekben.
- A kimenetet tetszőleges nevű Azure Storage-tárolóban szeretné tárolni.
- A kimenetet a Batch-fájlkonvenciók szabványa szerint elnevezett Azure Storage-tárolóban szeretné tárolni.
Ha a forgatókönyv eltér a fent felsoroltaktól, előfordulhat, hogy más megközelítést kell figyelembe vennie. A Batch szolgáltatás API-ja például jelenleg nem támogatja az Azure Storage-ba irányuló streamelési kimenetet, miközben a feladat fut. A kimenet streameléséhez fontolja meg a .NET-hez elérhető Batch File Conventions kódtár használatát. Más nyelvek esetén saját megoldást kell implementálnia. További információ az egyéb lehetőségekről: Feladat- és feladatkimenet megőrzése az Azure Storage-ban.
Tároló létrehozása az Azure Storage-ban
Ahhoz, hogy a feladat kimenete megmaradjon az Azure Storage-ban, létre kell hoznia egy tárolót, amely a kimeneti fájlok célhelyeként szolgál. A feladat futtatása előtt, lehetőleg a feladat elküldése előtt hozza létre a tárolót a megfelelő Azure Storage-ügyfélkódtár vagy SDK használatával. Az Azure Storage API-kkal kapcsolatos további információkért tekintse meg az Azure Storage dokumentációját.
Ha például az alkalmazást C#-ban írja, használja az Azure Storage .NET-hez készült ügyfélkódtárát. Az alábbi példa bemutatja, hogyan hozhat létre tárolót:
CloudBlobContainer container = storageAccount.CreateCloudBlobClient().GetContainerReference(containerName);
await container.CreateIfNotExists();
Kimeneti fájlok megadása a feladat kimenetéhez
Egy tevékenység kimeneti fájljainak megadásához hozzon létre egy OutputFile objektumgyűjteményt, és rendelje hozzá a CloudTask.OutputFiles tulajdonsághoz a feladat létrehozásakor. A tárolóhoz való hozzáférés hitelesítéséhez használhat közös hozzáférésű jogosultságkódot (SAS) vagy felügyelt identitást.
Közös hozzáférésű jogosultságkód használata
A tároló létrehozása után szerezze be a tárolóhoz írási hozzáféréssel rendelkező közös hozzáférési aláírást (SAS). Az SAS delegált hozzáférést biztosít a tárolóhoz. Az SAS megadott engedélykészlettel és meghatározott időintervallumon keresztül biztosít hozzáférést. A Batch szolgáltatásnak írási engedélyekkel rendelkező SAS-ra van szüksége a feladat kimenetének a tárolóba való írásához. További információ az SAS-ről: Közös hozzáférésű jogosultságkódok (SAS) használata az Azure Storage-ban.
Amikor SAS-t kap az Azure Storage API-k használatával, az API egy SAS-jogkivonat-sztringet ad vissza. Ez a jogkivonat-sztring az SAS összes paraméterét tartalmazza, beleértve az engedélyeket és az sas érvényességének időtartamát. Ha az SAS használatával szeretne hozzáférni egy tárolóhoz az Azure Storage-ban, hozzá kell fűznie az SAS-jogkivonat sztringet az erőforrás URI-jához. Az erőforrás URI-ja és a hozzáfűzött SAS-jogkivonat hitelesített hozzáférést biztosít az Azure Storage-hoz.
Az alábbi példa bemutatja, hogyan kérhet le írásvédett SAS-jogkivonat-sztringet a tárolóhoz, majd fűzi hozzá az SAS-t a tároló URI-hoz:
string containerSasToken = container.GetSharedAccessSignature(new SharedAccessBlobPolicy()
{
SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddDays(1),
Permissions = SharedAccessBlobPermissions.Write
});
string containerSasUrl = container.Uri.AbsoluteUri + containerSasToken;
A következő C#-kód példa egy olyan feladatot hoz létre, amely véletlenszerű számokat ír egy nevű output.txt
fájlba. A példa létrehoz egy kimeneti fájlt, amelyet output.txt
a tárolóba kell írni. A példa kimeneti fájlokat is létrehoz minden olyan naplófájlhoz, stdout.txt
amely megfelel a fájlmintának std*.txt
(például ésstderr.txt
). A tároló URL-címéhez a tárolóhoz korábban létrehozott SAS szükséges. A Batch szolgáltatás az SAS használatával hitelesíti a tárolóhoz való hozzáférést.
new CloudTask(taskId, "cmd /v:ON /c \"echo off && set && (FOR /L %i IN (1,1,100000) DO (ECHO !RANDOM!)) > output.txt\"")
{
OutputFiles = new List<OutputFile>
{
new OutputFile(
filePattern: @"..\std*.txt",
destination: new OutputFileDestination(
new OutputFileBlobContainerDestination(
containerUrl: containerSasUrl,
path: taskId)),
uploadOptions: new OutputFileUploadOptions(
uploadCondition: OutputFileUploadCondition.TaskCompletion)),
new OutputFile(
filePattern: @"output.txt",
destination:
new OutputFileDestination(new OutputFileBlobContainerDestination(
containerUrl: containerSasUrl,
path: taskId + @"\output.txt")),
uploadOptions: new OutputFileUploadOptions(
uploadCondition: OutputFileUploadCondition.TaskCompletion)),
}
Megjegyzés:
Ha ezt a példát Linuxon használja, mindenképpen módosítsa a fordított perjeleket a perjelek továbbítására.
Felügyelt identitás használata
A tárolóhoz írási hozzáféréssel rendelkező SAS létrehozása és átadása a Batch számára helyett egy felügyelt identitással hitelesíthető az Azure Storage-ral. Az identitást hozzá kell rendelni a Batch-készlethez, és rendelkeznie kell a Storage Blob Data Contributor
tárolóhoz írandó szerepkör-hozzárendeléssel is. A Batch szolgáltatás ezután utasítható arra, hogy sas helyett használja a felügyelt identitást a tárolóhoz való hozzáférés hitelesítéséhez.
CloudBlobContainer container = storageAccount.CreateCloudBlobClient().GetContainerReference(containerName);
await container.CreateIfNotExists();
new CloudTask(taskId, "cmd /v:ON /c \"echo off && set && (FOR /L %i IN (1,1,100000) DO (ECHO !RANDOM!)) > output.txt\"")
{
OutputFiles = new List<OutputFile>
{
new OutputFile(
filePattern: @"..\std*.txt",
destination: new OutputFileDestination(
new OutputFileBlobContainerDestination(
containerUrl: container.Uri,
path: taskId,
identityReference: new ComputeNodeIdentityReference() { ResourceId = "/subscriptions/SUB/resourceGroups/RG/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity-name"} })),
uploadOptions: new OutputFileUploadOptions(
uploadCondition: OutputFileUploadCondition.TaskCompletion))
}
}
Fájlminta megadása az egyeztetéshez
Kimeneti fájl megadásakor a OutputFile.FilePattern tulajdonság használatával megadhatja a fájlmintát az egyeztetéshez. A fájlminta megegyezhet nulla fájllal, egyetlen fájllal vagy a feladat által létrehozott fájlkészlettel.
A FilePattern tulajdonság támogatja a standard fájlrendszerbeli helyettesítő karaktereket, például *
(nem rekurzív egyezések esetén) és **
(rekurzív egyezések esetén). A fenti kódminta például a nem rekurzívnak megfelelő std*.txt
fájlmintát adja meg:
filePattern: @"..\std*.txt"
Egyetlen fájl feltöltéséhez adjon meg egy helyettesítő karakterek nélküli fájlmintát. A fenti kódminta például megadja az egyező output.txt
fájlmintát:
filePattern: @"output.txt"
Feltöltési feltétel megadása
A OutputFileUploadOptions.UploadCondition tulajdonság lehetővé teszi a kimeneti fájlok feltételes feltöltését. Gyakori forgatókönyv egy fájlkészlet feltöltése, ha a feladat sikeres, és ha nem sikerül, másik fájlkészletet kell feltölteni. Előfordulhat például, hogy csak akkor szeretne részletes naplófájlokat feltölteni, ha a feladat meghiúsul, és nem a kilépési kóddal lép ki. Hasonlóképpen, előfordulhat, hogy csak akkor szeretne eredményfájlokat feltölteni, ha a feladat sikeres, mivel előfordulhat, hogy ezek a fájlok hiányoznak vagy hiányosak, ha a feladat meghiúsul.
A fenti kódminta az UploadCondition tulajdonságot TaskCompletion értékre állítja. Ez a beállítás azt határozza meg, hogy a fájlt a feladatok befejezése után kell feltölteni, függetlenül a kilépési kód értékétől.
uploadCondition: OutputFileUploadCondition.TaskCompletion
További beállításokért lásd az OutputFileUploadCondition enumerálását .
Azonos nevű fájlok egyértelműsítése
A feladat tevékenységei azonos nevű fájlokat hozhatnak létre. Például minden stdout.txt
stderr.txt
feladatban futó feladathoz létrejönnek. Mivel minden feladat a saját környezetében fut, ezek a fájlok nem ütköznek a csomópont fájlrendszerében. Ha azonban több feladatból tölt fel fájlokat egy megosztott tárolóba, egyértelműsítenie kell az azonos nevű fájlokat.
Az OutputFileBlobContainerDestination.Az Elérési út tulajdonság a kimeneti fájlok célblobát vagy virtuális könyvtárát adja meg. Az Elérési út tulajdonsággal úgy nevezheti el a blobot vagy a virtuális könyvtárat, hogy az azonos nevű kimeneti fájlok egyedi névvel legyenek elnevezve az Azure Storage-ban. A feladatazonosító az elérési úton való használatával biztosíthatja az egyedi neveket és a fájlok egyszerű azonosítását.
Ha a FilePattern tulajdonság helyettesítő kifejezésre van állítva, akkor a rendszer a mintának megfelelő összes fájlt feltölti az Elérési út tulajdonság által megadott virtuális könyvtárba. Ha például a tároló mycontainer
, a feladat azonosítója mytask
és a fájlminta ..\std*.txt
, akkor az Azure Storage kimeneti fájljainak abszolút URI-jai a következőhöz hasonlóak lesznek:
https://myaccount.blob.core.windows.net/mycontainer/mytask/stderr.txt
https://myaccount.blob.core.windows.net/mycontainer/mytask/stdout.txt
Ha a FilePattern tulajdonság egyetlen fájlnévnek felel meg, vagyis nem tartalmaz helyettesítő karaktereket, akkor az Elérési út tulajdonság értéke a teljes blobnevet adja meg. Ha több feladatból származó egyetlen fájl elnevezésére számít, a fájlnév részeként adja meg a virtuális könyvtár nevét a fájlok egyértelműsítéséhez. Állítsa be például az Elérési út tulajdonságot úgy, hogy tartalmazza a tevékenységazonosítót, az elválasztó karaktert (általában perjelet) és a fájlnevet:
path: taskId + @"/output.txt"
A feladathalmaz kimeneti fájljainak abszolút URI-jai a következőhöz hasonlóak lesznek:
https://myaccount.blob.core.windows.net/mycontainer/task1/output.txt
https://myaccount.blob.core.windows.net/mycontainer/task2/output.txt
Az Azure Storage-beli virtuális könyvtárakról további információt a tárolóban lévő blobok listázása című témakörben talál.
Számos kimeneti fájl
Ha egy feladat számos kimeneti fájlt határoz meg, előfordulhat, hogy az Azure Batch API által előírt korlátokba ütközik. Célszerű a feladatokat kicsiben tartani, és a kimeneti fájlok számát alacsonyan tartani.
Ha korlátokat tapasztal, fontolja meg a kimeneti fájlok számának csökkentését a fájlminták alkalmazásával vagy a fájltárolók , például a kátrány vagy a zip használatával a kimeneti fájlok összevonásához. Másik lehetőségként csatlakoztatási vagy egyéb módszereket is használhat a kimeneti adatok megőrzéséhez (lásd: Feladat- és tevékenységkimenet megőrzése).
Fájlfeltöltési hibák diagnosztizálása
Ha a kimeneti fájlok Azure Storage-ba való feltöltése sikertelen, a feladat a Kész állapotba és a TaskExecutionInformation állapotba kerül.A FailureInformation tulajdonság be van állítva. Vizsgálja meg a FailureInformation tulajdonságot, és állapítsa meg, hogy mi történt. Itt látható például egy hiba a fájlfeltöltéskor, ha a tároló nem található:
Category: UserError
Code: FileUploadContainerNotFound
Message: One of the specified Azure container(s) was not found while attempting to upload an output file
Minden fájlfeltöltéskor a Batch két naplófájlt ír a számítási csomópontra és fileuploadout.txt
fileuploaderr.txt
a . Ezeket a naplófájlokat megvizsgálva többet is megtudhat egy adott hibáról. Azokban az esetekben, amikor a fájlfeltöltést soha nem kísérelték meg, például mert maga a feladat nem futtatható, ezek a naplófájlok nem fognak létezni.
A fájlfeltöltés teljesítményének diagnosztizálása
A fileuploadout.txt
fájlnaplók feltöltési állapota. Ezt a fájlt megvizsgálva megtudhatja, hogy mennyi ideig tart a fájlfeltöltés. Ne feledje, hogy a feltöltési teljesítményhez számos tényező járul hozzá, például a csomópont mérete, a csomóponton a feltöltéskor végzett egyéb tevékenység, a céltároló ugyanabban a régióban található-e, mint a Batch-készlet, hány csomópont tölt fel egyszerre a tárfiókba, és így tovább.
A Batch szolgáltatás API használata a Batch-fájlkonvenciók szabványával
Ha a Batch szolgáltatás API-val megőrzi a feladat kimenetét, tetszés szerint nevezheti el a céltárolót és a blobokat. A Batch File Conventions szabványnak megfelelően is elnevezheti őket. A Fájlkonvenciók standardja egy adott kimeneti fájl céltárolójának és blobjának nevét határozza meg az Azure Storage-ban a feladat és a feladat neve alapján. Ha a kimeneti fájlok elnevezéséhez a Fájlkonvenciók szabványt használja, akkor a kimeneti fájlok megtekinthetők az Azure Portalon.
Ha C#-ban fejleszt, a .NET-hez készült Batch File Conventions kódtárba beépített metódusokat használhatja. Ez a kódtár létrehozza önnek a megfelelően elnevezett tárolókat és blobútvonalakat. Meghívhatja például az API-t a tároló megfelelő nevének lekéréséhez a feladat neve alapján:
string containerName = job.OutputStorageContainerName();
A CloudJobExtensions.GetOutputStorageContainerUrl metódussal visszaadhat egy közös hozzáférésű jogosultságkód (SAS) URL-címet, amelyet a tárolóba való íráshoz használnak. Ezt az SAS-t ezután átadhatja az OutputFileBlobContainerDestination konstruktornak.
Ha a C#-tól eltérő nyelven fejleszt, a fájlkonvenciók szabványát saját maga kell implementálnia.
Kódminta
A PersistOutputs mintaprojekt a GitHub egyik Azure Batch-kódmintája . Ez a Visual Studio-megoldás bemutatja, hogyan használható a Batch ügyfélkódtár a .NET-hez a feladat kimenetének tartós tárolóba való megőrzéséhez. A minta futtatásához kövesse az alábbi lépéseket:
- Nyissa meg a projektet a Visual Studio 2019-ben.
- Adja hozzá a Batch- és Storage-fiók hitelesítő adatait a Microsoft.Azure.Batch.Samples.Common projekt Fiók Gépház.beállításaihoz.
- Hozza létre (de ne futtassa) a megoldást. Ha a rendszer kéri, állítsa vissza a NuGet-csomagokat.
- Az Azure Portal használatával töltsön fel egy alkalmazáscsomagot a PersistOutputsTaskhoz. Vegye fel a .zip csomagba a
PersistOutputsTask.exe
függő szerelvényeket, állítsa az alkalmazásazonosítót "PersistOutputsTask" értékre, az alkalmazáscsomag verzióját pedig "1.0"-ra. - Indítsa el (futtassa) a PersistOutputs projektet.
- Amikor a rendszer arra kéri, hogy válassza ki a minta futtatásához használandó adatmegőrzési technológiát, a 2. lépéssel futtassa a mintát a Batch szolgáltatás API-val a feladat kimenetének megőrzéséhez.
- Ha szükséges, futtassa újra a mintát, és adja meg a 3 értéket a Kimenet a Batch szolgáltatás API-val való megőrzéséhez, valamint a céltároló és a blob elérési útja elnevezéséhez a Fájlkonvenciók szabványának megfelelően.
Következő lépések
- Ha többet szeretne tudni a feladat kimenetének a .NET fájlkonvenciók tárával való megőrzéséről, olvassa el a feladat- és feladatadatok Azure Storage-ba való megőrzését a .NET-hez készült Batch File Conventions könyvtárral.
- A kimeneti adatok Azure Batchben való megőrzésének egyéb megközelítéseiről a feladat- és feladatkimenet megőrzése az Azure Storage-ban című témakörben olvashat.