Batch hizmeti API'siyle görev verilerini Azure Depolama'de kalıcı hale getirmek

Azure Batch'te çalışan bir görev çalıştırıldığında çıkış verileri üretebilir. Görev çıktı verilerinin genellikle işteki diğer görevler, işi yürüten istemci uygulaması veya her ikisi tarafından alınması için depolanması gerekir. Görevler çıktı verilerini Batch işlem düğümünün dosya sistemine yazar, ancak düğüm yeniden tasarlanan veya düğüm havuzdan ayrıldığında düğümdeki tüm veriler kaybolur. Görevlerin dosya saklama süresi de olabilir ve bu süre sonunda görev tarafından oluşturulan dosyalar silinir. Bu nedenlerden dolayı, daha sonra ihtiyacınız olan görev çıktısını Azure Depolama gibi bir veri deposunda kalıcı hale getirmek önemlidir.

Batch'teki depolama hesabı seçenekleri için bkz. Batch hesapları ve Azure Depolama hesapları.

Batch hizmeti API'si, Sanal Makine Yapılandırması ile havuzlarda çalışan görevler ve iş yöneticisi görevleri için çıktı verilerinin Azure Depolama kalıcı olmasını destekler. Görev eklediğinizde, görevin çıkışının hedefi olarak Azure Depolama'de bir kapsayıcı belirtebilirsiniz. Ardından Batch hizmeti, görev tamamlandığında bu kapsayıcıya tüm çıkış verilerini yazar.

Görev çıktısını kalıcı hale getirmek için Batch hizmeti API'sini kullanırken, görevin çalıştığı uygulamayı değiştirmeniz gerekmez. Bunun yerine, istemci uygulamanızda yapılan birkaç değişiklikle, görevin çıkışını görevi oluşturan kodun içinden kalıcı hale ekleyebilirsiniz.

Önemli

Batch hizmeti API'siyle görev verilerini Azure Depolama kalıcı hale getirmek, 1 Şubat 2018'den önce oluşturulan havuzlarla çalışmaz.

Görev çıktısını kalıcı hale getirmek için Batch hizmeti API'sini ne zaman kullanabilirim?

Azure Batch, görev çıktısını kalıcı hale getirmek için birden fazla yol sağlar. Batch hizmeti API'sini kullanmak, bu senaryolara en uygun olan kullanışlı bir yaklaşımdır:

  • Görevinizin çalıştığı uygulamayı değiştirmeden istemci uygulamanızın içinden görev çıktısını kalıcı hale getirmek için kod yazmak istiyorsunuz.
  • Batch görevlerinden ve iş yöneticisi görevlerinden alınan çıkışı, sanal makine yapılandırmasıyla oluşturulan havuzlarda kalıcı hale getirmek istiyorsunuz.
  • Çıkışı rastgele bir adla Azure Depolama kapsayıcısına kalıcı hale getirmek istiyorsunuz.
  • Çıktıyı Batch Dosya Kuralları standardına göre adlı bir Azure Depolama kapsayıcısına kalıcı hale getirmek istiyorsunuz.

Senaryonuz yukarıda listelenenlerden farklıysa farklı bir yaklaşım düşünmeniz gerekebilir. Örneğin Batch hizmeti API'si şu anda görev çalışırken Azure Depolama akış çıkışını desteklememektedir. Çıktı akışı yapmak için .NET için kullanılabilen Batch Dosya Kuralları kitaplığını kullanmayı göz önünde bulundurun. Diğer diller için kendi çözümünüzü uygulamanız gerekir. Diğer seçenekler hakkında daha fazla bilgi için bkz. azure Depolama iş ve görev çıktısını kalıcı hale getirmek.

Azure Depolama'da kapsayıcı oluşturma

Görev çıktısını Azure Depolama'da kalıcı hale getirmek için, çıkış dosyalarınız için hedef görevi görecek bir kapsayıcı oluşturmanız gerekir. Uygun Azure Depolama istemci kitaplığını veya SDK'sını kullanarak, tercihen işinizi göndermeden önce kapsayıcıyı oluşturun. Azure Depolama API'leri hakkında daha fazla bilgi için Azure Depolama belgelerine bakın.

Örneğin, uygulamanızı C# dilinde yazıyorsanız .NET için Azure Depolama istemci kitaplığını kullanın. Aşağıdaki örnekte kapsayıcı oluşturma gösterilmektedir:

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

Görev çıktısı için çıkış dosyalarını belirtme

