Zachování dat úloh ve službě Azure Storage pomocí rozhraní API služby Batch

Úloha spuštěná ve službě Azure Batch může při spuštění vytvářet výstupní data. Výstupní data úlohy je často potřeba uložit pro načtení jinými úkoly v úloze, klientskou aplikaci, která úlohu spustila, nebo obojí. Úkoly zapisují výstupní data do systému souborů výpočetního uzlu Batch, ale všechna data na uzlu se ztratí, když se zmage nebo když uzel opustí fond. Úkoly můžou mít také dobu uchovávání souborů, po které se odstraní soubory vytvořené úkolem. Z těchtodůvodůch

Možnosti účtu úložiště ve službě Batch najdete v tématu Účty Batch a účty Azure Storage.

Rozhraní API služby Batch podporuje zachování výstupních dat do služby Azure Storage pro úlohy a úlohy správce úloh, které běží ve fondech s konfigurací virtuálního počítače. Když přidáte úlohu, můžete jako cíl výstupu úkolu zadat kontejner ve službě Azure Storage. Služba Batch pak po dokončení úlohy zapíše do daného kontejneru veškerá výstupní data.

Při použití rozhraní API služby Batch k zachování výstupu úlohy nemusíte upravovat aplikaci, na které je úloha spuštěná. Místo toho můžete s několika úpravami klientské aplikace zachovat výstup úlohy ve stejném kódu, který úlohu vytvoří.

Důležité

Zachování dat úloh do služby Azure Storage pomocí rozhraní API služby Batch nefunguje s fondy vytvořenými před 1. únorem 2018.

Kdy k zachování výstupu úlohy používám rozhraní API služby Batch?

Azure Batch nabízí více způsobů, jak zachovat výstup úkolu. Použití rozhraní API služby Batch je pohodlný přístup, který je nejvhodnější pro tyto scénáře:

  • Chcete napsat kód pro zachování výstupu úlohy z klientské aplikace, aniž byste museli upravovat aplikaci, která je spuštěná.
  • Chcete zachovat výstup z úkolů služby Batch a úloh správce úloh ve fondech vytvořených s konfigurací virtuálního počítače.
  • Chcete zachovat výstup do kontejneru Azure Storage s libovolným názvem.
  • Chcete zachovat výstup do kontejneru služby Azure Storage s názvem podle standardu Batch File Conventions.

Pokud se váš scénář liší od výše uvedených scénářů, možná budete muset zvážit jiný přístup. Rozhraní API služby Batch například v současné době nepodporuje výstup streamování do Služby Azure Storage, když je úloha spuštěná. Pokud chcete streamovat výstup, zvažte použití knihovny Batch File Conventions, která je k dispozici pro .NET. V případě jiných jazyků budete muset implementovat vlastní řešení. Další informace o dalších možnostech najdete v tématu Zachování výstupu úlohy a úlohy do služby Azure Storage.

Vytvoření kontejneru ve službě Azure Storage

Pokud chcete zachovat výstup úlohy do Služby Azure Storage, budete muset vytvořit kontejner, který slouží jako cíl pro výstupní soubory. Před spuštěním úlohy vytvořte kontejner, nejlépe před odesláním úlohy pomocí příslušné klientské knihovny nebo sady SDK služby Azure Storage. Další informace o rozhraních API služby Azure Storage najdete v dokumentaci ke službě Azure Storage.

Pokud například píšete aplikaci v jazyce C#, použijte klientskou knihovnu Azure Storage pro .NET. Následující příklad ukazuje, jak vytvořit kontejner:

CloudBlobContainer container = storageAccount.CreateCloudBlobClient().GetContainerReference(containerName);
await container.CreateIfNotExists();

Určení výstupních souborů pro výstup úkolu

Chcete-li zadat výstupní soubory pro úlohu, vytvořte kolekci outputFile objekty a přiřaďte jej ke vlastnosti CloudTask.OutputFiles při vytváření úlohy. K ověření přístupu ke kontejneru můžete použít sdílený přístupový podpis (SAS) nebo spravovanou identitu.

