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.txtfá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.txtfá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.txtstderr.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.txta . 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:

  1. Nyissa meg a projektet Visual Studio 2019-ben.
  2. Adja hozzá a Batch- és Storage-fiók hitelesítő adatait az AccountSettings.settings fájlhoz a Microsoft.Azure.Batch.Samples.Common projektben.
  3. Hozza létre (de ne futtassa) a megoldást. Ha a rendszer kéri, állítsa vissza a NuGet-csomagokat.
  4. 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.
  5. Indítsa el (futtassa) a PersistOutputs projektet.
  6. 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.
  7. 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