البدء مع Batch SDK لـ JavaScript
تعرَّف على أساسيات إنشاء عميل Batch في JavaScript باستخدام Azure Batch JavaScript SDK. نتخذ نهجاً تدريجيًّا لفهم سيناريو تطبيق دفعي ثم إعداده باستخدام JavaScript.
المتطلبات الأساسية
تفترض هذه المقالة أن لديك معرفة عملية بـ JavaScript ومعرفة بنظام Linux. يفترض أيضاً أن لديك إعداد حساب Azure مع حقوق الوصول لإنشاء خِدمات الدُفعات والتخزين.
نوصي بقراءة نظرة عامة فنية حول Azure Batch قبل متابعة الخطوات الموضَّحة في هذه المقالة.
فَهم السيناريو
هنا، لدينا نص بسيط مكتوب بلغة Python يقوم بتنزيل جميع ملفات csv من حاوية تخزين Azure Blob ويحوِّلها إلى JSON. لمعالجة عدة حاويات حساب تخزين بالتوازي، يمكننا نشر البرنامج النصي كوظيفة Azure Batch.
بِنْية Azure Batch
يوضح الرسم التخطيطي الآتي كيف يمكننا قياس برنامج Python النصي باستخدام Azure Batch والعميل.
ينشر نموذج JavaScript وظيفة دُفعية مع مهمة تحضير (موضحة بالتفصيل لاحقاً) ومجموعة من المهام بناءً على عدد الحاويات في حساب التخزين. يمكنك تنزيل البرامج النصية من مستودع GitHub.
تلميح
لا يحتوي نموذج JavaScript في الارتباط المحدَّد على تعليمات برمجية محدَّدة لنشرها كتطبيق دالة Azure. يمكنك الرجوع إلى الروابط التالية للحصول على إرشادات لإنشاء واحد.
إنشاء التطبيق
الآن، هيّا نتبع العملية خطوة بخطوة في بناء عميل JavaScript:
الخطوة 1: قم بتثبيت Azure Batch SDK
يمكنك تثبيت Azure Batch SDK لـ JavaScript باستخدام الأمر npm install.
npm install @azure/batch
يقوم هذا الأمر بتثبيت أحدث إصدار من حزمة Azure-batch JavaScript SDK.
تلميح
في تطبيق Azure Function، يمكنك الانتقال إلى "Kudu Console" في علامة تبويب إعدادات وظائف Azure لتشغيل أوامر تثبيت npm. في هذه الحالة لتثبيت Azure Batch SDK لـ JavaScript.
الخطوة 2: إنشاء حساب Azure Batch
يمكنك إنشائه من مدخل Microsoft Azure أو من سطر الأوامر (PowerShell /Azure CLI).
فيما يلي أوامر إنشاء واحد من خلال Azure CLI.
قم بإنشاء مجموعة موارد، وتخطو هذه الخطوة إذا كان لديك بالفعل مجموعة تريد إنشاء حساب الدُفعات فيها:
az group create -n "<resource-group-name>" -l "<location>"
بعد ذلك، قم بإنشاء حساب Azure Batch.
az batch account create -l "<location>" -g "<resource-group-name>" -n "<batch-account-name>"
كل حساب دفعة له مفاتيح الوصول المقابلة الخاصة به. هذه المفاتيح ضرورية لإنشاء موارد إضافية في حساب Azure الدفعي. من الممارسات الجيدة لبيئة الإنتاج استخدام Azure Key Vault لتخزين هذه المفاتيح. يمكنك بعد ذلك إنشاء مدير خدمة للتطبيق. باستخدام هذه الخدمة الرئيسية، يمكن للتطبيق إنشاء رمز OAuth المميز للوصول إلى المفاتيح من خزنة المفاتيح.
az batch account keys list -g "<resource-group-name>" -n "<batch-account-name>"
قم بنسخ المفتاح وتخزينه لاستخدامه في الخطوات اللاحقة.
الخطوة 3: إنشاء عميل خدمة Azure Batch
تقوم القصاصة البرمجية التالية أولاً باستيراد وحدة JavaScript azure-batch ثم إنشاء عميل Batch Service. تحتاج أولاً إلى إنشاء كائن SharedKeyCredentials باستخدام مفتاح حساب Batch المنسوخ من الخطوة السابقة.
// 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 في علامة التبويب نظرة عامة في مدخل Microsoft Azure. يكون بالتنسيق:
https://accountname.location.batch.azure.com
الرجوع إلى لقطة الشاشة:
الخطوة 4: إنشاء تجمع Azure Batch
يتكون تجمُّع Azure Batch من أجهزة افتراضية متعددة (تُعرف أيضاً باسم عُقَد الدُفعات). تنشر خدمة Azure Batch المهام على هذه العُقَد وتديرها. يمكنك تحديد معلمات التكوين التالية للتجميع الخاص بك.
- نوع صورة الجهاز الظاهري
- حجم عُقَد الجهاز الظاهري
- عدد عُقَد الجهاز الظاهري
تلميح
يعتمد حجم عُقَد الجهاز الظاهري وعددها على عدد المهام التي تريد تشغيلها بالتوازي إلى حد كبير، وكذلك المهمة نفسها. نوصي بإجراء اختبار لتحديد العدد والحجم المثاليَّيْن.
تنشئ القصاصة البرمجية التالية كائنات معلمات التكوين.
// 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";
تلميح
للحصول على قائمة بصور Linux VM المتوفرة لـ Azure Batch ومعرفات SKU الخاصة بهم، راجع قائمة صور الجهاز الظاهري.
بمجرد تحديد تكوين التجمع، يمكنك إنشاء تجمع Azure Batch. ينشئ أمر تجمع الدُفعات عُقداً Azure Virtual Machine ويجهزها لتكون جاهزة لتلقي المهام المراد تنفيذها. يجب أن يكون لكل تجمع معرّف فريد للرجوع إليه في الخطوات اللاحقة.
ينشئ مقتطف التعليمات البرمجية التالي تجمع 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)};
});
يمكنك التحقق من حالة التجمع الذي تم إنشاؤه والتأكد من أن الحالة "نشطة" قبل المضي قُدُماً في تقديم الوظيفة إلى هذا التجمع.
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.
{
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: إرسال وظيفة Azure Batch
وظيفة Azure Batch هي مجموعة منطقية من المهام المتشابهة. في السيناريو لدينا، إنه "معالجة csv إلى JSON". يمكن أن تعالج كل مهمة ملفات csv الموجودة في كل حاوية تخزين Azure Storage.
ستُشغَّل هذه المهام بالتوازي ونشرها عبر عُقَد متعددة، بتنسيق بواسطة خدمة Azure Batch.
تلميح
يمكنك استخدام الخاصية taskSlotsPerNode لتحديد الحد الأقصى لعدد المهام التي يمكن تشغيلها تزامُنِيّاً على عُقْدة واحدة.
مهمة التحضير
عُقد VM التي تم إنشاؤها هي عُقَد Ubuntu فارغة. غالباً ما تحتاج إلى تثبيت مجموعة من البرامج بوصفها متطلبات أساسية. عادةً، بالنسبة لعُقَد Linux، يمكن أن يكون لديك برنامج نصي shell يقوم بتثبيت المتطلبات الأساسية قبل تشغيل المهام الفعلية. ومع ذلك يمكن أن يكون أي قابل للتنفيذ قابل للبرمجة.
يقوم البرنامج النصي shell في هذا المثال بتثبيت Python-pip و Azure Storage SDK لـ Python.
يمكنك تحميل البرنامج النصي على حساب تخزين Azure وإنشاء SAS URI للوصول إلى البرنامج النصي. يمكن أيضاً جعل هذه العملية تعمل تلقائياً باستخدام Azure Storage JavaScript SDK.
تلميح
يتم تشغيل مهمة التحضير لوظيفة ما فقط على عُقَد VM حيث تحتاج المهمة المحددة إلى التشغيل. إذا كنت تريد تثبيت المتطلبات الأساسية على جميع العُقَد بغض النظر عن المهام التي يتم تشغيلها عليها، فيمكنك استخدام خاصية startTask أثناء إضافة مجموعة. يمكنك استخدام تعريف مهمة التحضير التالي كمرجع.
يتم تحديد مهمة تحضير أثناء إرسال وظيفة Azure Batch. فيما يلي بعض المعلمات لمهمة التحضير القابلة للتكوين:
- ID: معرّف فريد لمهمة التحضير
- commandLine: سطر أوامر لتنفيذ المهمة القابلة للتنفيذ
-
ResourceFiles: مصفوفة من الكائنات تقدم تفاصيل عن الملفات المطلوب تنزيلها لتشغيل هذه المهمة. فيما يلي خياراته
- httpUrl: عنوان URL للملف المراد تنزيله
- filePath: مسار محلي لتنزيل الملف وحفظه
- fileMode: قابل للتطبيق فقط على عُقَد Linux، ويكون fileMode بتنسيق ثُمانيّ مع قيمة افتراضية 0770
- waitForSuccess: إذا عُلِّم على "صواب"، فلن تُشغَّل المهمة عند فشل مهمة التحضير
- runElevated: عيِّنها على "true" إذا كانت هناك حاجة إلى امتيازات مرتفعة لتشغيل المهمة.
تظهِر القصاصة البرمجية الآتية نموذج تكوين البرنامج النصي لمهمة التحضير:
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"}}}
إذا لم تكن هناك متطلبات سابقة كي تُثبَّت لتشغيل مهامك، فيمكنك تخطي مهام الإعداد. تنشئ التعليمات البرمجية التالية مهمة باسم العرض "معالجة ملفات 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);
}
}
);
الخطوة 5: إرسال مهام Azure Batch لوظيفة ما
الآن بعد أن أُنشِئت وظيفة csv للعملية الخاصة بنا، فلنقم بإنشاء مهام لهذه الوظيفة. بافتراض أن لدينا أربع حاويات، يتعين علينا إنشاء أربع مهام، واحدة لكل حاوية.
إذا نظرنا إلى نص Python، فإنه يقبل معلمتين:
- اسم الحاوية: حاوية التخزين لتنزيل الملفات منها
- النمط: معلمة اختيارية لنمط اسم الملف
بافتراض أن لدينا أربع حاويات "con1"، و"con2"، و"con3"، و"con4" توضح التعليمات البرمجية التالية إرسال المهام الأربعة إلى وظيفة Azure الدفعية "عملية 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");
}
});
});
تضيف التعليمة البرمجية مهام متعددة إلى التجمع. ويتم تنفيذ كل مهمة على عُقْدة في مجموعة الأجهزة الافتراضية التي تم إنشاؤها. إذا تجاوز عدد المهام عدد الأجهزة الظاهرية في تجمع أو الخاصية taskSlotsPerNode، تنتظر المهام حتى يتم توفير عُقْدة. يُعالَج هذا التنسيق بواسطة Azure Batch تلقائياً.
يحتوي المدخل على طُرق عرض مفصلة للمهام وحالات الوظائف. يمكنك أيضاً استخدام القائمة والحصول على الوظائف في Azure JavaScript SDK. تتوفر التفاصيل في رابط الوثائق.
الخطوات التالية
- تعرف على سير عمل الخدمة المجمِّعة والموارد الأساسية مثل المجمعات والعُقَد والوظائف والمهام.
- راجع مرجع Batch JavaScript لاستكشاف Batch API.