Mulai menggunakan Batch SDK untuk JavaScript

Pelajari dasar-dasar membangun klien Batch di JavaScript menggunakan Azure Batch JavaScript SDK. Kami mengambil pendekatan langkah demi langkah untuk memahami skenario untuk aplikasi batch lalu menyiapkannya menggunakan JavaScript.

Prasyarat

Artikel ini mengasumsikan bahwa Anda memiliki pengetahuan kerja tentang JavaScript dan keakraban dengan Linux. Ini juga mengasumsikan bahwa Anda memiliki akun Azure yang sudah disiapkan dengan hak akses untuk membuat layanan Batch dan Storage.

Sebaiknya baca Azure Batch Gambaran Umum Teknis sebelum Anda melalui langkah-langkah yang diuraikan artikel ini.

Memahami skenario

Di sini, kami memiliki skrip sederhana yang ditulis dalam Python yang mengunduh semua file csv dari kontainer penyimpanan blob Azure dan mengonversinya ke JSON. Untuk memproses beberapa kontainer akun penyimpanan secara paralel, kita dapat menyebarkan skrip sebagai pekerjaan Azure Batch.

arsitektur Azure Batch

Diagram berikut menggambarkan bagaimana kita dapat menskalakan skrip Python menggunakan Azure Batch dan klien.

Diagram memperlihatkan arsitektur skenario.

Contoh JavaScript ini menerapkan pekerjaan batch dengan tugas persiapan (dijelaskan secara rinci nanti) dan sekumpulan tugas tergantung pada jumlah kontainer dalam akun penyimpanan. Anda dapat mengunduh skrip dari repositori GitHub.

Petunjuk / Saran

Sampel JavaScript dalam tautan yang ditentukan tidak berisi kode tertentu untuk disebarkan sebagai aplikasi fungsi Azure. Anda dapat merujuk ke tautan berikut untuk petunjuk membuatnya.

Membangun aplikasi

Sekarang, mari kita ikuti proses langkah demi langkah untuk membangun klien JavaScript.

Langkah 1: Menginstal SDK Azure Batch

Anda dapat menginstal Azure Batch SDK untuk JavaScript menggunakan perintah npm install. Anda juga memerlukan paket @azure/identity untuk mengautentikasi dengan Microsoft Entra ID.

npm install @azure/batch @azure/identity

Perintah ini menginstal versi terbaru Azure Batch JavaScript SDK bersama dengan pustaka identitas Azure.

Petunjuk / Saran

Di aplikasi fungsi Azure, Anda dapat membuka "Konsol Kudu" di tab Pengaturan fungsi Azure untuk menjalankan perintah penginstalan npm. Dalam hal ini untuk menginstal SDK Azure Batch untuk JavaScript.

Langkah 2: Membuat akun Azure Batch

Anda dapat membuatnya dari portal Azure atau dari baris perintah (PowerShell /Azure CLI).

Berikut ini adalah perintah untuk membuatnya melalui Azure CLI.

Buat Grup Sumber Daya, lewati langkah ini jika Anda sudah memilikinya di mana Anda ingin membuat Akun Batch:

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

Selanjutnya, buat akun Azure Batch.

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

Alih-alih menggunakan kunci akses akun, sampel ini mengautentikasi dengan Microsoft Entra ID menggunakan DefaultAzureCredential. Pastikan identitas yang menjalankan kode (rincian masuk pengembang Anda, identitas terkelola, atau perwakilan layanan) telah diberi peran RBAC Azure yang sesuai pada akun Batch, seperti Azure Batch Kontributor Data atau Azure Batch Pembaca Data. Untuk informasi selengkapnya, lihat solusi layanan Authenticate Batch dengan Microsoft Entra ID.

Saat berjalan secara lokal, DefaultAzureCredential dapat mengambil kredensial dari variabel Azure CLI (az login), Azure PowerShell, Visual Studio Code, atau lingkungan. Di lingkungan yang dihosting di Azure, seperti Azure Functions atau Azure VM, lingkungan tersebut dapat menggunakan identitas terkelola.

