Megosztás a következőn keresztül:


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

  1. Nyissa meg a projektet a Visual Studio 2019-ben.
  2. 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.
  3. Hozza létre (de ne futtassa) a megoldást. Ha a rendszer kéri, állítsa vissza a NuGet-csomagokat.
  4. 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.
  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, a 2. lépéssel futtassa a mintát a Batch szolgáltatás API-val a feladat kimenetének megőrzéséhez.
  7. 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