Uložit data úloh a úkolů na Azure Storage pomocí knihovny Batch File Conventions pro .NET

Úloha spuštěná v 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 služby Batch, ale všechna data na uzlu se ztratí, když se přeinstaluje nebo když uzel opustí skupinu. Úkoly můžou mít také dobu uchovávání souborů, po které se odstraní soubory vytvořené úkolem. Z těchto důvodů je důležité zachovat výstup úlohy, který budete potřebovat později do úložiště dat, jako je Azure Storage.

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

Data úkolů z Azure Batch můžete zachovat pomocí knihovny File Conventions pro .NET. Knihovna Konvence souborů zjednodušuje proces ukládání a načítání výstupních dat úloh do Azure Storage. Knihovnu File Conventions můžete použít v úloze i v kódu klienta. V režimu úloh použijte knihovnu k uchování souborů. V klientském režimu použijte knihovnu k výpisu a načtení souborů. Kód úkolu může také načíst výstup upstreamových úloh pomocí knihovny, například ve scénáři závislostí úkolů .

Pokud chcete načíst výstupní soubory s knihovnou File Conventions, vyhledejte soubory pro úlohu nebo úlohu. Nemusíte znát názvy ani umístění souborů. Místo toho můžete zobrazit seznam souborů podle ID a účelu. Můžete například zobrazit seznam všech zprostředkujících souborů pro daný úkol. Nebo získejte náhledový soubor pro danou úlohu.

Od verze 2017-05-01 podporuje rozhraní API služby Batch trvalé ukládání výstupních dat do Azure Storage pro úlohy a úlohy správce úloh, které běží na fondech vytvořených s konfigurací virtuálního počítače. Výstup můžete zachovat v kódu, který vytvoří úlohu. Tato metoda je alternativou k knihovně File Conventions. Klientské aplikace Batch můžete upravit tak, aby zachovaly výstup, aniž byste museli aktualizovat aplikaci, na které je úloha spuštěná. Další informace najdete v tématu Ukládání dat úloh do Azure Storage pomocí rozhraní API služby Batch.

Případy použití knihovny

Azure Batch nabízí několik způsobů, jak zachovat výstup úkolu. Použijte knihovnu pro konvence souborů, když chcete:

  • Upravte kód aplikace, na které je úloha spuštěná, aby se zachovaly soubory.
  • Streamujte data do Azure Storage, zatímco úloha je stále spuštěná.
  • Zachování dat z poolů
  • Vyhledejte a stáhněte výstupní soubory úkolů podle ID nebo účelu v klientské aplikaci nebo jiných úlohách.
  • Prohlédněte si výstup úlohy na portálu Azure.

V jiných scénářích můžete chtít zvážit jiný přístup. Další informace o dalších možnostech najdete v tématu Výkon úloha a výstup úkolu do Azure Storage.

Co je standard Batch File Conventions?

Standard Batch File Conventions poskytuje schéma pojmenování pro cílové kontejnery a cesty k objektům blob, do kterých se zapisují výstupní soubory. Soubory trvale uložené v úložišti Azure, které dodržují standard, se automaticky zobrazují na portálu Azure.

Knihovna File Conventions pro .NET automaticky pojmenuje kontejnery úložiště a výstupní soubory úkolů podle standardu. Knihovna také poskytuje metody dotazování výstupních souborů v Azure Storage. Můžete se dotazovat podle ID úlohy, ID úkolu nebo účelu.

Pokud vyvíjíte s jiným jazykem než .NET, můžete ve své aplikaci implementovat standard File Conventions. Další informace naleznete v tématu Implementace standardu Batch File Conventions.