Görevin çıktı dosyalarını belirtmek için, outputFile nesnelerinden oluşan bir koleksiyon oluşturun ve görevi oluştururken bunu CloudTask.OutputFiles özelliğine atayın. Kapsayıcıya erişimin kimliğini doğrulamak için Paylaşılan Erişim İmzası (SAS) veya yönetilen kimlik kullanabilirsiniz.

Paylaşılan Erişim İmzası Kullanma

Kapsayıcıyı oluşturduktan sonra, kapsayıcıya yazma erişimi olan bir paylaşılan erişim imzası (SAS) alın. SAS, kapsayıcıya temsilci erişimi sağlar. SAS, belirtilen bir izin kümesiyle ve belirtilen zaman aralığı boyunca erişim verir. Batch hizmetinin, kapsayıcıya görev çıktısı yazmak için yazma izinlerine sahip bir SAS'ye ihtiyacı vardır. SAS hakkında daha fazla bilgi için bkz. Azure Depolama'de paylaşılan erişim imzalarını (SAS) kullanma.

Azure Depolama API'lerini kullanarak sas aldığınızda, API bir SAS belirteci dizesi döndürür. Bu belirteç dizesi, izinler ve SAS'nin geçerli olduğu aralık dahil olmak üzere SAS'nin tüm parametrelerini içerir. Sas kullanarak Azure Depolama'daki bir kapsayıcıya erişmek için SAS belirteci dizesini kaynak URI'sine eklemeniz gerekir. Eklenen SAS belirteci ile birlikte kaynak URI'si, Azure Depolama'a kimliği doğrulanmış erişim sağlar.

Aşağıdaki örnekte, kapsayıcı için salt yazma SAS belirteci dizesinin nasıl alınıyor ve ardından SAS'nin kapsayıcı URI'sine eklenmesi gösterilmektedir:

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

string containerSasUrl = container.Uri.AbsoluteUri + containerSasToken;

Aşağıdaki C# kod örneği, adlı output.txtbir dosyaya rastgele sayılar yazan bir görev oluşturur. Örnek, kapsayıcıya yazılması için output.txt bir çıkış dosyası oluşturur. Örnek ayrıca, dosya deseni std*.txt (örneğinstdout.txt ve stderr.txt) ile eşleşen tüm günlük dosyaları için çıkış dosyaları oluşturur. Kapsayıcı URL'si, kapsayıcı için daha önce oluşturulmuş SAS'yi gerektirir. Batch hizmeti, kapsayıcıya erişimin kimliğini doğrulamak için SAS kullanır.

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

Dekont

Bu örneği Linux ile kullanıyorsanız, ters eğik çizgileri eğik çizgi olarak değiştirdiğinizden emin olun.

Yönetilen Kimliği Kullanma

Kapsayıcıya yazma erişimi olan bir SAS oluşturup Batch'e geçirmek yerine Azure Depolama ile kimlik doğrulaması yapmak için yönetilen kimlik kullanılabilir. Kimlik Batch Havuzu'na atanmalı ve ayrıca kapsayıcının Storage Blob Data Contributor yazılacağı rol atamasına sahip olmalıdır. Daha sonra Batch hizmetine kapsayıcıya erişimin kimliğini doğrulamak için SAS yerine yönetilen kimliği kullanması söylenebilir.

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

Eşleştirme için dosya deseni belirtme

Bir çıkış dosyası belirttiğinizde, eşleştirme için bir dosya deseni belirtmek üzere OutputFile.FilePattern özelliğini kullanabilirsiniz. Dosya düzeni sıfır dosya, tek bir dosya veya görev tarafından oluşturulan bir dosya kümesiyle eşleşebilir.

FilePattern özelliği, (özyinelemeli olmayan eşleşmeler için) ve ** (özyinelemeli eşleşmeler için) gibi * standart dosya sistemi joker karakterlerini destekler. Örneğin, yukarıdaki kod örneği özyinelemeli olmayan şekilde eşleşecek std*.txt dosya desenini belirtir:

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

Tek bir dosyayı karşıya yüklemek için joker karakter içermeyen bir dosya düzeni belirtin. Örneğin, yukarıdaki kod örneği ile eşleşecek output.txtdosya desenini belirtir:

filePattern: @"output.txt"

Karşıya yükleme koşulu belirtme

OutputFileUploadOptions.UploadCondition özelliği, çıkış dosyalarının koşullu karşıya yüklenmesine izin verir. Yaygın bir senaryo, görev başarılı olursa bir dosya kümesini ve başarısız olursa farklı bir dosya kümesini karşıya yüklemektir. Örneğin, ayrıntılı günlük dosyalarını yalnızca görev başarısız olduğunda ve sıfır olmayan bir çıkış koduyla çıktığında karşıya yüklemek isteyebilirsiniz. Benzer şekilde, sonuç dosyalarını yalnızca görev başarılı olursa karşıya yüklemek isteyebilirsiniz çünkü görev başarısız olursa bu dosyalar eksik veya eksik olabilir.

