Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Poznaj podstawy tworzenia klienta usługi Batch w języku JavaScript przy użyciu zestawu SDK języka JavaScript usługi Azure Batch. Podejmujemy krok po kroku podejście do zrozumienia scenariusza dla aplikacji wsadowej, a następnie skonfigurowania jej 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 konfigurację konta platformy Azure z uprawnieniami dostępu do tworzenia usług Batch i Storage.
Zalecamy zapoznanie się z omówieniem technicznym usługi Azure Batch przed wykonaniem kroków 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 równolegle przetworzyć wiele kontenerów w kontach magazynowych, możemy wdrożyć skrypt jako zadanie Azure Batch.
Architektura usługi Azure Batch
Na poniższym diagramie przedstawiono sposób skalowania skryptu języka Python przy użyciu usługi Azure Batch i klienta.
Przykładowy kod JavaScript wdraża zadanie wsadowe zawierające zadanie przygotowania (szczegółowo opisane w dalszej części) i zestaw zadań zależnych od liczby kontenerów na koncie magazynowym. Skrypty można pobrać z repozytorium GitHub.
Wskazówka
Przykładowy kod JavaScript podany w podanym linku nie zawiera określonego kodu, który ma zostać wdrożony jako aplikacja funkcji platformy Azure. Aby uzyskać instrukcje dotyczące ich tworzenia, skorzystaj z poniższych linków.
- Create function app (Tworzenie aplikacji funkcji)
- Tworzenie funkcji wyzwalacza czasomierza
Kompilowanie aplikacji
Teraz wykonajmy krok po kroku proces tworzenia klienta JavaScript:
Krok 1. Instalowanie zestawu Azure Batch SDK
Zestaw Azure Batch SDK 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.
Wskazówka
W aplikacji funkcji Azure możesz przejść do "Konsola Kudu" na karcie ustawień, aby uruchomić polecenia npm install. W tym przypadku zainstaluj zestaw Azure Batch SDK dla języka JavaScript.
Krok 2. Tworzenie konta usługi Azure Batch
Można ją utworzyć w witrynie Azure portal lub z poziomu wiersza polecenia (programu PowerShell /interfejsu wiersza polecenia platformy Azure).
Poniżej przedstawiono polecenia umożliwiające utworzenie jednego za pomocą interfejsu wiersza polecenia platformy Azure.
Utwórz grupę zasobów, pomiń ten krok, jeśli masz już istniejącą, w której chcesz utworzyć konto 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 odpowiednie klucze dostępu. Te klucze są potrzebne do utworzenia dalszych zasobów na koncie usługi Azure Batch. Dobrym rozwiązaniem w środowisku produkcyjnym jest użycie usługi Azure Key Vault do przechowywania tych kluczy. Następnie możesz utworzyć Service principal (jednostkę główną usługi) dla aplikacji. Za pomocą 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 zapisz klucz do użycia w kolejnych krokach.
Krok 3. Tworzenie klienta usługi Azure Batch
Poniższy fragment kodu najpierw importuje moduł JavaScript usługi Azure-batch, a następnie tworzy klienta usługi Batch. Najpierw należy utworzyć obiekt SharedKeyCredentials z kluczem konta usługi Batch skopiowanym z poprzedniego 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. Jest to format:
https://accountname.location.batch.azure.com
Zapoznaj się z zrzutem ekranu:
Krok 4. Tworzenie puli usługi Azure Batch
Pula usługi Azure Batch składa się z wielu maszyn wirtualnych (nazywanych również węzłami usługi Batch). Usługa Azure Batch wdraża zadania w 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
Wskazówka
Rozmiar i liczba węzłów maszyny wirtualnej w dużej mierze zależą od liczby zadań, które mają być uruchamiane równolegle, a także samego zadania. Zalecamy testowanie w celu określenia idealnej liczby i rozmiaru.
Poniższy fragment kodu tworzy obiekty parametrów 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";
Wskazówka
Aby uzyskać listę obrazów maszyn wirtualnych z systemem Linux dostępnych dla usługi Azure Batch i ich identyfikatorów jednostek SKU, zobacz Lista obrazów maszyn wirtualnych.
Po zdefiniowaniu konfiguracji puli można utworzyć pulę usługi Azure Batch. Polecenie puli usługi Batch tworzy węzły maszyny wirtualnej platformy Azure i przygotowuje je do gotowości do odbierania zadań do wykonania. Każda pula powinna mieć unikatowy identyfikator do odwołania w kolejnych krokach.
Poniższy fragment kodu tworzy pulę 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)};
});
Możesz sprawdzić stan utworzonej puli i upewnić się, że stan jest w stanie "aktywny" przed przesłaniem zadania do tej puli.
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 znajduje się 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 to logiczna grupa podobnych zadań. 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.
Te zadania będą uruchamiane równolegle i wdrażane w wielu węzłach zorganizowanych przez usługę Azure Batch.
Wskazówka
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 przygotowania
Utworzone węzły maszyny wirtualnej są pustymi węzłami systemu Ubuntu. Często należy zainstalować zestaw programów jako wymagania wstępne. Zazwyczaj w przypadku węzłów systemu Linux można mieć skrypt powłoki, który instaluje wymagania wstępne przed uruchomieniem rzeczywistych zadań. Jednak może to być dowolny programowalny plik wykonywalny.
Skrypt powłoki w tym przykładzie instaluje środowisko Python-i zestaw SDK obiektów blob usługi Azure Storage dla języka Python.
Możesz przekazać skrypt na konto usługi Azure Storage i wygenerować identyfikator URI sygnatury dostępu współdzielonego, aby uzyskać dostęp do skryptu. Ten proces można również zautomatyzować przy użyciu zestawu SDK języka JavaScript usługi Azure Storage.
Wskazówka
Zadanie przygotowania dla zadania jest uruchamiane tylko w węzłach maszyny wirtualnej, w których określone zadanie musi zostać uruchomione. Jeśli chcesz, aby wymagania wstępne zostały zainstalowane na wszystkich węzłach niezależnie od zadań uruchomionych w nim, możesz użyć właściwości startTask podczas dodawania puli. Do celów referencyjnych można użyć następującej definicji zadania przygotowania.
Zadanie przygotowania jest określane podczas przesyłania zadania usługi Azure Batch. Poniżej przedstawiono kilka konfigurowalnych parametrów zadania przygotowania:
- IDENTYFIKATOR: unikatowy identyfikator zadania przygotowania
- commandLine: wiersz polecenia do uruchomienia pliku wykonywalnego zadania
-
resourceFiles: tablica obiektów, które zawierają szczegółowe informacje o plikach potrzebnych do pobrania dla tego zadania do uruchomienia. Poniżej przedstawiono jego opcje
- httpUrl: adres URL pliku do pobrania
- filePath: ścieżka lokalna do pobrania i zapisania pliku
- fileMode: dotyczy tylko węzłów systemu Linux, fileMode jest w formacie ósemkowym z wartością domyślną 0770
- waitForSuccess: jeśli ustawiono wartość true, zadanie nie jest uruchamiane w przypadku niepowodzeń zadania przygotowania
- runElevated: ustaw wartość na true, jeśli wymagane jest uruchomienie zadania z podwyższonym poziomem uprawnień.
Poniższy fragment kodu przedstawia przykład konfiguracji skryptu zadania 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 wymagań wstępnych do zainstalowania dla uruchomienia zadań, możesz pominąć zadania przygotowawcze. Poniższy kod tworzy zadanie o nazwie wyświetlanej "przetwarzaj pliki 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ń usługi Azure Batch dla zadania
Teraz, kiedy nasze zadanie procesu CSV zostało utworzone, utwórzmy zadania dla tego procesu. Zakładając, że mamy cztery kontenery, musimy utworzyć cztery zadania, po jednym dla każdego kontenera.
Jeśli przyjrzymy się skryptowi języka Python, akceptuje on dwa parametry:
- nazwa kontenera: kontener magazynu, z którego pobierane są pliki
- wzorzec: opcjonalny parametr wzorca nazwy pliku
Zakładając, że mamy cztery kontenery "con1", "con2", "con3", "con4", kod poniżej pokazuje przesyłanie czterech zadań do utworzonego wcześniej zadania wsadowego Azure "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 różnorodne zadania do puli. Każde zadanie jest wykonywane na węźle w utworzonej puli maszyn wirtualnych. Jeśli liczba zadań przekracza liczbę maszyn wirtualnych w puli lub właściwość taskSlotsPerNode, zadania czekają na udostępnienie węzła. Ta aranżacja jest obsługiwana automatycznie przez usługę Azure Batch.
W portalu przedstawiono szczegółowe widoki dotyczące zadań i stanów zadań. Możesz również użyć listy i pobrać funkcje w zestawie SDK języka JavaScript platformy Azure. Szczegółowe informacje znajdują się w linku do dokumentacji.
Następne kroki
- Dowiedz się więcej o schemacie działania usługi Batch oraz o podstawowych zasobach, takich jak pule, węzły, zadania i operacje.
- Zobacz dokumentację języka JavaScript usługi Batch , aby zapoznać się z interfejsem API usługi Batch.