إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
تعلم أساسيات بناء عميل Batch باستخدام JavaScript باستخدام بطاقات Azure Batch JavaScript SDK. نتخذ نهجا خطوة بخطوة لفهم سيناريو لتطبيق دفعي ثم إعداده باستخدام JavaScript.
المتطلبات الأساسية
تفترض هذه المقالة أن لديك معرفة عملية بلغة JavaScript والإلمام ب Linux. كما يفترض أن لديك حساب Azure معد مع حقوق الوصول لإنشاء خدمات الدفعات والتخزين.
ننصح بقراءة Azure Batch نظرة فنية قبل أن تمر بالخطوات الموضحة في هذا المقال.
فَهم السيناريو
هنا، لدينا سكريبت بسيط مكتوب بلغة Python يقوم بتنزيل جميع ملفات csv من حاوية تخزين Azure Blob ويحولها إلى JSON. لمعالجة عدة حاويات حسابات تخزين بالتوازي، يمكننا نشر السكربت كمهمة Azure Batch.
Azure Batch architecture
يوضح الرسم البياني التالي كيف يمكننا توسيع نطاق سكريبت Python باستخدام Azure Batch وعميل.
تنشر عينة JavaScript مهمة دفعية مع مهمة إعداد (موضحة بالتفصيل لاحقا) ومجموعة من المهام اعتمادا على عدد الحاويات في حساب التخزين. يمكنك تحميل السكريبتات من مستودع GitHub.
تلميح
عينة جافاسكريبت في الرابط المحدد لا تحتوي على كود محدد ليتم نشره كتطبيق وظائف Azure. يمكنك الرجوع إلى الارتباطات التالية للحصول على إرشادات لإنشاء ارتباط.
إنشاء التطبيق
الآن، دعونا نتبع العملية خطوة بخطوة في بناء عميل JavaScript:
الخطوة 1: تثبيت Azure Batch SDK
يمكنك تثبيت Azure Batch SDK لجافا سكريبت باستخدام أمر npm install. تحتاج أيضا إلى حزمة @azure/identity للمصادقة مع Microsoft Entra ID.
npm install @azure/batch @azure/identity
يقوم هذا الأمر بتثبيت أحدث إصدار من مجموعة تطوير جافاسكريبت Azure Batch مع مكتبة Azure Identity.
تلميح
في تطبيق Azure Function، يمكنك الذهاب إلى "Kudu Console" في تبويب الإعدادات الخاصة بوظيفة Azure لتشغيل أوامر تثبيت npm. في هذه الحالة، لتثبيت Azure Batch SDK لجافا سكريبت.
الخطوة 2: إنشاء حساب Azure Batch
يمكنك إنشاؤه من بوابة Azure أو من سطر الأوامر (PowerShell /Azure CLI).
فيما يلي الأوامر لإنشاء واحد عبر Azure CLI.
إنشاء مجموعة موارد، قم بتخطي هذه الخطوة إذا كان لديك بالفعل واحدة تريد إنشاء حساب Batch فيها:
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>"
بدلا من استخدام مفاتيح الوصول إلى الحساب، يتم التحقق من Microsoft Entra ID باستخدام DefaultAzureCredential. تأكد من أن الهوية التي تشغل الكود (تسجيل دخول المطور، هوية مدارة، أو مدير خدمة) قد تم تعيين دور Azure RBAC مناسب على حساب الدفعة، مثل Azure Batch Data Contributor أو Azure Batch Data Reader. لمزيد من المعلومات، راجع Authenticate Batch Services solutions مع Microsoft Entra ID.
عند التشغيل محليا، يمكن ل DefaultAzureCredential التقاط بيانات الاعتماد من Azure CLI (az login)، Azure PowerShell، تعليمة Visual Studio برمجية، أو متغيرات البيئة. في البيئات المستضافة من Azure مثل دالات Azure أو Azure VMs، يمكن استخدام هوية مدارة.
الخطوة 3: إنشاء عميل خدمة Azure Batch
يقوم مقتطف الكود التالي باستيراد وحدات @azure/batch و ثم ينشئ باستخدام @azure/identityBatchClient.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);
يمكن العثور على Azure Batch URI في تبويب Overview في بوابة 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";
تلميح
للحصول على قائمة صور أجهزة لينكس الافتراضية المتاحة ل Azure Batch ومعرفات SKU الخاصة بها، انظر List of the virtual machine images.
بمجرد تحديد تكوين المجموعة، يمكنك إنشاء مجموعة 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
try {
await batchClient.createPool(poolConfig);
} catch (error) {
console.log(error);
}
يمكنك التحقق من حالة التجمع الذي تم إنشاؤه والتأكد من أن الحالة "نشطة" قبل المضي قدما في إرسال مهمة إلى ذلك التجمع.
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");
}
}
فيما يلي نموذج كائن نتيجة تم إرجاعه بواسطة الدالة 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.
كانت هذه المهام تعمل بالتوازي وتنشر عبر عقد متعددة، تنظمها خدمة Azure Batch.
تلميح
يمكنك استخدام خاصية taskSlotsPerNode لتحديد الحد الأقصى لعدد المهام التي يمكن تشغيلها في نفس الوقت على عقدة واحدة.
مهمة التحضير
عقد الجهاز الظاهري التي تم إنشاؤها هي عقد Ubuntu فارغة. غالبا ما تحتاج إلى تثبيت مجموعة من البرامج كمتطلبات أساسية. عادة، بالنسبة لعقد Linux، يمكنك الحصول على برنامج نصي shell يقوم بتثبيت المتطلبات الأساسية قبل تشغيل المهام الفعلية. ومع ذلك يمكن أن يكون أي قابل للتنفيذ قابل للبرمجة.
في هذا المثال، يقوم السكريبت shell بتثبيت Python-pip وحزمة تطوير تخزين Azure Blob ل Python.
يمكنك رفع السكريبت على حساب تخزين Azure وإنشاء رابط مستخدم SAS للوصول إلى السكريبت. يمكن أيضا أتمتة هذه العملية باستخدام مجموعة تطوير البرمجيات الخاصة ب تخزين Azure JavaScript.
تلميح
يتم تشغيل مهمة إعداد لوظيفة فقط على عقد الجهاز الظاهري حيث تحتاج المهمة المحددة إلى التشغيل. إذا كنت تريد تثبيت المتطلبات المسبقة على جميع العقد بغض النظر عن المهام التي تعمل عليها، يمكنك استخدام خاصية startTask أثناء إضافة مجموعة. يمكنك استخدام تعريف مهمة التحضير التالي للرجوع إليه.
يتم تحديد مهمة تحضير أثناء تقديم مهمة Azure Batch. فيما يلي بعض معلمات مهمة الإعداد القابلة للتكوين:
- معرف: معرف فريد لمهمة التحضير
- commandLine: سطر أوامر لتنفيذ المهمة التنفيذية
-
resourceFiles: مصفوفة من الكائنات التي توفر تفاصيل ملفات يجب تحميلها لتشغيل هذه المهمة. فيما يلي خياراته
- httpUrl: عنوان URL للملف المراد تنزيله
- filePath: المسار المحلي لتنزيل الملف وحفظه
- fileMode: ينطبق فقط على عقد Linux، fileMode بتنسيق ثماني بقيمة افتراضية 0770
- waitForSuccess: إذا تم تعيينها على true، لا تعمل المهمة عند فشل مهمة التحضير
- runElevated: تعيينه على true إذا كانت هناك حاجة إلى صلاحيات مرتفعة لتشغيل المهمة.
يظهر مقتطف التعليمات البرمجية التالي نموذج تكوين البرنامج النصي لمهمة الإعداد:
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" } }
};
إذا لم تكن هناك متطلبات أساسية ليتم تثبيتها لتشغيل مهامك، يمكنك تخطي مهام الإعداد. تنشئ التعليمات البرمجية التالية مهمة باسم العرض "معالجة ملفات 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
try {
await batchClient.createJob(jobConfig);
} catch (error) {
console.log("An error occurred while creating the job...");
console.log(error);
}
الخطوة 5: تقديم مهام Azure Batch لمهمة
الآن بعد أن تم إنشاء مهمة csv للعملية الخاصة بنا، دعنا ننشئ مهاما لتلك الوظيفة. بافتراض أن لدينا أربع حاويات، علينا إنشاء أربع مهام، واحدة لكل حاوية.
إذا نظرنا إلى سكريبت Python، فإنه يقبل معاملتين:
- اسم الحاوية: حاوية التخزين لتنزيل الملفات من
- النمط: معلمة اختيارية لنمط اسم الملف
بافتراض أن لدينا أربع حاويات مثل "con1"، "con2"، "con3"، "con4"، يظهر الكود التالي تقديم أربع مهام إلى مهمة Azure الدفعية "process csv" التي أنشأناها سابقا.
// 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);
}
}
تضيف التعليمات البرمجية مهاما متعددة إلى التجمع. ويتم تنفيذ كل مهمة على عقدة في تجمع الأجهزة الظاهرية التي تم إنشاؤها. إذا تجاوز عدد المهام عدد الأجهزة الظاهرية في تجمع أو خاصية taskSlotsPerNode، تنتظر المهام حتى يتم توفير عقدة. يتم تنفيذ هذا التوزيع التلقائي بواسطة Azure Batch.
يحتوي المدخل على طرق عرض مفصلة حول المهام وحالات الوظيفة. يمكنك أيضا استخدام القائمة والحصول على دوال في حزمة تطوير Azure JavaScript SDK. التفاصيل متوفرة في رابط الوثائق.
الخطوات التالية
- اطلع على سير عمل خدمة "الدُفعة" ومواردها الأساسية مثل المجموعات والعُقد والمهام.
- راجع مرجع جافاسكريبت الدفعي لاستكشاف واجهة برمجة تطبيقات الدفعات.