Aracılığıyla paylaş


JavaScript için Batch SDK'sını kullanmaya başlama

Azure Batch JavaScript SDK'sını kullanarak JavaScript'te Batch istemcisi oluşturmanın temellerini öğrenin. Toplu iş uygulaması senaryosunu anlamak ve javaScript kullanarak ayarlamak için adım adım bir yaklaşım benimsiyoruz.

Önkoşullar

Bu makalede JavaScript ve Linux hakkında bilgi sahibi olduğunuz varsayılır. Ayrıca, Batch ve Depolama hizmetleri oluşturmak için erişim haklarına sahip bir Azure hesabınız olduğu varsayılmıştır.

Bu makaledeki adımlara geçmeden önce Azure Batch Teknik Genel Bakış makalesini okumanızı öneririz.

Senaryoyu anlama

Burada, Python'da yazılmış basit bir betiğimiz var. Bu betik bir Azure Blob depolama kapsayıcısından tüm csv dosyalarını indirir ve bunları JSON'a dönüştürür. Birden çok depolama hesabı kapsayıcısını paralel olarak işlemek için betiği bir Azure Batch işi olarak dağıtabiliriz.

Azure Batch mimarisi

Aşağıdaki diyagramda, Azure Batch ve istemci kullanarak Python betiğini nasıl ölçeklendirebileceğimiz gösterilmiştir.

Senaryo mimarisini gösteren diyagram.

JavaScript örneği, depolama hesabındaki kapsayıcı sayısına bağlı olarak bir hazırlık görevi (daha sonra ayrıntılı olarak açıklanmıştır) ve bir dizi görev içeren bir toplu iş dağıtır. Betikleri GitHub deposundan indirebilirsiniz.

İpucu

Belirtilen bağlantıdaki JavaScript örneği, Azure işlev uygulaması olarak dağıtılacak belirli bir kod içermiyor. Bu kodu oluşturmak için aşağıdaki bağlantılardan yararlanabilirsiniz.

Uygulama oluşturma

Şimdi JavaScript istemcisini oluşturma işlemini adım adım takip edelim:

1. Adım: Azure Batch SDK’sını yükleme

npm install komutunu kullanarak JavaScript için Azure Batch SDK'sını yükleyebilirsiniz.

npm install @azure/batch

Bu komut, azure-batch JavaScript SDK'sının en son sürümünü yükler.

İpucu

Bir Azure İşlev uygulamasında npm yükleme komutlarını çalıştırmak için Azure işlevinin Ayarlar sekmesindeki "Kudu Console" bölümüne gidebilirsiniz. Bu durumda JavaScript için Azure Batch SDK'sını yüklemek için.

2. Adım: Azure Batch hesabı oluşturma

Bunu Azure portal veya komut satırından (PowerShell /Azure CLI) oluşturabilirsiniz.

Azure CLI aracılığıyla oluşturmak için kullanılacak komutlar aşağıdadır.

Bir Kaynak Grubu oluşturun. İçinde Batch hesabını oluşturmak istediğiniz bir Kaynak Grubunuz zaten varsa bu adımı atlayın.

az group create -n "<resource-group-name>" -l "<location>"

Ardından bir Azure Batch hesabı oluşturun.

az batch account create -l "<location>" -g "<resource-group-name>" -n "<batch-account-name>"

Her Batch hesabının ilgili erişim anahtarları vardır. Bu anahtarlar Azure Batch hesabında yeni kaynaklar oluşturmak için gerekir. Üretim ortamı için iyi bir uygulama bu anahtarları depolamak için Azure Key Vault kullanmaktır. Daha sonra uygulama için bir Hizmet sorumlusu oluşturabilirsiniz. Uygulama, bu hizmet sorumlusunu kullanarak, Key Vault’taki anahtarlara erişmek için bir OAuth belirteci oluşturabilir.

az batch account keys list -g "<resource-group-name>" -n "<batch-account-name>"

Sonraki adımlarda kullanılacak anahtarı kopyalayın ve saklayın.

3. Adım: Azure Batch hizmet istemcisi oluşturma