Langkah 3: Membuat klien layanan Azure Batch

Cuplikan kode berikut mengimpor @azure/batch modul dan @azure/identity lalu membuat BatchClient menggunakan DefaultAzureCredential.

// Initializing Azure Batch variables

import { DefaultAzureCredential } from "@azure/identity";
import { BatchClient } from "@azure/batch";

// Replace value below with your Batch account URL
const batchEndpoint = '<batch-account-url>';

const credentials = new DefaultAzureCredential();
const batchClient = new BatchClient(batchEndpoint, credentials);

URI Azure Batch dapat ditemukan di tab Gambaran Umum portal Azure. Formatnya adalah:

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

Lihat cuplikan layar:

Azure uri batch

Langkah 4: Membuat kumpulan Azure Batch

Kumpulan Batch di Azure terdiri dari beberapa mesin virtual (VM) yang juga dikenal sebagai Node Batch. Layanan Azure Batch menyebarkan tugas pada node ini dan mengelolanya. Anda dapat menentukan parameter konfigurasi berikut untuk kumpulan Anda.

  • Jenis citra Mesin Virtual
  • Ukuran simpul Mesin Virtual
  • Jumlah simpul Mesin Virtual

Petunjuk / Saran

Ukuran dan jumlah node Mesin Virtual sangat bergantung pada banyaknya tugas yang ingin Anda jalankan secara paralel, serta pada tugas itu sendiri. Kami merekomendasikan pengujian untuk menentukan jumlah dan ukuran yang ideal.

Cuplikan kode berikut membuat objek parameter konfigurasi.

// 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";

Petunjuk / Saran

Untuk daftar gambar VM Linux yang tersedia untuk Azure Batch dan ID SKU mereka, lihat Daftar gambar mesin virtual.

Setelah konfigurasi kumpulan ditentukan, Anda dapat membuat kumpulan Azure Batch. Perintah kumpulan Batch membuat simpul Mesin Virtual Azure dan mempersiapkannya agar siap menerima tugas yang akan diproses. Setiap kolam harus memiliki ID unik untuk referensi dalam langkah-langkah berikutnya.

Cuplikan kode berikut membuat pool Azure Batch.

// 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
try {
    await batchClient.createPool(poolConfig);
} catch (error) {
    console.log(error);
}

Anda dapat memeriksa status pool yang dibuat dan memastikan bahwa keadaannya berstatus "aktif" sebelum melanjutkan dengan pengiriman Job ke pool tersebut.

try {
    const cloudPool = await batchClient.getPool(poolId);
    if (cloudPool.state === "active") {
        console.log("Pool is active");
    }
} catch (error) {
    if (error.statusCode === 404) {
        console.log("Pool not found yet returned 404...");
    } else {
        console.log("Error occurred while retrieving pool data");
    }
}

Berikut ini adalah contoh objek hasil yang dikembalikan oleh fungsi pool.get.

