Wprowadzenie do zestawu SDK usługi Batch dla języka JavaScript
Poznaj podstawy tworzenia klienta usługi Batch w języku JavaScript przy użyciu zestawu SDK języka JavaScript Azure Batch. Krok po kroku rozumiemy scenariusz aplikacji wsadowej, a następnie konfigurujemy ją przy użyciu języka JavaScript.
Wymagania wstępne
W tym artykule założono, że masz działającą wiedzę na temat języka JavaScript i znajomości systemu Linux. Przyjęto również założenie, że masz skonfigurowane konto platformy Azure z prawami dostępu do tworzenia usług Batch i Storage.
Zalecane jest przeczytanie artykułu Azure Batch Technical Overview (Omówienie techniczne usługi Azure Batch) przed wykonaniem instrukcji opisanych w tym artykule.
Omówienie scenariusza
W tym miejscu mamy prosty skrypt napisany w języku Python, który pobiera wszystkie pliki CSV z kontenera usługi Azure Blob Storage i konwertuje je na format JSON. Aby przetwarzać wiele kontenerów kont magazynów równolegle, można wdrożyć skrypt jako zadanie w ramach usługi Azure Batch.
architektura Azure Batch
Na poniższym diagramie przedstawiono sposób skalowania skryptu języka Python przy użyciu Azure Batch i klienta.
Przykładowy kod JavaScript wdraża zadanie wsadowe z zadaniem przygotowywania (szczegółowo wyjaśnione w dalszej części) i zestawem zadań w zależności od liczby kontenerów na koncie magazynu. Skrypty można pobrać z repozytorium GitHub.
- Przykładowy kod
- Przygotowanie skryptów powłoki zadań
- Konwerter plików csv języka Python na format JSON
Porada
Przykładowy kod JavaScript podany w podanym linku nie zawiera określonego kodu, który ma zostać wdrożony jako aplikacja funkcji platformy Azure. Użyj następujących linków, aby zapoznać się z instrukcjami tworzenia kodu.
- Tworzenie aplikacji funkcji
- Create timer trigger function (Tworzenie funkcji wyzwalanej czasomierzem)
Kompilowanie aplikacji
Teraz wykonajmy krok po kroku proces tworzenia klienta JavaScript:
Krok 1. Instalowanie zestawu SDK usługi Azure Batch
Zestaw SDK Azure Batch dla języka JavaScript można zainstalować przy użyciu polecenia npm install.
npm install @azure/batch
To polecenie instaluje najnowszą wersję zestawu AZURE-batch JavaScript SDK.
Porada
W aplikacji funkcji platformy Azure należy przejść do karty Ustawienia, a następnie do obszaru „Konsola Kudu”, aby uruchomić polecenia npm install. W tym przypadku należy zainstalować zestaw SDK Azure Batch dla języka JavaScript.
Krok 2. Tworzenie konta usługi Azure Batch
Można go utworzyć na podstawie Azure Portal lub z poziomu wiersza polecenia (interfejswiersza polecenia platformy Azureprogramu PowerShell /).
Poniżej przedstawiono polecenia, które umożliwiają utworzenie konta za pomocą interfejsu wiersza polecenia platformy Azure.
Utwórz grupę zasobów. Pomiń ten krok, jeśli masz już grupę, w której chcesz utworzyć konto usługi Azure Batch:
az group create -n "<resource-group-name>" -l "<location>"
Następnie utwórz konto usługi Azure Batch.
az batch account create -l "<location>" -g "<resource-group-name>" -n "<batch-account-name>"
Każde konto usługi Batch ma odpowiadające mu klucze dostępu. Te klucze są wymagane do tworzenia dodatkowych zasobów na koncie usługi Azure Batch. Dobrym rozwiązaniem dla środowiska produkcyjnego jest użycie usługi Azure Key Vault do przechowywania tych kluczy. Następnie można utworzyć jednostkę usługi dla aplikacji. Przy użyciu tej jednostki usługi aplikacja może utworzyć token OAuth w celu uzyskania dostępu do kluczy z magazynu kluczy.
az batch account keys list -g "<resource-group-name>" -n "<batch-account-name>"
Skopiuj i zachowaj klucz, ponieważ będzie potrzebny w kolejnych krokach samouczka.
Krok 3. Tworzenie klienta usługi Azure Batch
Poniższy fragment kodu najpierw importuje moduł JavaScript azure-batch, a następnie tworzy klienta usługi Batch. Najpierw należy utworzyć obiekt SharedKeyCredentials za pomocą klucza konta usługi Batch skopiowanego w poprzednim kroku.
// 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);
Identyfikator URI usługi Azure Batch można znaleźć na karcie Przegląd witryny Azure Portal. Jego format to:
https://accountname.location.batch.azure.com
Przyjrzyj się zrzutowi ekranu:
Krok 4. Tworzenie puli usługi Azure Batch
Pula usługi Azure Batch składa się z wielu maszyn wirtualnych (znanych także jako węzły usługi Batch). Usługa Azure Batch wdraża zadania podrzędne na tych węzłach i zarządza nimi. Dla puli można zdefiniować następujące parametry konfiguracji.
- Typ obrazu maszyny wirtualnej
- Rozmiar węzłów maszyny wirtualnej
- Liczba węzłów maszyny wirtualnej
Porada
Rozmiar i liczba węzłów maszyny wirtualnej w dużej mierze zależy od liczby zadań podrzędnych wykonywanych równolegle, a także od ich rodzaju. Zaleca się przeprowadzenie testów w celu określenia odpowiedniej liczby i rozmiaru węzłów.
Poniższy fragment kodu tworzy obiekty parametru konfiguracji.
// 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";
Porada
Lista obrazów maszyn wirtualnych systemu Linux dostępnych dla usługi Azure Batch oraz ich identyfikatorów jednostek SKU znajduje się w sekcji Lista obrazów maszyn wirtualnych.
Po zdefiniowaniu konfiguracji puli można przystąpić do tworzenia puli usługi Azure Batch. Polecenie dotyczące puli w ramach usługi Batch tworzy węzły maszyny wirtualnej platformy Azure i przygotowuje je do odbierania zadań podrzędnych do wykonania. Każda pula powinna mieć unikatowy identyfikator, który będzie potrzebny w kolejnych krokach samouczka.
Poniższy fragment kodu przedstawia tworzenie puli usługi 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
var pool = batchClient.pool.add(poolConfig, function (error, result){
if(error!=null){console.log(error.response)};
});
Przed przesłaniem zadania do tej puli należy sprawdzić stan utworzonej puli, aby upewnić się, że jest „aktywny”.
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");
}
}
});
Poniżej przedstawiono przykładowy obiekt wyniku zwrócony przez funkcję 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' }}
Krok 4. Przesyłanie zadania usługi Azure Batch
Zadanie usługi Azure Batch jest logiczną grupą podobnych zadań podrzędnych. W naszym scenariuszu jest to "Przetwarzanie pliku CSV do formatu JSON". Każde zadanie w tym miejscu może być przetwarzaniem plików CSV znajdujących się w każdym kontenerze usługi Azure Storage.
Dzięki usłudze Azure Batch zadania podrzędne będą wykonywane równolegle i wdrażane w wielu węzłach.
Porada
Za pomocą właściwości taskSlotsPerNode można określić maksymalną liczbę zadań, które mogą być uruchamiane współbieżnie w jednym węźle.
Zadanie podrzędne przygotowania
Utworzone węzły maszyny wirtualnej są pustymi węzłami systemu Ubuntu. Często konieczne jest zainstalowanie zestawu programów. Zazwyczaj w przypadku węzłów systemu Linux można korzystać ze skryptu powłoki, który instaluje wstępnie wymagane oprogramowanie przed uruchomieniem jakichkolwiek zadań podrzędnych. Jednak może to być dowolny inny programowalny i wykonywalny skrypt.
Skrypt powłoki w tym przykładzie instaluje środowisko Python-pip i zestaw AZURE Storage Blob SDK dla języka Python.
W celu uzyskania dostępu do skryptu można go przekazać na konto usługi Azure Storage i wygenerować identyfikator URI sygnatury dostępu współdzielonego. Ten proces można również zautomatyzować przy użyciu zestawu SDK języka JavaScript usługi Azure Storage.
Porada
Zadanie podrzędne przygotowania w ramach zadania działa tylko na węzłach tej maszyny wirtualnej, na której konkretne zadanie podrzędne musi zostać uruchomione. Jeśli chcesz zainstalować wstępnie wymagane oprogramowanie we wszystkich węzłach (niezależnie od rodzaju zadania podrzędnego, które będzie w nich uruchamiane), podczas dodawania puli użyj właściwości startTask. Poniżej przedstawiono definicję zadania podrzędnego przygotowania.
Zadanie podrzędne przygotowania jest określane podczas przesyłania zadania usługi Azure Batch. Poniżej przedstawiono kilka konfigurowalnych parametrów zadania przygotowania:
- D: unikatowy identyfikator zadania podrzędnego przygotowania
- commandLine: wiersz polecenia służący do wykonania wykonywalnego zadania podrzędnego
-
resourceFiles: tablica obiektów zawierająca szczegółowe informacje o plikach, które należy pobrać w celu uruchomienia zadania podrzędnego. Poniżej przedstawiono dostępne opcje
- httpUrl: adres URL pliku do pobrania
- filePath: ścieżka lokalna do pobrania i zapisania pliku
- fileMode: dotyczy wyłącznie węzłów systemu Linux, opcja fileMode jest w formacie ósemkowym i domyślnie ma wartość 0770
- waitForSuccess: jeśli ma wartość „true”, zadanie podrzędne nie zostanie uruchomione w razie niepowodzenia zadania podrzędnego przygotowania
- runElevated: jeśli do uruchomienia zadania podrzędnego konieczne są podwyższone uprawnienia, należy ustawić wartość „true”.
Poniższy fragment kodu pokazuje przykładową konfigurację skryptu zadania podrzędnego przygotowania:
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"}}}
Jeśli nie ma konieczności instalowania żadnego wstępnie wymaganego oprogramowania w celu uruchomienia zadań podrzędnych, można pominąć zadania podrzędne przygotowania. Następujący kod tworzy zadanie o nazwie wyświetlanej „process csv files” (konwertowanie plików csv).
// 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);
}
}
);
Krok 5. Przesyłanie zadań podrzędnych usługi Azure Batch do zadania
Po utworzeniu zadania konwertującego pliki csv można utworzyć dla niego zadania podrzędne. Przy założeniu, że mamy cztery kontenery, należy utworzyć cztery zadania podrzędne, po jednym dla każdego kontenera.
Skrypt języka Python przyjmuje dwa parametry:
- nazwa kontenera: kontener magazynu, z którego pobierane są pliki
- wzorzec: opcjonalny parametr wzorca nazwy plików
Zakładając, że mamy cztery kontenery "con1", "con2", "con3", "con4" w poniższym kodzie przedstawiono przesyłanie czterech zadań do utworzonego wcześniej zadania wsadowego "process csv".
// 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 dodaje wiele zadań podrzędnych do puli. Poszczególne zadania podrzędne są wykonywane w węźle utworzonej puli maszyn wirtualnych. Jeśli liczba zadań przekracza liczbę maszyn wirtualnych w puli lub właściwość taskSlotsPerNode, zadania zaczekaj na udostępnienie węzła. Takie ograniczenia są zapewniane przez usługę Azure Batch automatycznie.
W witrynie Azure Portal zamieszczono szczegółowe widoki stanów zadań i zadań podrzędnych. Możesz również użyć listy i pobrać funkcje w zestawie SDK języka JavaScript platformy Azure. Szczegółowe informacje znajdują się w dokumentacji, do której prowadzi ten link.
Następne kroki
- Dowiedz się więcej o przepływie pracy usługi Batch i zasobach podstawowych , takich jak pule, węzły, zadania i zadania podrzędne.
- Zobacz dokumentację języka JavaScript usługi Batch , aby zapoznać się z interfejsem API usługi Batch.