Aşağıdaki kod parçacığı, önce azure-batch JavaScript modülünü içeri aktarır ve ardından bir Batch Hizmeti istemcisi oluşturur. İlk olarak, önceki adımda kopyaladığınız Batch hesabınızın anahtarıyla bir SharedKeyCredentials nesnesi oluşturmanız gerekir.

// Initializing Azure Batch variables

import { BatchServiceClient, BatchSharedKeyCredentials } from "@azure/batch";

// Replace values below with Batch Account details
const batchAccountName = '<batch-account-name>';
const batchAccountKey = '<batch-account-key>';
const batchEndpoint = '<batch-account-url>';

const credentials = new BatchSharedKeyCredentials(batchAccountName, batchAccountKey);
const batchClient = new BatchServiceClient(credentials, batchEndpoint);

Azure Batch URI’sı, Azure portal'ın genel bakış sekmesinde bulunur. Biçimi şöyledir:

https://accountname.location.batch.azure.com

Ekran görüntüsüne bakın:

Azure batch uri

4. Adım: Azure Batch havuzu oluşturma

Bir Azure Batch havuzu birden çok VM’den (Batch Düğümleri olarak da bilinir) oluşur. Azure Batch hizmeti, görevleri bu düğümlere dağıtır ve yönetir. Havuzunuz için aşağıdaki yapılandırma parametrelerini tanımlayabilirsiniz.

  • Sanal Makine Türü görüntüsü
  • Sanal Makine düğümlerinin boyutu
  • Sanal Makine düğümlerinin sayısı

İpucu

Sanal Makine düğümlerinin sayısı ve boyutu büyük ölçüde görevlere ve paralel olarak çalıştırmak istediğiniz görev sayısına bağlıdır. İdeal sayısını ve boyutunu belirlemek için test etmenizi öneririz.

Aşağıdaki kod parçacığı, yapılandırma parametresi nesnelerini oluşturur.

// Creating Image reference configuration for Ubuntu Linux VM
const imgRef = {
    publisher: "Canonical",
    offer: "UbuntuServer",
    sku: "20.04-LTS",
    version: "latest"
}
// Creating the VM configuration object with the SKUID
const vmConfig = {
    imageReference: imgRef,
    nodeAgentSKUId: "batch.node.ubuntu 20.04"
};
// Number of VMs to create in a pool
const numVms = 4;

// Setting the VM size
const vmSize = "STANDARD_D1_V2";

İpucu

Azure Batch’te kullanılabilen Linux VM görüntüleri ve bu görüntülerin SKU kimliklerinin bir listesi için bkz. Sanal makine görüntüleri listesi.

Havuzun yapılandırması tanımlandığında, Azure Batch havuzunu oluşturabilirsiniz. Batch havuz komutu Azure sanal makine düğümleri oluşturur ve bu düğümleri, yürütülecek görevleri almaya hazır olacak şekilde hazırlar. Her havuz, sonraki adımlarda başvuru için benzersiz bir kimliğe sahip olmalıdır.

Aşağıdaki kod parçacığı bir Azure Batch havuzu oluşturur.

// Create a unique Azure Batch pool ID
const now = new Date();
const poolId = `processcsv_${now.getFullYear()}${now.getMonth()}${now.getDay()}${now.getHours()}${now.getSeconds()}`;

const poolConfig = {
    id: poolId,
    displayName: "Processing csv files",
    vmSize: vmSize,
    virtualMachineConfiguration: vmConfig,
    targetDedicatedNodes: numVms,
    enableAutoScale: false
};

// Creating the Pool
var pool = batchClient.pool.add(poolConfig, function (error, result){
    if(error!=null){console.log(error.response)};
});

Oluşturulan havuzun durumunu kontrol edip bu havuza bir iş göndermeden önce durumunun "etkin" olduğundan emin olun.

var cloudPool = batchClient.pool.get(poolId,function(error,result,request,response){
        if(error == null)
        {

            if(result.state == "active")
            {
                console.log("Pool is active");
            }
        }
        else
        {
            if(error.statusCode==404)
            {
                console.log("Pool not found yet returned 404...");

            }
            else
            {
                console.log("Error occurred while retrieving pool data");
            }
        }
        });

