Hızlı Başlangıç: .NET API ile ilk Azure Batch işinizi çalıştırma

Kullanmaya başlayın .NET API Azure Batch üzerinde bir C# uygulamasından iş çalıştırarak Azure Batch ile çalışma. Uygulama, Azure depolamaya birkaç veri dosyası yükler ve sonra Batch işlem düğümlerinin (sanal makine) havuzunu oluşturur. Daha sonra, temel bir komut kullanarak havuz üzerindeki her bir giriş dosyasını işlemek üzere görevler çalıştıran örnek bir iş oluşturur.

Bu hızlı başlangıç tamamladıktan sonra Batch hizmetinin temel kavramlarını anlayacaktır ve Daha büyük ölçekte daha gerçekçi iş yükleriyle Batch'i denemeye hazır olursınız.

Uygulama iş akışına genel Azure Batch gösteren diyagram.

Önkoşullar

Azure'da oturum açma

https://portal.azure.com adresinden Azure portalında oturum açın.

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

  1. Tüm hizmetler > Batch hesapları' nı seçin ve ardından Batch hesabınızın adını seçin.

  2. 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.

  3. Depolama hesabı adını ve anahtarlarını görmek için depolama hesabı' nı seçin. Depolama hesabı adı ve Key1 değerlerini bir metin düzenleyiciye kopyalayın.

Örneği 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-quickstart.git

Visual Studio BatchDotNetQuickstart.sln çözüm dosyasını içeren dizine gidin.

Çözüm dosyasını Visual Studio'da açın ve Program.cs içindeki kimlik bilgisi dizelerini hesaplarınız için edindiğiniz değerlerle güncelleştirin. Örnek:

// Batch account credentials
private const string BatchAccountName = "mybatchaccount";
private const string BatchAccountKey  = "xxxxxxxxxxxxxxxxE+yXrRvJAqT9BlXwwo1CwF+SwAYOxxxxxxxxxxxxxxxx43pXi/gdiATkvbpLRl3x14pcEQ==";
private const string BatchAccountUrl  = "https://mybatchaccount.mybatchregion.batch.azure.com";

// Storage account credentials
private const string StorageAccountName = "mystorageaccount";
private const string StorageAccountKey  = "xxxxxxxxxxxxxxxxy4/xxxxxxxxxxxxxxxxfwpbIC5aAWA8wDu+AFXZB827Mt9lybZB1nUcQbQiUrkPtilK5BQ==";

Not

Ö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.

Uygulamayı derleyin ve çalıştırın

Batch iş akışını uygulamalı olarak görmek için 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'nde çözüme sağ tıklayın ve Derleme Çözümü’ne tıklayın.

  • İ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.

Ö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. Görevler, ilk işlem düğümünü çalışır çalışmaz çalışmak üzere kuyruğa alınır. Havuz, işlem düğümleri, iş ve görevleri izlemek için Azure portalında Batch hesabınıza gidin.

Sample start: 11/16/2018 4:02:54 PM

Container [input] created.
Uploading file taskdata0.txt to container [input]...
Uploading file taskdata1.txt to container [input]...
Uploading file taskdata2.txt to container [input]...
Creating pool [DotNetQuickstartPool]...
Creating job [DotNetQuickstartJob]...
Adding 3 tasks to job [DotNetQuickstartJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...

Görevleri tamamladıktan sonra her görev için aşağıdakine benzer bir çıktı görürsünüz:

Printing task output.
Task: Task0
Node: tvm-2850684224_3-20171205t000401z
Standard out:
Batch processing began with mainframe computers and punch cards. Today it still plays a central role in business, engineering, science, and other pursuits that require running lots of automated tasks....
stderr:
...

Varsayılan yapılandırmasında uygulama çalıştırıldığında tipik yürütme süresi yaklaşık 5 dakikadır. En çok süren işlem ilk havuz kurulumudur. Işi yeniden çalıştırmak için önceki çalıştırmadan işi silin ve havuzu silmeyin. Önceden yapılandırılmış bir havuzda işin tamamlanması birkaç saniye sürer.

Kodu gözden geçirin

Bu hızlı başlangıçtaki .NET uygulaması şunları yapar:

  • Azure depolama hesabınızdaki blob kapsayıcısına üç küçük metin dosyası yükler. Bu dosyalar, Batch tarafından işlenecek girişlerdir.
  • Windows Server çalıştıran bir işlem düğümleri havuzu oluşturur.
  • Düğümler üzerinde çalıştırılacak bir iş ve üç görev oluşturur. Her görev bir Windows komut satırı kullanarak giriş dosyalarından birini işler.
  • Görevler tarafından döndürülen dosyaları gösterir.

Ayrıntılar için Program.cs dosyasına ve aşağıdaki bölümlere bakın.

Başlangıç bilgileri

Bir depolama hesabı ile etkileşimde bulunmak üzere uygulama, .NET için Azure Depolama İstemci Kitaplığı’nı kullanır. CloudStorageAccount ile hesaba bir başvuru oluşturur ve buradan da bir CloudBlobClient oluşturur.

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

Uygulama, depolama hesabında bir kapsayıcı oluşturmak ve kapsayıcıya veri dosyaları yüklemek için blobClient başvurusunu kullanır. Depolama alanındaki dosyalar, Batch hizmetinin daha sonra işlem düğümlerine indirebileceği Batch ResourceFile nesneleri olarak tanımlanır.

List<string> inputFilePaths = new List<string>
{
    "taskdata0.txt",
    "taskdata1.txt",
    "taskdata2.txt"
};

List<ResourceFile> inputFiles = new List<ResourceFile>();

foreach (string filePath in inputFilePaths)
{
    inputFiles.Add(UploadFileToContainer(blobClient, inputContainerName, filePath));
}

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, Azure Active Directory kimlik doğrulamasını da destekler.)