Yukarıdaki kod örneği UploadCondition özelliğini TaskCompletion olarak ayarlar. Bu ayar, çıkış kodunun değerinden bağımsız olarak, görevler tamamlandıktan sonra dosyanın karşıya yüklendiğini belirtir.

uploadCondition: OutputFileUploadCondition.TaskCompletion

Diğer ayarlar için bkz . OutputFileUploadCondition sabit listesi.

Aynı ada sahip dosyaları kesinleştirme

Bir işteki görevler aynı ada sahip dosyalar üretebilir. Örneğin, stdout.txt ve stderr.txt bir işte çalışan her görev için oluşturulur. Her görev kendi bağlamında çalıştığından, bu dosyalar düğümün dosya sisteminde çakışmaz. Ancak, birden çok görevdeki dosyaları paylaşılan bir kapsayıcıya yüklediğinizde, aynı ada sahip dosyaları belirsizleştirmeniz gerekir.

OutputFileBlobContainerDestination.Path özelliği, çıkış dosyaları için hedef blobu veya sanal dizini belirtir. Path özelliğini kullanarak blobu veya sanal dizini, aynı ada sahip çıktı dosyalarının Azure Depolama'de benzersiz bir şekilde adlandırılması için kullanabilirsiniz. Yolda görev kimliğini kullanmak, benzersiz adlar sağlamak ve dosyaları kolayca tanımlamak için iyi bir yoldur.

FilePattern özelliği bir joker karakter ifadesi olarak ayarlanırsa, desenle eşleşen tüm dosyalar Path özelliği tarafından belirtilen sanal dizine yüklenir. Örneğin, kapsayıcı isemycontainer, görev kimliği mytaskve dosya düzeni ise ..\std*.txtAzure Depolama çıkış dosyalarına yönelik mutlak URI'ler şuna benzer olacaktır:

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

FilePattern özelliği tek bir dosya adıyla eşleşecek şekilde ayarlandıysa, yani joker karakter içermiyorsa, Path özelliğinin değeri tam blob adını belirtir. Adlandırmanın birden çok görevdeki tek bir dosyayla çakışmasını bekliyorsanız, bu dosyaları kesinleştirme amacıyla dosya adının bir parçası olarak sanal dizinin adını ekleyin. Örneğin Path özelliğini görev kimliğini, sınırlayıcı karakterini (genellikle eğik çizgi) ve dosya adını içerecek şekilde ayarlayın:

path: taskId + @"/output.txt"

Bir dizi görev için çıkış dosyalarına yönelik mutlak URI'ler şuna benzer olacaktır:

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

Azure Depolama'daki sanal dizinler hakkında daha fazla bilgi için bkz. Kapsayıcıdaki blobları listeleme.

Birçok Çıkış Dosyası

Bir görev çok sayıda çıkış dosyası belirttiğinde, Azure Batch API'sinin uyguladığı sınırlarla karşılaşabilirsiniz. Görevlerinizi küçük tutmanız ve çıkış dosyalarının sayısını düşük tutmanız önerilir.

Sınırlarla karşılaşırsanız, Dosya Desenlerini kullanarak veya çıkış dosyalarını birleştirmek için tar veya zip gibi dosya kapsayıcılarını kullanarak çıkış dosyalarının sayısını azaltmayı göz önünde bulundurun. Alternatif olarak, çıkış verilerini kalıcı hale getirmek için bağlamayı veya diğer yaklaşımları kullanın (bkz . İşi ve görev çıkışını kalıcı hale getirmek).

Dosya karşıya yükleme hatalarını tanılama

Çıktı dosyalarını Azure Depolama'a yükleme başarısız olursa, görev Tamamlandı durumuna ve TaskExecutionInformation'a geçer.FailureInformation özelliği ayarlandı. Hangi hatanın oluştuğuna karar vermek için FailureInformation özelliğini inceleyin. Örneğin, kapsayıcı bulunamazsa dosya karşıya yükleme sırasında oluşan bir hata aşağıda verilmiştir:

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

Her dosya karşıya yüklemesinde Batch, fileuploadout.txt işlem düğümüne ve fileuploaderr.txtöğesine iki günlük dosyası yazar. Belirli bir hata hakkında daha fazla bilgi edinmek için bu günlük dosyalarını inceleyebilirsiniz. Dosya karşıya yükleme işleminin hiçbir zaman denenmediği durumlarda, örneğin görevin kendisi çalıştırılamadığından, bu günlük dosyaları mevcut olmaz.