Pool.get işlevi tarafından döndürülen örnek bir sonuç nesnesi aşağıdadır.

{
  id: 'processcsv_2022002321',
  displayName: 'Processing csv files',
  url: 'https://<batch-account-name>.westus.batch.azure.com/pools/processcsv_2022002321',
  eTag: '0x8D9D4088BC56FA1',
  lastModified: 2022-01-10T07:12:21.943Z,
  creationTime: 2022-01-10T07:12:21.943Z,
  state: 'active',
  stateTransitionTime: 2022-01-10T07:12:21.943Z,
  allocationState: 'steady',
  allocationStateTransitionTime: 2022-01-10T07:13:35.103Z,
  vmSize: 'standard_d1_v2',
  virtualMachineConfiguration: {
    imageReference: {
      publisher: 'Canonical',
      offer: 'UbuntuServer',
      sku: '20.04-LTS',
      version: 'latest'
    },
    nodeAgentSKUId: 'batch.node.ubuntu 20.04'
  },
  resizeTimeout: 'PT15M',
  currentDedicatedNodes: 4,
  currentLowPriorityNodes: 0,
  targetDedicatedNodes: 4,
  targetLowPriorityNodes: 0,
  enableAutoScale: false,
  enableInterNodeCommunication: false,
  taskSlotsPerNode: 1,
  taskSchedulingPolicy: { nodeFillType: 'Spread' }}

4. Adım: Azure Batch işi gönderme

Azure Batch işi, benzer görevlerden oluşan bir mantıksal gruptur. Senaryomuzda "Csv'yi JSON'a işleme" şeklindedir. Buradaki her görev, her Azure Depolama kapsayıcısında bulunan csv dosyalarını işliyor olabilir.

Bu görevler paralel olarak çalışır ve Azure Batch hizmeti tarafından düzenlenmiş birden çok düğüm arasında dağıtılır.

İpucu

Tek bir düğümde eşzamanlı olarak çalışabilecek en fazla görev sayısını belirtmek için taskSlotsPerNode özelliğini kullanabilirsiniz.

Hazırlık görevi

Oluşturulan VM düğümleri boş Ubuntu düğümleridir. Çoğunlukla, önkoşul olarak bir dizi program yüklemeniz gerekir. Genellikle, Linux düğümleri için gerçek görevleri çalıştırmadan önce önkoşulları yükleyen bir kabuk betiğine sahip olabilirsiniz. Ancak bu, programlanabilir herhangi bir yürütülebilir dosya da olabilir.

Bu örnekteki kabuk betiği Python-pip'i ve Python için Azure Depolama Blob SDK'sını yükler.

Betiği Azure Depolama Hesabına yüklemeyebilir ve betiğe erişmek için bir SAS URI'sı oluşturabilirsiniz. Bu işlem, Azure Depolama JavaScript SDK'sı kullanılarak da otomatikleştirilebilir.

İpucu

Bir işin hazırlama görevi, yalnızca ilgili görevi çalıştırması gereken VM düğümlerinde çalışır. Önkoşulların, üzerinde çalışan görevlerden bağımsız olarak tüm düğümlere yüklenmesini istiyorsanız havuz eklerken startTask özelliğini kullanabilirsiniz. Aşağıdaki hazırlık görev tanımını referans olarak kullanabilirsiniz.

Hazırlık görevi, Azure Batch işi gönderildiği sırada belirtilir. Bazı yapılandırılabilir hazırlık görevi parametreleri şunlardır:

  • ID: Hazırlık görevi için benzersiz bir tanımlayıcıdır.
  • commandLine: Görevin yürütülebilir dosyasını çalıştıran komut satırıdır.
  • resourceFiles: Bu görevin çalışması için indirilmesi gereken dosyaların ayrıntılarını sağlayan nesneler dizisidir. Seçenekleri aşağıda verilmiştir.
    • httpUrl: İndirilmesi gereken dosyanın URL'si
    • filePath: Dosyanın indirileceği ve kaydedileceği için yerel yoldur.
    • fileMode: Yalnızca Linux düğümlerinde kullanılan fileMode, sekizli biçimdedir ve varsayılan değeri 0770’tir.
  • waitForSuccess: True olarak ayarlandığında hazırlık görevi hatalarında görev çalışmaz.
  • runElevated: Görevi çalıştırmak için yükseltilmiş ayrıcalıklar gerekiyorsa true olarak ayarlayın.

