Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 oluşturulduğunda veya 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 çıkış verilerinin Azure Depolama'da kalıcı olmasını destekler. Görev eklediğinizde, görevin çıktısı için hedef olarak Azure Depolama'da 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örevi oluşturan kodun içerisinde görevin çıkışını kalıcı hale getirebilirsiniz.
Önemli
Batch hizmeti API'siyle görev verilerini Azure Depolama'da 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ı olarak saklamak istiyorsunuz.
- Çıkışı, keyfi bir adla bir Azure Depolama kapsayıcısında kalıcı olarak depolamak istiyorsunuz.
- Çıktıyı Batch Dosya Kuralları standardına uygun olarak adlandırılmış bir Azure Depolama kapsayıcısına kaydetmek 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'ya 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 İş ve görev çıktısını Azure Depolama'da kalıcı olarak saklama bölümüne bakın.
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ın hedefi olarak hizmet veren bir kapsayıcı oluşturmanız gerekir. Uygun Azure Depolama istemci kitaplığını veya SDK'yı kullanarak, tercihen işinizi göndermeden önce kapsayıcıyı oluşturun. Azure Depolama API'leri hakkında daha fazla bilgi için Bkz. Azure Depolama belgeleri.
Ö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:
BlobContainerClient container = storageAccount.GetBlobContainerClient(containerName);
await container.CreateIfNotExistsAsync();
Görev çıktısı için çıkış dosyalarını belirtme
Görevin çıkış dosyalarını belirtmek için, outputFile nesnelerinin bir koleksiyonunu oluşturun ve görevi oluşturduğunuzda BatchTaskCreateOptions.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 yetkilendirilmiş erişim 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'da paylaşılan erişim imzalarını (SAS) kullanma.
Azure Depolama API'lerini kullanarak bir SAS aldığınızda, API bir SAS belirteç 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'ya kimliği doğrulanmış erişim sağlar.
Aşağıdaki örnekte, kapsayıcı için salt yazma SAS belirteci dizisinin nasıl alındığı ve ardından SAS'nin kapsayıcı URI'sine nasıl eklendiği gösterilmektedir.
BlobSasBuilder sasBuilder = new BlobSasBuilder(BlobContainerSasPermissions.Write, DateTimeOffset.UtcNow.AddDays(1))
{
BlobContainerName = container.Name,
Resource = "c"
};
Uri containerSasUrl = container.GenerateSasUri(sasBuilder);
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.
BatchTaskCreateOptions task = new BatchTaskCreateOptions(taskId,
"cmd /v:ON /c \"echo off && set && (FOR /L %i IN (1,1,100000) DO (ECHO !RANDOM!)) > output.txt\"")
{
OutputFiles =
{
new OutputFile(
filePattern: @"..\std*.txt",
destination: new OutputFileDestination()
{
Container = new OutputFileBlobContainerDestination(containerSasUri) { Path = taskId }
},
uploadOptions: new OutputFileUploadConfig(OutputFileUploadCondition.TaskCompletion)),
new OutputFile(
filePattern: @"output.txt",
destination: new OutputFileDestination()
{
Container = new OutputFileBlobContainerDestination(containerSasUri) { Path = taskId + @"\output.txt" }
},
uploadOptions: new OutputFileUploadConfig(OutputFileUploadCondition.TaskCompletion)),
}
};
Uyarı
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 kimlik kullanması talimatı verilebilir.
BatchTaskCreateOptions task = new BatchTaskCreateOptions(taskId,
"cmd /v:ON /c \"echo off && set && (FOR /L %i IN (1,1,100000) DO (ECHO !RANDOM!)) > output.txt\"")
{
OutputFiles =
{
new OutputFile(
filePattern: @"..\std*.txt",
destination: new OutputFileDestination()
{
Container = new OutputFileBlobContainerDestination(containerUri)
{
Path = taskId,
IdentityReference = new BatchNodeIdentityReference()
{
ResourceId = new ResourceIdentifier(identityResourceId)
}
}
},
uploadOptions: new OutputFileUploadConfig(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"
Yükleme koşulu belirtin
OutputFileUploadConfig.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 sona erdiğinde karşıya yüklemek isteyebilirsiniz. Benzer şekilde, görevin başarılı olması durumunda sonuç dosyalarını yüklemek isteyebilirsiniz çünkü görev başarısız olursa bu dosyalar eksik veya tamamlanmamış 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, OutputFileUploadCondition enum sınıfına bakın.
Aynı ada sahip dosyaların belirsizliğini giderme
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'da 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ı ise mycontainer, görev kimliği ve mytaskdosya deseni ise ..\std*.txtAzure Depolama'daki çı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. Birden fazla görevden gelen tek bir dosyayla ilgili adlandırma çakışmalarını bekliyorsanız, bu dosyaların karışıklığını önlemek amacıyla dosya adının bir parçası olarak sanal dizin 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. İş ve görev çıkışını kalıcı hale getirme).
Dosya karşıya yükleme hatalarını teşhis etme
Çıktı dosyalarını Azure Depolama karşıya yükleme işlemi başarısız olursa görev Completed durumuna geçer ve BatchTaskExecutionInfo.FailureInfo özelliği ayarlanır. 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 yüklemesinde Batch, işlem düğümüne iki günlük dosya fileuploadout.txt ve fileuploaderr.txt yazar. Belirli bir hata hakkında daha fazla bilgi edinmek için bu günlük dosyalarını inceleyebilirsiniz. Dosya yükleme işleminin hiçbir zaman denenmediği durumlarda, örneğin, görevin kendisi çalıştırılamadığı için, bu günlük dosyaları bulunmaz.
Dosya yükleme performansını teşhis etme
fileuploadout.txt dosya, yükleme ilerlemesini 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ün yüklemekte olduğu gibi birçok faktörün karşıya yükleme performansına katkıda bulunduğ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 çıkış dosyası için Azure Depolama'daki hedef kapsayıcının ve blobun 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:
// Convention used by Azure.Batch.Conventions.Files: "job-{jobId}".
string containerName = $"job-{jobId.ToLowerInvariant()}";
Kapsayıcıya yazmak için kullanılan paylaşılan erişim imzası (SAS) URL'sini döndürmek için CloudJobExtensions.GetOutputStorageContainerUrl 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:
- Projeyi Visual Studio 2019'da açın.
- Batch ve Depolama hesabı kimlik bilgileriniziMicrosoft.Azure.Batch.Samples.Common projesindeki AccountSettings.settings'e ekleyin.
- Çözümü derleyin (ancak çalıştırmayın). İstenirse tüm NuGet paketlerini geri yükleyin.
-
PersistOutputsTaskiçin bir uygulama paketini karşıya yüklemek için Azure portalını kullanın.
PersistOutputsTask.exeve bağımlı derlemelerini .zip paketine ekleyin, uygulama kimliğini "PersistOutputsTask" ve uygulama paketi sürümünü "1.0" olarak ayarlayın. - PersistOutputs projesini başlatın (çalıştırın).
- Ö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.
- İ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'da 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 depolamada işi ve görev çıktısını kalıcı hale getirmek.