Notatka
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 Azure Batch javaScript SDK. 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 Azure z uprawnieniami dostępu do tworzenia usług Batch i Storage.
Zalecamy przeczytanie Azure Batch Technical Overview przed wykonaniem kroków opisanych w tym artykule.
Omówienie scenariusza
W tym miejscu mamy prosty skrypt napisany w Python, który pobiera wszystkie pliki CSV z kontenera usługi Blob Storage Azure i konwertuje je na format JSON. Aby równolegle przetwarzać wiele kontenerów kont magazynu, możemy wdrożyć skrypt jako zadanie Azure Batch.
architektura Azure Batch
Na poniższym diagramie przedstawiono sposób skalowania skryptu Python przy użyciu 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.
- Przykład kodu
- skrypty powłoki do przygotowania zadań
- Python csv do procesora JSON
Wskazówka
Przykład języka JavaScript w określonym linku nie zawiera określonego kodu, który ma zostać wdrożony jako aplikacja funkcji Azure. Aby uzyskać instrukcje dotyczące ich tworzenia, skorzystaj z poniższych linków.
Kompilowanie aplikacji
Teraz wykonajmy krok po kroku proces tworzenia klienta JavaScript:
Krok 1. Instalowanie zestawu SDK 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.
Wskazówka
W aplikacji funkcji Azure możesz przejść do pozycji "Konsola Kudu" na karcie Ustawienia funkcji Azure, aby uruchomić polecenia instalacji narzędzia npm. W tym przypadku należy zainstalować zestaw SDK Azure Batch dla języka JavaScript.
Krok 2. Tworzenie konta Azure Batch
Można go utworzyć w portalu Azure lub w wierszu polecenia (PowerShell /Azure CLI).
Poniżej przedstawiono polecenia do utworzenia elementu za pomocą Azure CLI.
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 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 dodatkowych zasobów na koncie usługi Batch Azure. Dobrym rozwiązaniem w środowisku produkcyjnym jest użycie 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 Azure Batch można znaleźć na karcie Przegląd w portalu Azure. Jest to format:
https://accountname.location.batch.azure.com
Zapoznaj się z zrzutem ekranu:
Krok 4: Utwórz pulę Azure Batch
Pula 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 Azure Batch i ich identyfikatorów jednostek SKU, zobacz Lista obrazów maszyn wirtualnych.
Po zdefiniowaniu konfiguracji puli można utworzyć pulę Azure Batch. Polecenie puli usługi Batch tworzy węzły maszyn wirtualnych Azure i przygotowuje je do odbioru i wykonywania zadań. Każda pula powinna mieć unikalny identyfikator do odwołania w kolejnych krokach.
Poniższy fragment kodu tworzy pulę 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 jest "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 Azure Batch
Zadanie Azure Batch to logiczna grupa podobnych zadań. W naszym scenariuszu jest to "Przetwarzanie pliku CSV do formatu JSON". Każde zadanie może przetwarzać pliki CSV obecne w każdym kontenerze Azure Storage.
Te zadania będą uruchamiane równolegle i wdrażane w wielu węzłach, aranżowane przez usługę Azure Batch.
Wskazówka
Możesz użyć właściwości taskSlotsPerNode, aby 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 dla węzłów Linux można użyć skryptu powłoki, który instaluje wymagania wstępne przed uruchomieniem rzeczywistych zadań. Jednak może to być dowolny programowalny plik wykonywalny.
Skrypt programu shell w tym przykładzie instaluje narzędzie Python-pip i zestaw AZURE STORAGE Blob SDK dla Python.
Skrypt można przekazać na konto 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 Azure Storage.
Wskazówka
Zadanie przygotowawcze uruchamiane jest tylko na węzłach maszyny wirtualnej, gdzie określone zadanie musi się wykonać. Jeśli chcesz, aby wymagania wstępne zostały zainstalowane na wszystkich węzłach niezależnie od zadań uruchamianych 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 przygotowawcze jest definiowane podczas przesyłania zadania Azure Batch. Poniżej przedstawiono kilka konfigurowalnych parametrów zadania przygotowania:
- ID: unikatowy identyfikator zadania przygotowania
- commandLine: wiersz polecenia do wykonania 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 na true, jeśli potrzebne są podwyższone uprawnienia do uruchomienia zadania.
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ń 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 Python akceptuje 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”, w poniższym kodzie pokazano przesyłanie czterech zadań do partii wykonywania zadań Azure „process csv” utworzone wcześniej.
// 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 przez Azure Batch automatycznie.
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 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.