Pokud chcete zachovat výstupní data do Azure Storage pomocí knihovny File Conventions, nejprve propojte účet Azure Storage s účtem Batch.

  1. Přihlaste se k portálu Azure.
  2. Na panelu hledání vyhledejte a vyberte Batch .
  3. Vyberte účet Batch, který chcete propojit s Azure Storage.
  4. Na stránce účtu Batch v části Nastavení vyberte Účet úložiště.
  5. Pokud ještě nemáte účet Azure Storage přidružený k vašemu účtu Batch, vyberte Storage Account (None).
  6. Vyberte účet Azure Storage, který chcete použít. Pokud chcete dosáhnout nejlepšího výkonu, použijte účet ve stejné oblasti jako účet Batch.

Uchování výstupních dat

Výstupní data úloh a úkolů můžete zachovat pomocí knihovny File Conventions. Nejprve v Azure Storage vytvořte kontejner. Pak výstup uložte do kontejneru. K nahrání výstupu úlohy do kontejneru použijte klientskou knihovnu Azure Storage pro .NET.

Další informace o práci s kontejnery a blob v Azure Storage viz Začínáme s Azure Blob Storage pomocí .NET.

Všechny výstupy úloh a úkolů uložené pomocí knihovny File Conventions jsou uchovány ve stejném kontejneru. Pokud se velký počet úkolů pokusí uchovat soubory najednou, mohou být vynuceny limity omezování Azure Storage. Další informace najdete v Kontrolním seznamu výkonu a škálovatelnosti pro blob storage.

Vytvořte úložný kontejner

Pokud chcete zachovat výstup úkolu do Azure Storage, nejprve vytvořte kontejner voláním CloudJob.PrepareOutputStorageAsync. Tato metoda rozšíření přebírá jako parametr objekt CloudStorageAccount . Metoda vytvoří kontejner pojmenovaný podle standardu File Conventions. Obsah kontejneru je možné zjistit pomocí portálu Azure a metod načítání popsaných v tomto článku.

Obvykle vytvořte kontejner ve vaší klientské aplikaci, který pak vytváří fondy, úlohy a úkoly. Například:

CloudJob job = batchClient.JobOperations.CreateJob(
    "myJob",
    new PoolInformation { PoolId = "myPool" });

// Create reference to the linked Azure Storage account
CloudStorageAccount linkedStorageAccount =
    new CloudStorageAccount(myCredentials, true);

// Create the blob storage container for the outputs
await job.PrepareOutputStorageAsync(linkedStorageAccount);

Ukládání výstupů úkolů

Po vytvoření kontejneru úložiště můžou úlohy ukládat výstup do kontejneru pomocí TaskOutputStorage. Tato třída je k dispozici v knihovně File Conventions.

V kódu úkolu vytvořte TaskOutputStorage objekt. Po dokončení úkolu volejte TaskOutputStorage. Metoda SaveAsync Tento krok uloží výstup do Azure Storage.

CloudStorageAccount linkedStorageAccount = new CloudStorageAccount(myCredentials);
string jobId = Environment.GetEnvironmentVariable("AZ_BATCH_JOB_ID");
string taskId = Environment.GetEnvironmentVariable("AZ_BATCH_TASK_ID");

TaskOutputStorage taskOutputStorage = new TaskOutputStorage(
    linkedStorageAccount, jobId, taskId);

/* Code to process data and produce output file(s) */

await taskOutputStorage.SaveAsync(TaskOutputKind.TaskOutput, "frame_full_res.jpg");
await taskOutputStorage.SaveAsync(TaskOutputKind.TaskPreview, "frame_low_res.jpg");

Parametr kindTaskOutputStorage.Metoda SaveAsync kategorizuje trvalé soubory. Existují čtyři předdefinované typy TaskOutputKind: TaskOutput, TaskPreviewTaskLog, a TaskIntermediate. Můžete také definovat vlastní kategorie výstupu.

Určete, jaký typ výstupů se má vypsat při pozdějším dotazování služby Batch. Když pak vypíšete výstupy pro úlohu, můžete filtrovat podle jednoho z typů výstupu. Například vyfiltrujte "Dejte mi náhled výstupu úkolu 109". Další informace naleznete v tématu Načtení výstupních dat.

