Feladatadatok megőrzése az Azure Storage a Batch szolgáltatás API-jával
A Azure Batch futó tevékenységek futtatáskor kimeneti adatokat hozhatnak létre. A feladat kimeneti adatait gyakran tárolni kell 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óponton lévő összes adat elveszik, amikor újragondolják, vagy amikor a csomópont elhagyja a készletet. A tevékenységek fájlmegőrzési időszaka 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-ben kell tárolnia.
A Batch tárfiók-beállításaiért tekintse meg a Batch-fiókokat és az Azure Storage-fiókokat.
A Batch szolgáltatás API támogatja a kimeneti adatok Megőrzését az Azure Storage a virtuálisgép-konfigurációval rendelkező készleteken futó feladatokhoz és feladatkezelő feladatokhoz. Feladat hozzáadásakor megadhat egy tárolót az Azure Storage a feladat kimenetének célhelyeként. A Batch szolgáltatás ezután a feladat befejezésekor a 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 a feladat által futtatott alkalmazást. Ehelyett az ügyfélalkalmazás néhány módosításával megőrizheti a feladat kimenetét ugyanazon a kódon belül, amely létrehozza a feladatot.
Fontos
A feladatadatok Azure-Storage Batch szolgáltatás API-val való megőrzése 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?
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 kényelmes módszer, amely a legjobban megfelel az alábbi helyzetekben:
- Olyan kódot szeretne írni, amely megőrzi a feladat kimenetét az ügyfélalkalmazásból anélkül, hogy módosítaná a feladat által futtatott alkalmazást.
- Meg szeretné őrizni a Batch- és feladatkezelői feladatok kimenetét a virtuális gép konfigurációjával létrehozott készletekben.
- A kimenetet egy tetszőleges nevű Azure Storage-tárolóban szeretné megőrzni.
- A kimenetet a Batch-fájlkonvenciók szabványa szerint elnevezett Azure Storage-tárolóban szeretné megőrzni.
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-ba irányuló streamelési kimenetet az Azure Storage a feladat futtatása közben. A kimenet streameléséhez fontolja meg a .NET-hez elérhető Batch-fájlkonvenciós 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.
Tároló létrehozása az Azure Storage
Ahhoz, hogy a feladat kimenete megmaradjon az Azure Storage, létre kell hoznia egy tárolót, amely a kimeneti fájlok célhelyeként szolgál. Hozza létre a tárolót a feladat futtatása előtt, lehetőleg a feladat elküldése előtt 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# nyelven í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();
Közös hozzáférésű jogosultságkód lekérése a tárolóhoz
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ésű 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éllyel rendelkező SAS-nek kell lennie 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.
Ha SAS-t kap az Azure Storage API-k használatával, az API egy SAS-jogkivonat-sztringet ad vissza. Ez a jogkivonat-sztring tartalmazza az SAS összes paraméterét, 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 azure-Storage-tárolóhoz, 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.
Az alábbi példa bemutatja, hogyan kérhet le egy í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;
Kimeneti fájlok megadása a feladat kimenetéhez
Egy feladat 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.
Az alábbi 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 output.txt
, amelyet 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 és stderr.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 Linux rendszeren használja, ügyeljen arra, hogy a fordított perjeleket perjelek elé állítsa.
Kimeneti fájlok megadása felügyelt identitással
Ahelyett, hogy a tárolóhoz írási hozzáféréssel rendelkező SAS-t hoz létre és ad át a Batchnek, egy felügyelt identitással hitelesíthető az Azure Storage. 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ó, hogy sas helyett a felügyelt identitást használja 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 az OutputFile.FilePattern tulajdonság használatával megadhatja a fájlmintát az egyeztetéshez. A fájlminta nulla fájllal, egyetlen fájllal vagy a feladat által létrehozott fájlkészlettel egyezhet.
A FilePattern tulajdonság támogatja a szabványos fájlrendszer helyettesítő karaktereit, 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 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
Az OutputFileUploadOptions.UploadCondition tulajdonság engedélyezi a kimeneti fájlok feltételes feltöltését. Gyakori forgatókönyv, hogy egy fájlkészletet tölt fel, ha a feladat sikeres, és ha nem sikerül, másik fájlkészletet kell feltöltenie. Előfordulhat például, hogy csak akkor szeretne részletes naplófájlokat feltölteni, ha a feladat meghiúsul, és nem 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 taskCompletion értékre állítja az UploadCondition tulajdonságot. 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 feladatok tevékenységei azonos nevű fájlokat hozhatnak létre. Például minden stdout.txt
stderr.txt
feladatban futó feladathoz létrejön. Mivel minden feladat a saját környezetében fut, ezek a fájlok nem ütköznek a csomópont fájlrendszerén. Ha azonban több feladatból tölt fel fájlokat egy megosztott tárolóba, azonos nevű fájlokat kell egyértelműsítenie.
Az OutputFileBlobContainerDestination. Az Elérési út tulajdonság a kimeneti fájlok célblobjának vagy virtuális könyvtárának megadása. A Path 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. A feladatazonosítót az elérési úton használva biztosíthatja az egyedi neveket és a fájlok egyszerű azonosítását.
Ha a FilePattern tulajdonság helyettesítő karakteres 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évre van beállítva, ami azt jelenti, hogy nem tartalmaz helyettesítő karaktereket, akkor az Elérési út tulajdonság értéke a teljes blobnevet adja meg. Ha több feladat egyetlen fájljával való elnevezési ütközésekre számít, akkor 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 feladatkészlet 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 virtuális könyvtárairól további információt a tárolóban lévő blobok listázása című témakörben talál.
Fájlfeltöltési hibák diagnosztizálása
Ha a kimeneti fájlok Azure Storage 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 annak megállapításához, hogy mi történt. Íme 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, fileuploadout.txt
és fileuploaderr.txt
a . Ezeket a naplófájlokat megvizsgálva többet tudhat meg egy adott hibáról. Olyan esetekben, amikor a fájl feltöltését soha nem kísérelték meg, például mert maga a feladat nem tudott futni, akkor ezek a naplófájlok nem léteznek.
A fájlfeltöltés teljesítményének diagnosztizálása
A fileuploadout.txt
fájlnaplók feltöltik a folyamatot. 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énynek számos tényezője van, beleértve a csomópont méretét, a csomóponton a feltöltéskor végzett egyéb tevékenységeket, azt, hogy a céltároló ugyanabban a régióban van-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-jával megőrzi a feladat kimenetét, tetszés szerint elnevezheti a céltárolót és a blobokat. A Batch-fájlkonvenciók szabványa szerint is elnevezheti őket. A Fájlkonvenciós szabvány az Azure Storage céltárolójának és blobjának nevét határozza meg egy adott kimeneti fájlhoz 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 a Azure Portal.
Ha C# nyelven fejleszt, használhatja a Batch File Conventions .NET-hez készült kódtárába beépített metódusokat. Ez a kódtár létrehozza a megfelelően elnevezett tárolókat és blobelérési ú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 visszaadhatja a tárolóba íráshoz használt közös hozzáférésű jogosultságkód (SAS) URL-címét. Ezt az SAS-t ezután átadhatja az OutputFileBlobContainerDestination konstruktornak.
Ha nem C# nyelven fejleszt, a Fájlkonvenciók szabványt 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éloldali kódtár a .NET-hez a feladat kimenetének tartós tárolóban való megőrzéséhez. A minta futtatásához kövesse az alábbi lépéseket:
- Nyissa meg a projektet Visual Studio 2019-ben.
- Adja hozzá a Batch- és Storage-fiók hitelesítő adatait az AccountSettings.settings fájlhoz a Microsoft.Azure.Batch.Samples.Common projektben.
- Hozza létre (de ne futtassa) a megoldást. Ha a rendszer kéri, állítsa vissza a NuGet-csomagokat.
- A Azure Portal használatával feltölthet egy alkalmazáscsomagot a PersistOutputsTask alkalmazáscsomaghoz. Vegye fel a
PersistOutputsTask.exe
függő szerelvényeket a .zip csomagba, á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, írja be a 2 értéket a minta a Batch szolgáltatás API-val történő futtatásához a feladat kimenetének megőrzéséhez.
- Szükség esetén futtassa újra a mintát, és adja meg a 3 értéket a kimenet 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 File Conventions szabványnak megfelelően.
Következő lépések
- A feladatkimenetek .NET-hez készült Fájlkonvenciós kódtárával való megőrzésével kapcsolatos további információkért lásd: Feladat- és tevékenységadatok megőrzése az Azure Storage a Batch File Conventions .NET-hez készült kódtára segítségével.
- A kimeneti adatok Azure Batch történő megőrzésének egyéb megközelítéseiről a Feladatok és tevékenységek kimenetének megőrzése az Azure Storage-ben című témakörben olvashat.