Aşağıdaki kod parçacığında, hazırlama görevi betik yapılandırma örneği gösterilmektedir:

var jobPrepTaskConfig = {id:"installprereq",commandLine:"sudo sh startup_prereq.sh > startup.log",resourceFiles: [{ 'httpUrl': 'Blob sh url', 'filePath': 'startup_prereq.sh' }],waitForSuccess:true,runElevated:true, userIdentity: {autoUser: {elevationLevel: "admin", scope: "pool"}}}

Görevleri çalıştırmak yüklenecek herhangi bir önkoşul yoksa hazırlama görevlerini atlayabilirsiniz. Aşağıdaki kod görünen adı "process csv files" olan bir iş oluşturur.

// Setting Batch Pool ID
const poolInfo = { poolId: poolId };
// Batch job configuration object
const jobId = "processcsvjob";
const jobConfig = {
    id: jobId,
    displayName: "process csv files",
    jobPreparationTask: jobPrepTaskConfig,
    poolInfo: poolInfo
};
// Adding Azure batch job to the pool
const job = batchClient.job.add(jobConfig, function (error, result) {
        if (error !== null) {
            console.log("An error occurred while creating the job...");
            console.log(error.response);
        }
    }
);

5. Adım: Bir iş için Azure Batch görevlerini gönderme

İşlem csv işimiz oluşturulduğuna göre bu iş için görevleri oluşturabiliriz. Dört kapsayıcımız olduğunu varsayarsak, her kapsayıcı için bir tane olmak üzere dört görev oluşturmamız gerekir.

Python betiğine baktığımızda iki parametre kabul ettiğini görüyoruz:

  • kapsayıcı adı: Dosyaların indirileceği Depolama kapsayıcısı
  • desen: Dosya adı için isteğe bağlı bir desen parametresi

Aşağıdaki kodda dört "con1", "con2", "con3","con4" kapsayıcımız olduğu varsayıldığında, daha önce oluşturduğumuz "process csv" Azure toplu işine dört görev gönderme işlemi gösterilmektedir.

// storing container names in an array
const containerList = ["con1", "con2", "con3", "con4"];      //Replace with list of blob containers within storage account
containerList.forEach(function (val, index) {
    console.log("Submitting task for container : " + val);
    const containerName = val;
    const taskID = containerName + "_process";
    // Task configuration object
    const taskConfig = {
        id: taskID,
        displayName: 'process csv in ' + containerName,
        commandLine: 'python processcsv.py --container ' + containerName,
        resourceFiles: [{ 'httpUrl': 'Blob script url', 'filePath': 'processcsv.py' }]
    };

    const task = batchClient.task.add(jobId, taskConfig, function (error, result) {
        if (error !== null) {
            console.log("Error occurred while creating task for container " + containerName + ". Details : " + error.response);
        }
        else {
            console.log("Task for container : " + containerName + " submitted successfully");
        }
    });
});

Kod, havuza birden çok görev ekler. Oluşturulan tüm görevler, oluşturulan VM havuzunda bir düğüm üzerinde yürütülür. Görev sayısı havuzdaki VM sayısını veya taskSlotsPerNode özelliğini aşarsa, görevler bir düğümün kullanılabilir duruma gelmesini bekler. Bu düzenleme Azure Batch tarafından otomatik olarak gerçekleştirilir.

Portalda görevler ve iş durumları hakkında ayrıntılı görünümler bulunur. Listeyi kullanabilir ve Azure JavaScript SDK'sında işlevleri alabilirsiniz. Ayrıntılar belgeler bağlantısında verilmiştir.

Sonraki adımlar