Typ výstupu také určuje, kde se na portálu Azure zobrazí soubor output. Soubory v kategorii TaskOutput jsou ve výstupních souborech úkolů. Soubory v kategorii TaskLog jsou v protokolech úloh.

Ukládání výstupů úloh

Můžete také uložit výstupy přidružené k celé úloze. Například ve slučovací úloze úlohy vykreslování videa můžete zachovat plně vykreslený film jako výstup úlohy. Po dokončení úlohy může klientská aplikace vypsat a načíst výstupy úlohy. Vaše klientská aplikace nemusí dotazovat jednotlivé úlohy.

Výstup úlohy uložte voláním JobOutputStorage. Metoda SaveAsync Zadejte jobOutputKind a název souboru. Například:

CloudJob job = new JobOutputStorage(acct, jobId);
JobOutputStorage jobOutputStorage = job.OutputStorage(linkedStorageAccount);

await jobOutputStorage.SaveAsync(JobOutputKind.JobOutput, "mymovie.mp4");
await jobOutputStorage.SaveAsync(JobOutputKind.JobPreview, "mymovie_preview.mp4");

Stejně jako u typu TaskOutputKind pro výstupy úkolů použijte typ JobOutputKind ke kategorizaci trvalých souborů úlohy. Později můžete zobrazit seznam konkrétního typu výstupu. Typ JobOutputKind zahrnuje výstupní i náhledové kategorie. Tento typ také podporuje vytváření vlastních kategorií.

Ukládání protokolů úloh

Je také možné, že budete muset zachovat soubory, které se aktualizují během provádění úlohy. Můžete například potřebovat zachovat soubory protokolu nebo stdout.txt a stderr.txt. Knihovna File Conventions poskytuje metodu TaskOutputStorage.SaveTrackedAsync pro zachování těchto typů souborů. Sledujte aktualizace souboru na uzlu v zadaném intervalu pomocí saveTrackedAsync. Pak uložte tyto aktualizace do úložiště Azure.

Následující příklad používá SaveTrackedAsync k aktualizaci stdout.txt v Azure Storage každých 15 sekund během provádění úlohy:

TimeSpan stdoutFlushDelay = TimeSpan.FromSeconds(3);
string logFilePath = Path.Combine(
    Environment.GetEnvironmentVariable("AZ_BATCH_TASK_DIR"), "stdout.txt");

// The primary task logic is wrapped in a using statement that sends updates to
// the stdout.txt blob in Storage every 15 seconds while the task code runs.
using (ITrackedSaveOperation stdout =
        await taskStorage.SaveTrackedAsync(
        TaskOutputKind.TaskLog,
        logFilePath,
        "stdout.txt",
        TimeSpan.FromSeconds(15)))
{
    /* Code to process data and produce output file(s) */

    // We are tracking the disk file to save our standard output, but the
    // node agent may take up to 3 seconds to flush the stdout stream to
    // disk. So give the file a moment to catch up.
     await Task.Delay(stdoutFlushDelay);
}

Zakomentovaný oddíl Code to process data and produce output file(s) nahraďte jakýmkoli kódem, který váš úkol normálně dělá. Můžete mít například kód, který stahuje data z Azure Storage a pak provádí transformace nebo výpočty. Tento kód můžete zabalit do using bloku a pravidelně aktualizovat soubor pomocí SaveTrackedAsync.

Agent uzlu je program, který je spuštěn na každém uzlu ve fondu. Tento program poskytuje rozhraní příkazového a řídicího rozhraní mezi uzlem a službou Batch. Volání Task.Delay se vyžaduje na konci tohoto using bloku. Volání zajišťuje, že agent uzlu má čas vyprázdnit obsah standardního stdout.txt souboru na uzlu. Bez tohoto zpoždění je možné vynechat posledních několik sekund výstupu. Toto zpoždění možná nebudete potřebovat pro všechny soubory.