Použití sdíleného přístupového podpisu

Po vytvoření kontejneru získejte sdílený přístupový podpis (SAS) s přístupem k zápisu do kontejneru. Sas poskytuje delegovaný přístup ke kontejneru. Sas uděluje přístup se zadanou sadou oprávnění a v zadaném časovém intervalu. Služba Batch potřebuje SAS s oprávněními k zápisu výstupu úlohy do kontejneru. Další informace o SAS najdete v tématu Použití sdílených přístupových podpisů (SAS) ve službě Azure Storage.

Když získáte SAS pomocí rozhraní API služby Azure Storage, vrátí rozhraní API řetězec tokenu SAS. Tento řetězec tokenu obsahuje všechny parametry SAS, včetně oprávnění a intervalu platnosti SAS. Pokud chcete použít SAS pro přístup ke kontejneru ve službě Azure Storage, musíte k identifikátoru URI prostředku připojit řetězec tokenu SAS. Identifikátor URI prostředku společně s připojeným tokenem SAS poskytuje ověřený přístup ke službě Azure Storage.

Následující příklad ukazuje, jak získat řetězec tokenu SAS jen pro zápis pro kontejner a pak připojí SAS k identifikátoru URI kontejneru:

string containerSasToken = container.GetSharedAccessSignature(new SharedAccessBlobPolicy()
{
    SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddDays(1),
    Permissions = SharedAccessBlobPermissions.Write
});

string containerSasUrl = container.Uri.AbsoluteUri + containerSasToken;

Následující příklad kódu jazyka C# vytvoří úlohu, která zapíše náhodná čísla do souboru s názvem output.txt. Příklad vytvoří výstupní soubor pro output.txt zápis do kontejneru. Příklad také vytvoří výstupní soubory pro všechny soubory protokolu, které odpovídají vzoru std*.txt souboru (napřstdout.txt. a stderr.txt). Adresa URL kontejneru vyžaduje SAS, který byl pro kontejner vytvořen dříve. Služba Batch používá SAS k ověření přístupu ke kontejneru.

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)),
}

Poznámka:

Pokud používáte tento příklad s Linuxem, nezapomeňte změnit zpětná lomítka na lomítka.

Použití spravované identity

Místo generování a předávání SAS s přístupem k zápisu do kontejneru do služby Batch je možné spravovanou identitu použít k ověření ve službě Azure Storage. Identita musí být přiřazena k fondu batch a také musí mít přiřazenou Storage Blob Data Contributor roli pro zápis kontejneru. Službu Batch pak můžete říct, aby používala spravovanou identitu místo SAS k ověření přístupu ke kontejneru.

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))
    }
}

Určení vzoru souboru pro porovnávání

Když zadáte výstupní soubor, můžete použít OutputFile.FilePattern vlastnost určit vzor souboru pro porovnávání. Vzor souboru se může shodovat s nulovými soubory, jedním souborem nebo sadou souborů vytvořených úlohou.

Vlastnost FilePattern podporuje standardní zástupné cardy systému souborů, jako * jsou (pro nerekurzivní shody) a ** (pro rekurzivní shody). Například výše uvedený vzor kódu určuje vzor souboru, který se má shodovat std*.txt s nerekurzivně:

filePattern: @"..\std*.txt"

Pokud chcete nahrát jeden soubor, zadejte vzor souboru bez zástupných znaků. Příklad kódu výše určuje vzor souboru, který se má shodovat output.txt:

filePattern: @"output.txt"

Zadání podmínky nahrání

Vlastnost OutputFileUploadOptions.UploadCondition umožňuje podmíněné nahrávání výstupních souborů. Běžným scénářem je nahrání jedné sady souborů, pokud je úloha úspěšná, a pokud selže, jiná sada souborů. Například můžete chtít nahrát podrobné soubory protokolu pouze v případě, že úloha selže a ukončí s nenulovým ukončovacím kódem. Podobně můžete chtít nahrát výsledné soubory jenom v případě, že úloha bude úspěšná, protože tyto soubory můžou chybět nebo neúplné, pokud úloha selže.

