Taak- en taakgegevens behouden in Azure Storage met de bibliotheek batchbestandsconventies voor .NET
Een taak die wordt uitgevoerd in Azure Batch kan uitvoergegevens produceren wanneer deze wordt uitgevoerd. Taakuitvoergegevens moeten vaak worden opgeslagen om op te halen door andere taken in de taak, de clienttoepassing die de taak heeft uitgevoerd of beide. Taken schrijven uitvoergegevens naar het bestandssysteem van een Batch-rekenknooppunt, maar alle gegevens op het knooppunt gaan verloren wanneer de installatiekopie opnieuw wordt gemaakt of wanneer het knooppunt de pool verlaat. Taken kunnen ook een bewaarperiode voor bestanden hebben, waarna bestanden die door de taak zijn gemaakt, worden verwijderd. Om deze redenen is het belangrijk om taakuitvoer die u later nodig hebt, vast te houden in een gegevensarchief zoals Azure Storage.
Zie Batch-accounts en Azure Storage-accounts voor opties voor opslagaccounts in Batch.
U kunt taakgegevens uit Azure Batch behouden met behulp van de bestandsconventiesbibliotheek voor .NET. De bibliotheek Bestandsconventies vereenvoudigt het proces voor het opslaan en ophalen van taakuitvoergegevens in Azure Storage. U kunt de bibliotheek Bestandsconventies gebruiken in zowel taak- als clientcode. Gebruik in de taakmodus de bibliotheek om bestanden te behouden. Gebruik in de clientmodus de bibliotheek om bestanden weer te geven en op te halen. Uw taakcode kan ook de uitvoer van upstream-taken ophalen met behulp van de bibliotheek, zoals in een scenario met taakafhankelijkheden .
Als u uitvoerbestanden wilt ophalen met de bibliotheek Bestandsconventies, zoekt u de bestanden voor een taak of taak. U hoeft de namen of locaties van de bestanden niet te weten. In plaats daarvan kunt u de bestanden weergeven op id en doel. Geef bijvoorbeeld alle tussenliggende bestanden voor een bepaalde taak weer. U kunt ook een voorbeeldbestand voor een bepaalde taak ophalen.
Vanaf versie 2017-05-01 biedt de Batch-service-API ondersteuning voor het persistent maken van uitvoergegevens naar Azure Storage voor taken en taakbeheertaken die worden uitgevoerd op pools die zijn gemaakt met de vm-configuratie (virtuele machine). U kunt uitvoer behouden vanuit de code waarmee een taak wordt gemaakt. Deze methode is een alternatief voor de bibliotheek Bestandsconventies. U kunt uw Batch-clienttoepassingen wijzigen om de uitvoer te behouden zonder dat u de toepassing hoeft bij te werken die op uw taak wordt uitgevoerd. Zie Taakgegevens in Azure Storage behouden met de Batch-service-API voor meer informatie.
Gebruiksvoorbeelden voor bibliotheken
Azure Batch biedt meerdere manieren om taakuitvoer te behouden. Gebruik de bibliotheek Bestandsconventies als u het volgende wilt doen:
- Wijzig de code voor de toepassing die uw taak uitvoert om bestanden te behouden.
- Gegevens streamen naar Azure Storage terwijl de taak nog wordt uitgevoerd.
- Gegevens uit pools behouden.
- Zoek en download taakuitvoerbestanden op id of doel in uw clienttoepassing of andere taken.
- Taakuitvoer weergeven in de Azure Portal.
Voor andere scenario's kunt u een andere benadering overwegen. Zie Taak- en taakuitvoer naar Azure Storage behouden voor meer informatie over andere opties.
Wat is de standaard batchbestandsconventies?
De standaard Batch File Conventions biedt een naamgevingsschema voor de doelcontainers en blobpaden waarnaar uw uitvoerbestanden worden geschreven. Bestanden die zijn opgeslagen in Azure Storage die de standaard volgen, kunnen automatisch worden weergegeven in de Azure Portal.
De bibliotheek Bestandsconventies voor .NET geeft uw opslagcontainers en taakuitvoerbestanden automatisch een naam op basis van de standaard. De bibliotheek biedt ook methoden voor het uitvoeren van query's op uitvoerbestanden in Azure Storage. U kunt query's uitvoeren op taak-id, taak-id of doel.
Als u met een andere taal dan .NET ontwikkelt, kunt u de standaard Bestandsconventies zelf implementeren in uw toepassing. Zie De standaard batchbestandsconventies implementeren voor meer informatie.
Een Azure Storage-account koppelen
Als u uitvoergegevens wilt behouden in Azure Storage met behulp van de bibliotheek bestandsconventies, koppelt u eerst een Azure Storage-account aan uw Batch-account.
- Meld u aan bij de Azure-portal.
- Zoek en selecteer Batch in de zoekbalk.
- Selecteer het Batch-account dat u wilt koppelen aan Azure Storage.
- Selecteer op de pagina Batch-account onder Instellingen de optie Opslagaccount.
- Als u nog geen Azure Storage-account hebt dat is gekoppeld aan uw Batch-account, selecteert u Opslagaccount (geen).
- Selecteer het Azure Storage-account dat u wilt gebruiken. Gebruik voor de beste prestaties een account in dezelfde regio als het Batch-account.
Uitvoergegevens behouden
U kunt taak- en taakuitvoergegevens behouden met de bibliotheek Bestandsconventies. Maak eerst een container in Azure Storage. Sla vervolgens de uitvoer op in de container. Gebruik de Azure Storage-clientbibliotheek voor .NET in uw taakcode om de taakuitvoer te uploaden naar de container.
Zie Aan de slag met Azure Blob Storage met behulp van .NET voor meer informatie over het werken met containers en blobs in Azure Storage.
Alle taak- en taakuitvoer die behouden blijft met de bibliotheek Bestandsconventies, wordt opgeslagen in dezelfde container. Als een groot aantal taken tegelijkertijd bestanden probeert te behouden, kunnen beperkingslimieten voor Azure Storage worden afgedwongen. Zie Controlelijst voor prestaties en schaalbaarheid voor Blob-opslag voor meer informatie.
Opslagcontainer maken
Als u taakuitvoer naar Azure Storage wilt behouden, maakt u eerst een container door CloudJob aan te roepen. PrepareOutputStorageAsync. Deze extensiemethode gebruikt een CloudStorageAccount-object als parameter. Met de methode wordt een container met de naam gemaakt volgens de standaard Bestandsconventies. De inhoud van de container kan worden gedetecteerd door de Azure Portal en de ophaalmethoden die in dit artikel worden beschreven.
Normaal gesproken maakt u een container in uw clienttoepassing, waarmee uw pools, taken en taken worden gemaakt. Bijvoorbeeld:
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);
Taakuitvoer opslaan
Nadat u de opslagcontainer hebt gemaakt, kunnen taken uitvoer naar de container opslaan met behulp van TaskOutputStorage. Deze klasse is beschikbaar in de bibliotheek Bestandsconventies.
Maak in uw taakcode een TaskOutputStorage-object . Wanneer de taak is voltooid, roept u TaskOutputStorage aan. Methode SaveAsync . Met deze stap wordt de uitvoer opgeslagen in 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");
De kind
parameter van TaskOutputStorage. De methode SaveAsync categoriseert de persistente bestanden. Er zijn vier vooraf gedefinieerde TaskOutputKind-typen : TaskOutput
, TaskPreview
, TaskLog
en TaskIntermediate.
U kunt ook aangepaste uitvoercategorieën definiëren.
Geef op welk type uitvoer u wilt weergeven wanneer u later een query op Batch uitvoert. Wanneer u vervolgens de uitvoer voor een taak weer geeft, kunt u filteren op een van de uitvoertypen. Filter bijvoorbeeld op 'Geef mij de voorbeelduitvoer voor taak 109'. Zie Uitvoergegevens ophalen voor meer informatie.
Het uitvoertype bepaalt ook waar een uitvoerbestand wordt weergegeven in de Azure Portal. Bestanden in de categorie TaakUitvoer bevinden zich onder Taakuitvoerbestanden. Bestanden in de categorie TaskLog staan onder Taaklogboeken.
Uitvoer van taak opslaan
U kunt ook de uitvoer die is gekoppeld aan een hele taak opslaan. In de samenvoegtaak van een filmrenderingstaak kunt u bijvoorbeeld de volledig gerenderde film behouden als taakuitvoer. Wanneer uw taak is voltooid, kan uw clienttoepassing de uitvoer voor de taak weergeven en ophalen. Uw clienttoepassing hoeft geen query's uit te voeren op de afzonderlijke taken.
Sla taakuitvoer op door JobOutputStorage aan te roepen. Methode SaveAsync . Geef het JobOutputKind en de bestandsnaam op. Bijvoorbeeld:
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");
Net als bij het type TaskOutputKind voor taakuitvoer gebruikt u het type JobOutputKind om de persistente bestanden van een taak te categoriseren. Later kunt u een specifiek type uitvoer weergeven. Het type JobOutputKind bevat zowel uitvoer- als preview-categorieën. Het type ondersteunt ook het maken van aangepaste categorieën.
Taaklogboeken opslaan
Mogelijk moet u ook bestanden behouden die zijn bijgewerkt tijdens het uitvoeren van een taak. Mogelijk moet u bijvoorbeeld logboekbestanden behouden, of stdout.txt
en stderr.txt
. De bibliotheek Bestandsconventies bevat de TaskOutputStorage. Methode SaveTrackedAsync om dit soort bestanden te behouden. Houd updates bij voor een bestand op het knooppunt met een opgegeven interval met SaveTrackedAsync. Houd deze updates vervolgens vast in Azure Storage.
In het volgende voorbeeld wordt SaveTrackedAsync gebruikt om elke 15 seconden tijdens het uitvoeren van de taak bij te werken stdout.txt
in Azure Storage:
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);
}
Vervang de sectie Code to process data and produce output file(s)
met opmerkingen door de code die uw taak normaal gesproken uitvoert. U hebt bijvoorbeeld code waarmee gegevens worden gedownload uit Azure Storage en vervolgens transformaties of berekeningen worden uitgevoerd. U kunt deze code in een using
blok verpakken om periodiek een bestand bij te werken met SaveTrackedAsync.
De knooppuntagent is een programma dat wordt uitgevoerd op elk knooppunt in de pool. Dit programma biedt de command-and-control-interface tussen het knooppunt en de Batch-service. De Task.Delay
aanroep is vereist aan het einde van dit using
blok. De aanroep zorgt ervoor dat de knooppuntagent tijd heeft om de inhoud van de standaard naar het stdout.txt
bestand op het knooppunt te verwijderen. Zonder deze vertraging is het mogelijk om de laatste paar seconden van de uitvoer te missen. Mogelijk hebt u deze vertraging niet nodig voor alle bestanden.
Wanneer u bestandstracking inschakelt met SaveTrackedAsync, worden alleen toevoegingen aan het bijgehouden bestand opgeslagen in Azure Storage. Gebruik deze methode alleen voor het bijhouden van niet-roterende logboekbestanden of andere bestanden waarnaar wordt geschreven met toevoegbewerkingen aan het einde van het bestand.
Uitvoergegevens ophalen
Als u uitvoerbestanden voor een specifieke taak of taak wilt ophalen, hoeft u het pad in Azure Storage of bestandsnamen niet te kennen. In plaats daarvan kunt u uitvoerbestanden aanvragen op taak of taak-id.
In de volgende voorbeeldcode wordt de taken van een taak herhaald. Vervolgens wordt met de code informatie over de uitvoerbestanden voor de taak afgedrukt. Vervolgens downloadt de code de bestanden uit 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();
}
}
Uitvoerbestanden weergeven in de Azure Portal
Als uw taakuitvoerbestanden gebruikmaken van de standaard Batch-bestandsconventies, kunt u de bestanden weergeven in de Azure Portal.
Als u de weergave van uw uitvoerbestanden in de portal wilt inschakelen, moet u aan de volgende vereisten voldoen:
Als u wilt dat uitvoerbestanden automatisch worden weergegeven in de Azure Portal, moet u het volgende doen:
- Koppel een Azure Storage-account aan uw Batch-account.
- Volg de vooraf gedefinieerde naamconventies voor Azure Storage-containers en -bestanden. Lees leesmij voor alle definities. Als u de bibliotheek Bestandsconventies gebruikt om uw uitvoer te behouden, worden uw bestanden persistent volgens de standaard Bestandsconventies.
Taakuitvoerbestanden en -logboeken weergeven in de Azure Portal:
- Meld u aan bij de Azure-portal.
- Ga naar de taak waarvoor u de uitvoer wilt weergeven.
- Selecteer Opgeslagen uitvoerbestanden of Opgeslagen logboeken.
Codevoorbeeld
Het PersistOutputs-voorbeeldproject is een van de Azure Batch codevoorbeelden op GitHub. Deze Visual Studio-oplossing laat zien hoe u de bibliotheek Azure Batch Bestandsconventies gebruikt om taakuitvoer naar duurzame opslag te behouden. Voer de volgende stappen uit om het voorbeeld uit te voeren:
- Open het project in Visual Studio 2019.
- Voeg uw Batch- en Azure Storage-accountreferenties toe aan AccountSettings.settings in het project Microsoft.Azure.Batch.Samples.Common .
- Bouw de oplossing. Voer de oplossing nog niet uit.
- Herstel desgevraagd eventuele NuGet-pakketten.
- Upload een toepassingspakket voor PersistOutputsTask via de Azure Portal.
- Neem het uitvoerbare bestand en de
PersistOutputsTask.exe
bijbehorende afhankelijke assembly's op in het .zip-pakket. - Stel de toepassings-id in op
PersistOutputsTask
. - Stel de versie van het toepassingspakket in op
1.0
.
- Neem het uitvoerbare bestand en de
- Selecteer Start om het project uit te voeren.
- Wanneer u wordt gevraagd om de persistentietechnologie te selecteren die u wilt gebruiken, voert u 1 in. Met deze optie wordt het voorbeeld uitgevoerd met behulp van de bibliotheek Bestandsconventies om taakuitvoer te behouden.
De bibliotheek batchbestandsconventies voor .NET ophalen
De bibliotheek batchbestandsconventies voor .NET is beschikbaar op NuGet. De bibliotheek breidt de klassen CloudJob en CloudTask uit met nieuwe methoden. Zie de naslagdocumentatie voor bestandsconventies voor meer informatie.
De broncode van de bibliotheek bestandsconventies is beschikbaar op GitHub.