{
  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' }}

Langkah 4: Kirim tugas Azure Batch

Pekerjaan Azure Batch adalah grup logis dari tugas serupa. Dalam skenario kami, ini adalah "Proses csv ke JSON." Setiap tugas di sini bisa memproses file csv yang ada di setiap kontainer Azure Storage.

Tugas-tugas ini akan berjalan secara paralel dan disebarkan di beberapa simpul, diatur oleh layanan Azure Batch.

Petunjuk / Saran

Anda dapat menggunakan properti taskSlotsPerNode untuk menentukan jumlah maksimum tugas yang dapat berjalan bersamaan pada satu simpul.

Tugas persiapan

Simpul-simpul VM yang dibuat adalah simpul kosong Ubuntu. Sering kali, Anda perlu menginstal serangkaian program sebagai prasyarat. Biasanya, untuk node Linux Anda dapat memiliki skrip shell yang menginstal persyaratan sebelum tugas yang sebenarnya dijalankan. Namun, ini bisa berupa perangkat lunak yang dapat diprogram.

Skrip shell dalam contoh ini menginstal Python-pip dan Azure Storage Blob SDK untuk Python.

Anda dapat mengunggah skrip di Akun Azure Storage dan membuat URI SAS untuk mengakses skrip. Proses ini juga dapat diotomatisasi menggunakan SDK JavaScript Azure Storage.

Petunjuk / Saran

Tugas persiapan untuk sebuah pekerjaan hanya berjalan di node VM tempat tugas khusus tersebut perlu dijalankan. Jika Anda ingin prasyarat diinstal pada semua simpul terlepas dari tugas yang berjalan di dalamnya, Anda dapat menggunakan properti startTask saat menambahkan kumpulan. Anda dapat menggunakan definisi tugas persiapan berikut sebagai referensi.

Tugas persiapan ditetapkan saat pengiriman tugas Azure Batch. Berikut adalah beberapa parameter tugas persiapan yang dapat dikonfigurasi:

  • ID: Pengidentifikasi unik untuk tugas persiapan
  • commandLine: Baris perintah untuk menjalankan tugas yang dapat dieksekusi
  • resourceFiles: Array objek yang menyediakan detail file yang perlu diunduh agar tugas ini berjalan. Berikut ini adalah opsinya
    • httpUrl: URL file untuk diunduh
    • filePath: Jalur lokal untuk mengunduh dan menyimpan file
    • fileMode: Hanya berlaku untuk simpul Linux, fileMode dalam format oktal dengan nilai bawaan 0770
  • waitForSuccess: Jika diatur ke benar, tugas tidak akan dijalankan jika terjadi kegagalan tugas persiapan
  • runElevated: Atur ke true jika hak istimewa yang ditingkatkan diperlukan untuk menjalankan tugas.

Cuplikan kode berikut menunjukkan sampel konfigurasi skrip tugas persiapan:

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

Jika tidak ada prasyarat yang harus diinstal agar tugas Anda dapat berjalan, Anda dapat melewati tugas persiapan. Kode berikut membuat pekerjaan dengan nama tampilan "process csv files."

// 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
try {
    await batchClient.createJob(jobConfig);
} catch (error) {
    console.log("An error occurred while creating the job...");
    console.log(error);
}

Langkah 5: Mengirimkan tugas Azure Batch untuk pekerjaan

Sekarang setelah pekerjaan proses CSV kita dibuat, mari kita buat tugas untuk pekerjaan itu. Misalkan kita memiliki empat kontainer, kita harus membuat empat tugas, satu untuk setiap kontainer.

Jika kita melihat skrip Python, skrip menerima dua parameter:

  • nama kontainer: Kontainer Penyimpanan untuk mengunduh file dari
  • pattern: Parameter opsional dari pola nama file

Dengan asumsi kami memiliki empat kontainer "con1", "con2", "con3", "con4", kode berikut menunjukkan mengirimkan empat tugas ke "Azure Batch Job" "proses CSV" yang kami buat sebelumnya.

// storing container names in an array
const containerList = ["con1", "con2", "con3", "con4"];      //Replace with list of blob containers within storage account
for (const val of containerList) {
    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' }]
    };

    try {
        await batchClient.createTask(jobId, taskConfig);
        console.log("Task for container : " + containerName + " submitted successfully");
    } catch (error) {
        console.log("Error occurred while creating task for container " + containerName + ". Details : " + error);
    }
}

Kode menambahkan beberapa tugas ke kumpulan. Dan setiap tugas dieksekusi pada sebuah node dalam kumpulan VM yang telah dibuat. Jika jumlah tugas melebihi jumlah VM dalam sebuah pool atau properti taskSlotsPerNode, tugas-tugas tersebut akan menunggu hingga sebuah node tersedia. Orkestrasi ini ditangani oleh Azure Batch secara otomatis.

Portal memiliki tampilan terperinci tentang tugas dan status pekerjaan. Anda juga dapat menggunakan daftar dan mendapatkan fungsi di SDK JavaScript Azure. Detail disediakan dalam tautan dokumentasi.

Langkah berikutnya