Ukázka kódu výše nastaví UploadCondition vlastnost TaskCompletion. Toto nastavení určuje, že se soubor má nahrát po dokončení úkolů bez ohledu na hodnotu ukončovacího kódu.

uploadCondition: OutputFileUploadCondition.TaskCompletion

Další nastavení naleznete ve výčtu OutputFileUploadCondition .

Nejednoznačné soubory se stejným názvem

Úkoly v úloze můžou vytvářet soubory se stejným názvem. Vytvoří se například stdout.txtstderr.txt pro každý úkol, který běží v úloze. Vzhledem k tomu, že každá úloha běží v vlastním kontextu, tyto soubory nejsou v systému souborů uzlu v konfliktu. Když ale nahrajete soubory z více úkolů do sdíleného kontejneru, budete muset nejednoznačit soubory se stejným názvem.

OutputFileBlobContainerDestination .Vlastnost Cesta určuje cílový objekt blob nebo virtuální adresář pro výstupní soubory. Vlastnost Path můžete použít k pojmenování objektu blob nebo virtuálního adresáře takovým způsobem, aby výstupní soubory se stejným názvem byly jedinečně pojmenované ve službě Azure Storage. Použití ID úkolu v cestě je dobrý způsob, jak zajistit jedinečné názvy a snadno identifikovat soubory.

Pokud FilePattern vlastnost je nastavena na zástupný znak výraz, pak všechny soubory, které odpovídají vzoru, jsou odeslány do virtuálního adresáře určené path vlastnost. Pokud je mycontainerkontejner například , ID úlohy je mytaska vzor souboru je ..\std*.txt, pak absolutní identifikátory URI výstupních souborů ve službě Azure Storage budou podobné:

https://myaccount.blob.core.windows.net/mycontainer/mytask/stderr.txt
https://myaccount.blob.core.windows.net/mycontainer/mytask/stdout.txt

Pokud je vlastnost FilePattern nastavena tak, aby odpovídala jednomu názvu souboru, což znamená, že neobsahuje žádné zástupné znaky, pak hodnota Path vlastnost určuje plně kvalifikovaný název objektu blob. Pokud očekáváte konflikty pojmenování s jedním souborem z více úloh, zahrňte název virtuálního adresáře jako součást názvu souboru, aby se tyto soubory nejednoznačné. Například nastavte vlastnost Path tak, aby zahrnovala ID úkolu, znak oddělovače (obvykle lomítko) a název souboru:

path: taskId + @"/output.txt"

Absolutní identifikátory URI výstupních souborů pro sadu úkolů budou podobné:

https://myaccount.blob.core.windows.net/mycontainer/task1/output.txt
https://myaccount.blob.core.windows.net/mycontainer/task2/output.txt

Další informace o virtuálních adresářích ve službě Azure Storage najdete v tématu Výpis objektů blob v kontejneru.

Mnoho výstupních souborů

Když úloha určuje řadu výstupních souborů, můžete narazit na limity uložené rozhraním API služby Azure Batch. Doporučujeme zachovat malé úkoly a zachovat nízký počet výstupních souborů.

Pokud narazíte na limity, zvažte snížení počtu výstupních souborů použitím vzorů souborů nebo použitím kontejnerů souborů, jako je tar nebo zip ke konsolidaci výstupních souborů. Alternativně můžete k zachování výstupních dat využít připojení nebo jiné přístupy (viz Zachování úlohy a výstupu úkolu).

Diagnostika chyb nahrávání souborů

Pokud nahrávání výstupních souborů do Služby Azure Storage selže, úloha se přesune do stavu Dokončeno a TaskExecutionInformation.Vlastnost FailureInformation je nastavena. Prozkoumejte Vlastnost FailureInformation a určete, k jaké chybě došlo. Tady je například chyba, ke které dochází při nahrání souboru, pokud se kontejner nenajde:

Category: UserError
Code: FileUploadContainerNotFound
Message: One of the specified Azure container(s) was not found while attempting to upload an output file

Při každém nahrání souboru služba Batch zapíše dva soubory protokolu do výpočetního uzlu fileuploadout.txt a fileuploaderr.txt. V těchto souborech protokolu můžete prozkoumat další informace o konkrétním selhání. V případech, kdy se nahrávání souboru nikdy nepokusilo, například kvůli tomu, že se samotný úkol nepovedlo spustit, tyto soubory protokolu nebudou existovat.

Diagnostika výkonu nahrávání souborů

Průběh fileuploadout.txt nahrávání do protokolu souboru. V tomto souboru se dozvíte více o tom, jak dlouho trvá nahrávání souborů. Mějte na paměti, že výkon nahrávání má mnoho faktorů, včetně velikosti uzlu, jiné aktivity na uzlu v době nahrávání, jestli je cílový kontejner ve stejné oblasti jako fond Batch, kolik uzlů se nahrává na účet úložiště současně atd.

Použití rozhraní API služby Batch se standardem Batch File Conventions

Při zachování výstupu úlohy pomocí rozhraní API služby Batch můžete cílový kontejner a objekty blob pojmenovat, ale chcete. Můžete je také pojmenovat podle standardu Batch File Conventions. Standard File Conventions určuje názvy cílového kontejneru a objektu blob ve službě Azure Storage pro daný výstupní soubor na základě názvů úlohy a úlohy. Pokud pro pojmenování výstupních souborů používáte standard File Conventions, jsou výstupní soubory k dispozici pro zobrazení na webu Azure Portal.

Pokud vyvíjíte v jazyce C#, můžete použít metody integrované v knihovně Batch File Conventions pro .NET. Tato knihovna za vás vytvoří správně pojmenované kontejnery a cesty k objektům blob. Můžete například volat rozhraní API, abyste získali správný název kontejneru na základě názvu úlohy:

string containerName = job.OutputStorageContainerName();

Pomocí metody CloudJobExtensions.GetOutputStorageContainerUrl můžete vrátit adresu URL sdíleného přístupového podpisu (SAS), která se používá k zápisu do kontejneru. Tento SAS pak můžete předat outputFileBlobContainerDestination konstruktoru.

Pokud vyvíjíte v jiném jazyce než C#, budete muset implementovat standard File Conventions sami.

Ukázka kódu

Ukázkový projekt PersistOutputs je jednou z ukázek kódu služby Azure Batch na GitHubu. Toto řešení sady Visual Studio ukazuje, jak používat klientskou knihovnu Batch pro .NET k zachování výstupu úlohy do odolného úložiště. Ukázku spustíte takto:

  1. Otevřete projekt v sadě Visual Studio 2019.
  2. Přidejte přihlašovací údaje účtu Batch a Storage do účtu Nastavení.settings v projektu Microsoft.Azure.Batch.Samples.Common.
  3. Sestavte (ale nespustíte) řešení. Pokud se zobrazí výzva, obnovte všechny balíčky NuGet.
  4. Pomocí webu Azure Portal nahrajte balíček aplikace pro PersistOutputsTask. PersistOutputsTask.exe Zahrnout a jeho závislá sestavení v balíčku .zip, nastavit ID aplikace na "PersistOutputsTask" a verze balíčku aplikace na "1.0".
  5. Spusťte (spusťte ) projekt PersistOutputs .
  6. Po zobrazení výzvy k výběru technologie trvalosti, která se má použít pro spuštění ukázky, zadejte 2 , aby se ukázka spustila pomocí rozhraní API služby Batch k zachování výstupu úlohy.
  7. V případě potřeby znovu spusťte ukázku, zadejte 3 pro zachování výstupu pomocí rozhraní API služby Batch a také název cílového kontejneru a cesty k objektu blob podle standardu File Conventions.

Další kroky