BatchSharedKeyCredentials cred = new BatchSharedKeyCredentials(BatchAccountUrl, BatchAccountName, BatchAccountKey);

using (BatchClient batchClient = BatchClient.Open(cred))
...

İşlem düğümleri havuzu oluşturma

Bir Batch havuzu oluşturmak için uygulama, 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 Linux ve Windows Server görüntülerinin yanı sıra özel VM görüntülerini destekler.

Düğüm sayısı (PoolNodeCount) ve VM boyutu (PoolVMSize), tanımlı sabitlerdir. Örnek varsayılan olarak iki farklı düğümden Standard_A1_v2 oluşturur. Önerilen boyut, bu hızlı örnek için performans ile maliyetin iyi bir dengesini sunar.

Commit yöntemi, havuzu Batch hizmetine gönderir.


private static VirtualMachineConfiguration CreateVirtualMachineConfiguration(ImageReference imageReference)
{
    return new VirtualMachineConfiguration(
        imageReference: imageReference,
        nodeAgentSkuId: "batch.node.windows amd64");
}

private static ImageReference CreateImageReference()
{
    return new ImageReference(
        publisher: "MicrosoftWindowsServer",
        offer: "WindowsServer",
        sku: "2016-datacenter-smalldisk",
        version: "latest");
}

private static void CreateBatchPool(BatchClient batchClient, VirtualMachineConfiguration vmConfiguration)
{
    try
    {
        CloudPool pool = batchClient.PoolOperations.CreatePool(
            poolId: PoolId,
            targetDedicatedComputeNodes: PoolNodeCount,
            virtualMachineSize: PoolVMSize,
            virtualMachineConfiguration: vmConfiguration);

        pool.Commit();
    }
...

Batch işi oluşturma

Batch işi bir veya daha fazla görevin mantıksal gruplandırmasıdır. Bir iş, öncelik gibi görevler arasında ortak olan ayarları ve görevlerin çalıştırılacağı havuzu içerir. Uygulama, havuzunuzda bir iş oluşturmak üzere BatchClient.JobOperations.CreateJob yöntemini kullanır.

Commit yöntemi, işi Batch hizmetine gönderir. Başlangıçta iş hiçbir görev içermez.

try
{
    CloudJob job = batchClient.JobOperations.CreateJob();
    job.Id = JobId;
    job.PoolInformation = new PoolInformation { PoolId = PoolId };

    job.Commit();
}
...

Görev oluşturma

Uygulama, CloudTask nesnelerinin bir listesini oluşturur. Her görev, CommandLine özelliği kullanarak giriş ResourceFile nesnesini işler. Örnekte, komut satırı giriş dosyasını göstermek üzere Windows type komutunu çalıştırır. Bu komut, tanıtım amaçlı basit bir örnektir. Batch kullandığınızda komut satırı, uygulamanızı veya betiğinizi belirttiğiniz yerdir. Batch, işlem düğümlerine uygulama ve betik dağıtmanın çeşitli yollarını sağlar.

Sonra uygulama, AddTask yöntemi ile görevleri işe ekler ve işlem düğümleri üzerinde çalışmak üzere kuyruğa alır.

for (int i = 0; i < inputFiles.Count; i++)
{
    string taskId = String.Format("Task{0}", i);
    string inputFilename = inputFiles[i].FilePath;
    string taskCommandLine = String.Format("cmd /c type {0}", inputFilename);

    CloudTask task = new CloudTask(taskId, taskCommandLine);
    task.ResourceFiles = new List<ResourceFile> { inputFiles[i] };
    tasks.Add(task);
}

batchClient.JobOperations.AddTask(JobId, tasks);

Görev çıktısını görüntüleme

Uygulama, tamamlandığından emin olmak üzere görevleri izlemek için bir TaskStateMonitor oluşturur. Daha sonra uygulama, CloudTask.ComputeNodeInformation özelliğini kullanarak her bir tamamlanmış görevin oluşturduğu stdout.txt dosyasını gösterir. Görev başarıyla çalıştırıldığında, görev komutunun çıkışı stdout.txt dosyasına yazılır:

foreach (CloudTask task in completedtasks)
{
    string nodeId = String.Format(task.ComputeNodeInformation.ComputeNodeId);
    Console.WriteLine("Task: {0}", task.Id);
    Console.WriteLine("Node: {0}", nodeId);
    Console.WriteLine("Standard out:");
    Console.WriteLine(task.GetNodeFile(Constants.StandardOutFileName).ReadAsString());
}

Kaynakları temizleme

Uygulama kendi oluşturduğu depolama kapsayıcısını otomatik olarak siler ve Batch havuzu ve işini silme seçeneğini sunar. Zamanlanmış bir iş olmasa bile, düğümler çalışırken havuz için sizden ücret alınır. Havuz artık gerekli değilse silin. Havuzu sildikten sonra düğümlerde yer alan tüm görev çıktıları silinir.

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 hızlı başlangıçta, bir Batch havuzu ve bir Batch işi oluşturmak amacıyla Batch .NET API’si kullanılarak oluşturulan küçük bir uygulamayı çalıştırdınız. İş, örnek görevler çalıştırmış ve düğümler üzerinde oluşturulan çıktıyı indirmiştir. Batch hizmetinin temel kavramlarını anlıyoruz. Artık Batch'i daha büyük ölçekte daha gerçekçi iş yükleriyle sınabilirsiniz. Azure Batch hakkında daha fazla bilgi almak ve bir gerçek yaşam uygulaması ile paralel iş yükü açıklaması görmek için Batch .NET öğreticisine geçin.