Dosya karşıya yükleme performansını tanılama

Dosya fileuploadout.txt günlükleri karşıya yükleme ilerleme durumunu kaydeder. Dosya karşıya yükleme işleminin ne kadar sürdüğü hakkında daha fazla bilgi edinmek için bu dosyayı inceleyebilirsiniz. Düğümün boyutu, karşıya yükleme sırasında düğümdeki diğer etkinlikler, hedef kapsayıcının Batch havuzuyla aynı bölgede olup olmadığı, depolama hesabına aynı anda kaç düğüm yüklendiği vb. dahil olmak üzere performansı karşıya yüklemek için birçok katkıda bulunan faktör olduğunu unutmayın.

Batch hizmeti API'sini Batch Dosya Kuralları standardıyla kullanma

Batch hizmeti API'siyle görev çıktısını kalıcı hale eklediğinizde hedef kapsayıcınızı ve bloblarınızı istediğiniz gibi adlandırabilirsiniz. Bunları Batch Dosya Kuralları standardına göre adlandırmayı da seçebilirsiniz. Dosya Kuralları standardı, iş ve görevin adlarına göre belirli bir çıktı dosyası için Azure Depolama hedef kapsayıcı ve blob adlarını belirler. Çıkış dosyalarını adlandırmak için Dosya Kuralları standardını kullanırsanız çıkış dosyalarınız Azure portalında kullanılabilecek.

C# dilinde geliştiriyorsanız, .NET için Batch Dosya Kuralları kitaplığında yerleşik yöntemleri kullanabilirsiniz. Bu kitaplık sizin için düzgün adlandırılmış kapsayıcılar ve blob yolları oluşturur. Örneğin, iş adına göre kapsayıcının doğru adını almak için API'yi çağırabilirsiniz:

string containerName = job.OutputStorageContainerName();

Kapsayıcıya yazmak için kullanılan paylaşılan erişim imzası (SAS) URL'sini döndürmek için CloudJobExtensions.GetOutput Depolama ContainerUrl yöntemini kullanabilirsiniz. Daha sonra bu SAS'yi OutputFileBlobContainerDestination oluşturucusna geçirebilirsiniz.

C# dışında bir dilde geliştiriyorsanız, Dosya Kuralları standardını kendiniz uygulamanız gerekir.

Kod örneği

PersistOutputs örnek projesi, GitHub'da azure batch kod örneklerinden biridir. Bu Visual Studio çözümü, görev çıktısını dayanıklı depolamada kalıcı hale getirmek için .NET için Batch istemci kitaplığının nasıl kullanılacağını gösterir. Örneği çalıştırmak için şu adımları izleyin:

  1. Projeyi Visual Studio 2019'da açın.
  2. Batch ve Depolama hesabı kimlik bilgileriniziMicrosoft.Azure.Batch.Samples.Common projesindeki Account Ayarlar.settings bölümüne ekleyin.
  3. Çözümü derleyin (ancak çalıştırmayın). İstenirse tüm NuGet paketlerini geri yükleyin.
  4. PersistOutputsTask için bir uygulama paketini karşıya yüklemek için Azure portalını kullanın. PersistOutputsTask.exe ve bağımlı derlemelerini .zip paketine ekleyin, uygulama kimliğini "PersistOutputsTask" ve uygulama paketi sürümünü "1.0" olarak ayarlayın.
  5. PersistOutputs projesini başlatın (çalıştırın).
  6. Örneği çalıştırmak için kullanılacak kalıcılık teknolojisini seçmeniz istendiğinde, görev çıktısını kalıcı hale getirmek için Batch hizmeti API'sini kullanarak örneği çalıştırmak için 2 girin.
  7. İsterseniz, batch hizmeti API'siyle çıktıyı kalıcı hale getirmek için 3 girerek örneği yeniden çalıştırın ve hedef kapsayıcıyı ve blob yolunu Dosya Kuralları standardına göre adlandırın.

Sonraki adımlar

  • .NET için Dosya Kuralları kitaplığıyla görev çıktısını kalıcı hale getirmek hakkında daha fazla bilgi edinmek için bkz. .NET için Batch Dosya Kuralları kitaplığıyla iş ve görev verilerini Azure Depolama'de kalıcı hale getirmek.
  • Azure Batch'te çıktı verilerini kalıcı hale getirmek için diğer yaklaşımlar hakkında bilgi edinmek için bkz. azure Depolama işi ve görev çıktısını kalıcı hale getirmek.