Öğretici: .NET API’si kullanarak Azure Batch ile paralel iş yükü çalıştırma
Büyük ölçekli paralel ve yüksek performanslı bilgi işlem (HPC) toplu işlerini Azure’da verimli bir şekilde çalıştırmak için Azure Batch’i kullanın. Bu öğreticide, Batch kullanarak paralel iş yükü çalıştırmaya ilişkin bir C# örneği açıklanmaktadır. Genel bir Batch uygulaması iş akışı hakkında bilgi alacak ve Batch ve Depolama kaynakları ile programlı olarak etkileşimde bulunmayı öğreneceksiniz.
- Batch hesabınıza bir uygulama paketi ekleyin.
- Batch ve Depolama hesaplarıyla kimlik doğrulaması.
- Giriş dosyalarını Depolama yükleyin.
- Bir uygulamayı çalıştırmak için işlem düğümleri havuzu oluşturun.
- Giriş dosyalarını işlemek için bir iş ve görevler oluşturun.
- Görev yürütmeyi izleyin.
- Çıkış dosyalarını alın.
Bu öğreticide, ffmpeg açık kaynak aracını kullanarak MP4 medya dosyalarını paralel olarak MP3 biçimine dönüştürebilirsiniz.
Azure aboneliğiniz yoksa başlamadan önce birücretsiz Azure hesabı oluşturun.
Ön koşullar
Linux, macOS veya Windows için Visual Studio 2017 veya üzeri ya da .NET Core SDK.
Bir Batch hesabı ve bağlı bir Azure Depolama hesabı. Bu hesapları oluşturmak için Bkz. Azure portalı veya Azure CLI için Batch hızlı başlangıç kılavuzları.
Kullanım örneğine uygun ffmpeg sürümünü yerel bilgisayarınıza indirin. Bu öğretici ve ilgili örnek uygulama, ffmpeg 4.3.1'in Windows 64 bit tam derleme sürümünü kullanır. Bu öğreticide yalnızca zip dosyasına ihtiyacınız vardır. Dosyanın sıkıştırmasını açmanız veya yerel olarak yüklemeniz gerekmez.
Azure'da oturum açma
Azure Portal oturum açın.
Uygulama paketi ekleme
Batch hesabınıza uygulama paketi olarak ffmpeg eklemek için Azure portalını kullanın. Uygulama paketleri, görev uygulamalarını ve havuzunuzdaki işlem düğümlerine dağıtımlarını yönetmenize yardımcı olur.
Azure portalında Diğer hizmetler>Batch hesapları'na tıklayın ve Batch hesabınızın adını seçin.
Uygulamalar>Ekle’ye tıklayın.
Uygulama Kimliği alanına ffmpegyazın ve Sürüm alanına 4.3.1paket sürümünü girin. İndirdiğiniz ffmpeg zip dosyasını ve ardından Gönder'i seçin. ffmpeg uygulama paketi, Batch hesabınıza eklenir.
Hesap kimlik bilgilerini alma
Bu örnekte, Batch ve depolama hesaplarınız için kimlik bilgileri sağlamanız gerekir. Gerekli kimlik bilgilerini almanın kolay yolu Azure portalındadır. (Bu kimlik bilgilerini ayrıca Azure API'lerini veya komut satırı araçlarını kullanarak da alabilirsiniz.)
Tüm hizmetler>Batch hesapları'nı ve ardından Batch hesabınızın adını seçin.
Batch kimlik bilgilerini görmek için Anahtarlar'ı seçin. Batch hesabı, URL ve Birincil erişim anahtarı değerlerini metin düzenleyiciye kopyalayın.
Depolama hesap adını ve anahtarlarını görmek için Depolama hesabı seçin. Depolama hesabı adı ve Key1 değerlerini bir metin düzenleyiciye kopyalayın.
Örnek uygulamayı indirme ve çalıştırma
Örnek uygulamayı indirme
GitHub’dan örnek uygulamayı indirin veya kopyalayın. Örnek uygulama deposunu bir Git istemcisi ile kopyalamak için aşağıdaki komutu kullanın:
git clone https://github.com/Azure-Samples/batch-dotnet-ffmpeg-tutorial.git
BatchDotNetFfmpegTutorial.sln Visual Studio çözüm dosyasını içeren dizine gidin.
Çözüm dosyasını Visual Studio'da açın ve Program.cs dosyasındaki kimlik bilgisi dizelerini hesaplarınız için aldığınız değerlerle güncelleştirin. Örnek olarak:
// Batch account credentials
private const string BatchAccountName = "yourbatchaccount";
private const string BatchAccountKey = "xxxxxxxxxxxxxxxxE+yXrRvJAqT9BlXwwo1CwF+SwAYOxxxxxxxxxxxxxxxx43pXi/gdiATkvbpLRl3x14pcEQ==";
private const string BatchAccountUrl = "https://yourbatchaccount.yourbatchregion.batch.azure.com";
// Storage account credentials
private const string StorageAccountName = "yourstorageaccount";
private const string StorageAccountKey = "xxxxxxxxxxxxxxxxy4/xxxxxxxxxxxxxxxxfwpbIC5aAWA8wDu+AFXZB827Mt9lybZB1nUcQbQiUrkPtilK5BQ==";
Dekont
Örneği basitleştirmek için Batch ve Depolama hesabı kimlik bilgileri düz metin şeklinde gösterilmiştir. Uygulamada kimlik bilgilerine erişimi kısıtlamanızı ve bunlara kodunuzda ortam değişkenlerini kullanarak veya yapılandırma dosyası ile başvurmanızı öneririz. Örnekler için bkz. Azure Batch kod örnekleri deposu.
Ayrıca, çözümdeki ffmpeg uygulama paketi başvurusunun Batch hesabınıza yüklediğiniz ffmpeg paketinin tanımlayıcısı ve sürümüyle eşleştiğinden emin olun. Örneğin, ffmpeg
ve 4.3.1
.
const string appPackageId = "ffmpeg";
const string appPackageVersion = "4.3.1";
Örnek projeyi derleme ve çalıştırma
Uygulamayı Visual Studio'da veya dotnet build
ve dotnet run
komutlarıyla komut satırında derleyip çalıştırın. Uygulamayı çalıştırdıktan sonra, uygulamanın her bir parçasının ne işe yaradığını öğrenmek üzere kodu gözden geçirin. Örneğin Visual Studio'da:
Çözüm Gezgini'da çözüme sağ tıklayın ve Çözüm Derle'yi seçin.
İstenirse, herhangi bir NuGet paketinin geri yüklenmesini onaylayın. Eksik paketleri indirmeniz gerekirse, NuGet Paket Yöneticisi’nin yüklü olduğundan emin olun.
Çözümü çalıştırın. Örnek uygulamayı çalıştırdığınızda, konsol çıktısı aşağıdakine benzer. Yürütme sırasında, havuzun işlem düğümleri başlatıldığı sırada
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...
konumunda bir duraklama yaşarsınız.
Sample start: 11/19/2018 3:20:21 PM
Container [input] created.
Container [output] created.
Uploading file LowPriVMs-1.mp4 to container [input]...
Uploading file LowPriVMs-2.mp4 to container [input]...
Uploading file LowPriVMs-3.mp4 to container [input]...
Uploading file LowPriVMs-4.mp4 to container [input]...
Uploading file LowPriVMs-5.mp4 to container [input]...
Creating pool [WinFFmpegPool]...
Creating job [WinFFmpegJob]...
Adding 5 tasks to job [WinFFmpegJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...
Success! All tasks completed successfully within the specified timeout period.
Deleting container [input]...
Sample end: 11/19/2018 3:29:36 PM
Elapsed time: 00:09:14.3418742
Havuz, işlem düğümleri, iş ve görevleri izlemek için Azure portalında Batch hesabınıza gidin. Örneğin, havuzunuzdaki işlem düğümlerinin ısı haritasını görmek için Havuzlar>WinFFmpegPool öğesine tıklayın.
Görevler çalıştırılırken ısı haritası aşağıdakine benzer:
Varsayılan yapılandırmasında uygulama çalıştırıldığında tipik yürütme süresi yaklaşık 10 dakikadır. En uzun süreyi havuz oluşturma işlemi alır.
Çıkış dosyalarını alma
ffmpeg görevleri tarafından oluşturulan çıkış MP3 dosyalarını indirmek için Azure portalını kullanabilirsiniz.
- Tüm hizmetler>Depolama hesapları seçeneğine ve sonra da depolama hesabınızın adına tıklayın.
- Bloblar>çıkış seçeneğine tıklayın.
- Çıkış MP3 dosyalarından birine sağ tıklayın ve ardından İndir’e tıklayın. Dosyayı açmak veya kaydetmek için tarayıcınızdaki yönergeleri izleyin.
Bu örnekte gösterilmese de dosyaları programlamayla işlem düğümlerinden veya depolama kapsayıcısından indirebilirsiniz.
Kodu gözden geçirin
Aşağıdaki bölümlerde örnek uygulama, Batch hizmetinde iş yükünü işlemeyi gerçekleştiren adımlara ayrılmıştır. Örnekteki her kod satırı tartışılmadığından, bu makalenin geri kalanını okurken çözümdeki Program.cs dosyasına bakın.
Blob ve Batch istemcilerinde kimlik doğrulaması
Bağlı depolama hesabı ile etkileşimde bulunmak üzere uygulama, .NET için Azure Depolama İstemci Kitaplığı’nı kullanır. CloudStorageAccount ile hesaba başvuru oluşturur ve paylaşılan anahtar kimlik doğrulamasını kullanarak kimlik doğrulaması yapar. Sonra bir CloudBlobClient oluşturur.
// Construct the Storage account connection string
string storageConnectionString = String.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}",
StorageAccountName, StorageAccountKey);
// Retrieve the storage account
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
Uygulama, Batch hizmetinde havuz, iş ve görevleri oluşturup yönetmek üzere bir BatchClient nesnesi oluşturur. Örnekteki Batch istemcisi, paylaşılan anahtar kimlik doğrulaması kullanır. Batch ayrıca tek tek kullanıcıların veya katılımsız bir uygulamanın kimliğini doğrulamak için Microsoft Entra Id aracılığıyla kimlik doğrulamasını da destekler.
BatchSharedKeyCredentials sharedKeyCredentials = new BatchSharedKeyCredentials(BatchAccountUrl, BatchAccountName, BatchAccountKey);
using (BatchClient batchClient = BatchClient.Open(sharedKeyCredentials))
...
Giriş dosyalarını karşıya yükleme
Uygulama, giriş dosyaları için bir depolama kapsayıcısı (MP4 biçimi) ve görev çıkışı için bir kapsayıcı oluşturmak üzere blobClient
nesnesini CreateContainerIfNotExistAsync
yöntemine geçirir.
CreateContainerIfNotExistAsync(blobClient, inputContainerName);
CreateContainerIfNotExistAsync(blobClient, outputContainerName);
Ardından, dosyalar yerel InputFiles klasöründen giriş kapsayıcısına yüklenir. Depolama alanındaki dosyalar, Batch hizmetinin daha sonra işlem düğümlerine indirebileceği Batch ResourceFile nesneleri olarak tanımlanır.
Program.cs dosyasındaki iki yöntem, dosyaları karşıya yüklerken kullanılır:
UploadFilesToContainerAsync
: ParametreyeResourceFile
geçirileninputFilePaths
her dosyayı karşıya yüklemek için bir nesne koleksiyonu ve dahili çağrılarUploadResourceFileToContainerAsync
döndürür.UploadResourceFileToContainerAsync
: Her dosyayı blob olarak giriş kapsayıcısına yükler. Dosyayı karşıya yükledikten sonra blob için paylaşılan erişim imzası (SAS) alır ve onu temsil eden birResourceFile
nesne döndürür.
string inputPath = Path.Combine(Environment.CurrentDirectory, "InputFiles");
List<string> inputFilePaths = new List<string>(Directory.GetFileSystemEntries(inputPath, "*.mp4",
SearchOption.TopDirectoryOnly));
List<ResourceFile> inputFiles = await UploadFilesToContainerAsync(
blobClient,
inputContainerName,
inputFilePaths);
Dosyaları .NET ile blob olarak bir depolama hesabına yükleme hakkında ayrıntılar için bkz. .NET kullanarak blobları yükleme, indirme ve listeleme.
İşlem düğümleri havuzu oluşturma
Ardından örnek, CreatePoolIfNotExistAsync
çağrısıyla Batch hesabında bir işlem düğümü havuzu oluşturur. Bu tanımlı yöntem, düğüm sayısını, VM boyutunu ve havuz yapılandırmasını ayarlamak üzere BatchClient.PoolOperations.CreatePool yöntemini kullanır. Burada VirtualMachineConfiguration nesnesi, Azure Market’te yayımlanmış bir Windows Server görüntüsüne ImageReference belirtir. Batch, Azure Market’te çok çeşitli VM görüntülerinin yanı sıra özel VM görüntülerini destekler.
Düğüm sayısı ve VM boyutu, tanımlı sabitler kullanılarak ayarlanır. Batch ayrılmış düğümleri ve Spot düğümleri destekler ve havuzlarınızda ya da her ikisini birden kullanabilirsiniz. Adanmış düğümler, havuzunuz için ayrılmıştır. Spot düğümler, Azure'daki fazla VM kapasitesinden daha düşük bir fiyata sunulur. Azure yeterli kapasiteye sahip değilse spot düğümler kullanılamaz duruma gelir. Örnek varsayılan olarak Standard_A1_v2 boyutu yalnızca 5 Spot düğümü içeren bir havuz oluşturur.
Dekont
Düğüm kotalarınızı denetlediğinizden emin olun. Kota isteği oluşturma yönergeleri için bkz . Batch hizmeti kotaları ve sınırları .
ffmpeg uygulaması, havuz yapılandırmasına bir ApplicationPackageReference eklenerek işlem düğümlerine dağıtılır.
CommitAsync yöntemi, havuzu Batch hizmetine gönderir.
ImageReference imageReference = new ImageReference(
publisher: "MicrosoftWindowsServer",
offer: "WindowsServer",
sku: "2016-Datacenter-smalldisk",
version: "latest");
VirtualMachineConfiguration virtualMachineConfiguration =
new VirtualMachineConfiguration(
imageReference: imageReference,
nodeAgentSkuId: "batch.node.windows amd64");
pool = batchClient.PoolOperations.CreatePool(
poolId: poolId,
targetDedicatedComputeNodes: DedicatedNodeCount,
targetLowPriorityComputeNodes: LowPriorityNodeCount,
virtualMachineSize: PoolVMSize,
virtualMachineConfiguration: virtualMachineConfiguration);
pool.ApplicationPackageReferences = new List<ApplicationPackageReference>
{
new ApplicationPackageReference {
ApplicationId = appPackageId,
Version = appPackageVersion}};
await pool.CommitAsync();
İş oluşturma
Bir Batch işi, üzerinde görevlerin çalıştırılacağı bir havuz ve iş için öncelik ile zamanlama gibi isteğe bağlı ayarları belirtir. Örnek, CreateJobAsync
çağrısıyla bir iş oluşturur. Bu tanımlı yöntem, havuzunuzda bir iş oluşturmak üzere BatchClient.JobOperations.CreateJob yöntemini kullanır.
CommitAsync yöntemi, işi Batch hizmetine gönderir. Başlangıçta iş hiçbir görev içermez.
CloudJob job = batchClient.JobOperations.CreateJob();
job.Id = JobId;
job.PoolInformation = new PoolInformation { PoolId = PoolId };
await job.CommitAsync();
Görev oluşturma
Örnek, AddTasksAsync
yöntemini çağırarak iş içinde görevler oluşturur ve CloudTask nesnelerinin bir listesini oluşturur. Her CloudTask
, bir CommandLine özelliği kullanarak giriş ResourceFile
nesnesini işlemek üzere ffmpeg çalıştırır. ffmpeg, daha önce havuz oluşturulduğunda her bir düğüme yüklenmiştir. Burada komut satırı, her bir giriş MP4 (video) dosyasını bir MP3 (ses) dosyasına dönüştürmek için ffmpeg çalıştırır.
Örnek, komut satırını çalıştırdıktan sonra MP3 dosyası için bir OutputFile nesnesi oluşturur. Her bir görevin çıkış dosyaları (bu örnekte bir tane), görevin OutputFiles özelliği kullanılarak bağlı depolama hesabındaki bir kapsayıcıya yüklenir. Kod örneğinde daha önce, çıkış kapsayıcısına yazma erişimi sağlamak için paylaşılan erişim imzası URL'si (outputContainerSasUrl
) alınıyordu. Nesnede ayarlanan koşulları not edin outputFile
. Görevden bir çıkış dosyası yalnızca görev başarıyla tamamlandıktan (OutputFileUploadCondition.TaskSuccess
) sonra kapsayıcıya yüklenir. Diğer uygulama ayrıntıları için GitHub'da tam kod örneğine bakın.
Sonra örnek, AddTaskAsync yöntemi ile görevleri işe ekler ve işlem düğümleri üzerinde çalışmak üzere kuyruğa alır.
Yürütülebilir dosyanın dosya yolunu indirdiğiniz sürümün adıyla değiştirin. Bu örnek kod örneği ffmpeg-4.3.1-2020-11-08-full_build
kullanır.
// Create a collection to hold the tasks added to the job.
List<CloudTask> tasks = new List<CloudTask>();
for (int i = 0; i < inputFiles.Count; i++)
{
string taskId = String.Format("Task{0}", i);
// Define task command line to convert each input file.
string appPath = String.Format("%AZ_BATCH_APP_PACKAGE_{0}#{1}%", appPackageId, appPackageVersion);
string inputMediaFile = inputFiles[i].FilePath;
string outputMediaFile = String.Format("{0}{1}",
System.IO.Path.GetFileNameWithoutExtension(inputMediaFile),
".mp3");
string taskCommandLine = String.Format("cmd /c {0}\\ffmpeg-4.3.1-2020-09-21-full_build\\bin\\ffmpeg.exe -i {1} {2}", appPath, inputMediaFile, outputMediaFile);
// Create a cloud task (with the task ID and command line)
CloudTask task = new CloudTask(taskId, taskCommandLine);
task.ResourceFiles = new List<ResourceFile> { inputFiles[i] };
// Task output file
List<OutputFile> outputFileList = new List<OutputFile>();
OutputFileBlobContainerDestination outputContainer = new OutputFileBlobContainerDestination(outputContainerSasUrl);
OutputFile outputFile = new OutputFile(outputMediaFile,
new OutputFileDestination(outputContainer),
new OutputFileUploadOptions(OutputFileUploadCondition.TaskSuccess));
outputFileList.Add(outputFile);
task.OutputFiles = outputFileList;
tasks.Add(task);
}
// Add tasks as a collection
await batchClient.JobOperations.AddTaskAsync(jobId, tasks);
return tasks
Görevleri izleme
Batch bir işe görevler eklediğinde, hizmet bu görevleri ilişkili havuzdaki işlem düğümleri üzerinde yürütülmek üzere otomatik olarak kuyruğa alır ve zamanlar. Belirttiğiniz ayarlara göre, Batch tüm kuyruğa alma, zamanlama, yeniden deneme görevlerini ve diğer görev yönetimi sorumluluklarını yerine getirir.
Görevin yürütülüşünün izlenmesi için birçok yaklaşım vardır. Bu örnek yalnızca tamamlandıktan sonra ve görevin başarısız ya da başarılı durumlarını bildirmek üzere bir MonitorTasks
yöntemi tanımlar. MonitorTasks
kodu, görevler hakkında yalnızca çok az bilgiyi verimli bir şekilde seçmek üzere bir ODATADetailLevel belirtir. Sonra, görev durumlarını izlemeye yönelik yardımcı programlar sağlayan bir TaskStateMonitor oluşturur. MonitorTasks
içinde, örnek tüm görevlerin bir süre sınırı içerisinde TaskState.Completed
düzeyine ulaşmasını bekler. Sonra işi sonlandırır ve tamamlanan tüm görevleri bildirir, ancak sıfır olmayan çıkış kodu gibi bir arıza ile karşılaşmış olabilir.
TaskStateMonitor taskStateMonitor = batchClient.Utilities.CreateTaskStateMonitor();
try
{
await taskStateMonitor.WhenAll(addedTasks, TaskState.Completed, timeout);
}
catch (TimeoutException)
{
batchClient.JobOperations.TerminateJob(jobId);
Console.WriteLine(incompleteMessage);
return false;
}
batchClient.JobOperations.TerminateJob(jobId);
Console.WriteLine(completeMessage);
...
Kaynakları temizleme
Görevleri çalıştırdıktan sonra, uygulama kendi oluşturduğu giriş depolama kapsayıcısını otomatik olarak siler ve Batch havuzu ve işini silme seçeneğini sunar. BatchClient'ın JobOperations ve PoolOperations sınıflarının her ikisi de, silmeyi onaylamanız durumunda çağrılan ilgili silme yöntemlerini içerir. İşlerin ve görevlerin kendileri için sizden ücret alınmasa da işlem düğümleri için ücret alınır. Bu nedenle, havuzları yalnızca gerektiğinde ayırmanız önerilir. Havuzu sildiğinizde düğümler üzerindeki tüm görev çıkışları silinir. Ancak çıkış dosyaları depolama hesabında kalır.
Kaynak grubunu, Batch hesabını ve depolama hesabını artık gerekli değilse silin. Azure portalında bu işlemi yapmak için Batch hesabına ait kaynak grubunu seçin ve Kaynak Grubunu Sil’e tıklayın.
Sonraki adımlar
Bu öğreticide, şunların nasıl yapıldığını öğrendiniz:
- Batch hesabınıza bir uygulama paketi ekleyin.
- Batch ve Depolama hesaplarıyla kimlik doğrulaması.
- Giriş dosyalarını Depolama yükleyin.
- Bir uygulamayı çalıştırmak için işlem düğümleri havuzu oluşturun.
- Giriş dosyalarını işlemek için bir iş ve görevler oluşturun.
- Görev yürütmeyi izleyin.
- Çıkış dosyalarını alın.
Batch iş yüklerini zamanlamak ve işlemek için .NET API'sini kullanma hakkında daha fazla örnek için GitHub'da Batch C# örneklerine bakın.