Když povolíte sledování souborů pomocí SaveTrackedAsync, do Azure Storage budou zachovány pouze přírůstky. Tuto metodu použijte pouze ke sledování nerotujících souborů protokolu nebo jiných souborů, které jsou zapisované pomocí operací připojení ke konci souboru.

Načtení výstupních dat

Pokud chcete načíst výstupní soubory pro konkrétní úkol nebo úlohu, nemusíte znát cestu v Azure Storage ani v názvech souborů. Místo toho můžete požadovat soubory výstupu podle ID úlohy nebo úkolu.

Následující příklad kódu iteruje úkoly úlohy. Dále kód vytiskne některé informace o výstupních souborech pro úlohu. Pak kód stáhne soubory z AzureStorage.

foreach (CloudTask task in myJob.ListTasks())
{
    foreach (OutputFileReference output in
        task.OutputStorage(storageAccount).ListOutputs(
            TaskOutputKind.TaskOutput))
    {
        Console.WriteLine($"output file: {output.FilePath}");

        output.DownloadToFileAsync(
            $"{jobId}-{output.FilePath}",
            System.IO.FileMode.Create).Wait();
    }
}

Zobrazení výstupních souborů na portálu Azure

Pokud výstupní soubory úkolů používají standard Batch File Conventions, můžete je zobrazit na portálu Azure.

Pokud chcete povolit zobrazení výstupních souborů na portálu, musíte splňovat následující požadavky:

Aby se výstupní soubory automaticky zobrazovaly na portálu Azure, musíte:

  1. Připojte účet Azure Storage k vašemu účtu Batch.
  2. Postupujte podle předdefinovaných zásad vytváření názvů pro kontejnery a soubory Azure Storage. Pokud použijete knihovnu File Conventions k zachování výstupu, soubory se zachovají podle standardu File Conventions.

Zobrazení výstupních souborů úloh a protokolů na portálu Azure:

  1. Přihlaste se k portálu Azure.
  2. Přejděte na úkol, pro který chcete zobrazit výstup.
  3. Vyberte uložené výstupní soubory nebo uložené protokoly.

Ukázka kódu

Ukázkový projekt PersistOutputs je jedním z Azure Batch ukázek kódu na GitHub. Toto Visual Studio řešení ukazuje, jak používat knihovnu Azure Batch File Conventions k zachování výstupu úlohy do odolného úložiště. Ukázku spustíte takto:

  1. Otevřete projekt v Visual Studio 2019.
  2. Přidejte přístupové údaje účtu Batch a Azure Storage do AccountSettings.settings v Batch.Samples.Common projektu Microsoft.Azure.
  3. Sestavte řešení. Řešení zatím nespusívejte.
  4. Pokud se zobrazí výzva, obnovte všechny balíčky NuGet.
  5. Nahrajte balíček application pro PersistOutputsTask prostřednictvím portálu Azure.
    1. PersistOutputsTask.exe Do balíčku .zip zahrňte spustitelný soubor a jeho závislá sestavení.
    2. Nastavte ID aplikace na PersistOutputsTask.
    3. Nastavte verzi balíčku aplikace na 1.0.
  6. Vyberte Spustit a spusťte projekt.
  7. Po zobrazení výzvy k výběru technologie trvalosti, která se má použít, zadejte 1. Tato možnost spustí ukázku pomocí knihovny File Conventions k zachování výstupu úlohy.

Získání knihovny Batch File Conventions pro .NET

Knihovna Batch File Conventions pro .NET je k dispozici na NuGet. Knihovna rozšiřuje třídy CloudJob a CloudTask o nové metody. Další informace najdete v referenční dokumentaci ke knihovně File Conventions.

Zdrojový kód knihovny File Conventions je k dispozici na GitHub.

Další kroky