التشغيل السريع: استخدم .NET لإنشاء تجمع دفعي وتشغيل وظيفة

يوضح لك هذا التشغيل السريع كيفية بدء استخدام Azure Batch عن طريق تشغيل تطبيق C# الذي يستخدم Azure Batch .NET API. تطبيق .NET:

  • تحميل العديد من ملفات بيانات الإدخال إلى حاوية كائن ثنائي كبير الحجم ل Azure Storage لاستخدامها لمعالجة مهام Batch.
  • إنشاء تجمع من جهازين ظاهريين (VMs) أو حساب العقد، وتشغيل Windows Server.
  • إنشاء مهمة تقوم بتشغيل المهام على العقد لمعالجة كل ملف إدخال باستخدام سطر أوامر Windows.
  • يعرض ملفات الإخراج التي ترجعها المهام.

بعد إكمال هذا التشغيل السريع، ستفهم المفاهيم الرئيسية لخدمة Batch وتكون جاهزا لاستخدام Batch مع أحمال عمل أكثر واقعية وأوسع نطاقا.

المتطلبات الأساسية

تشغيل التطبيق

لإكمال هذا التشغيل السريع، يمكنك تنزيل التطبيق أو استنساخه، وتوفير قيم حسابك، وإنشاء التطبيق وتشغيله، والتحقق من الإخراج.

تنزيل التطبيق أو استنساخه

قم بتنزيل أو استنساخ تطبيق Azure Batch .NET Quickstart من GitHub. استخدم الأمر التالي لاستنساخ مستودع التطبيق مع عميل Git:

git clone https://github.com/Azure-Samples/batch-dotnet-quickstart.git

توفير معلومات حسابك

يحتاج التطبيق إلى استخدام أسماء حسابات الدفعة والتخزين وقيم مفتاح الحساب ونقطة نهاية حساب Batch. يمكنك الحصول على هذه المعلومات من مدخل Microsoft Azure أو واجهات برمجة تطبيقات Azure أو أدوات سطر الأوامر.

للحصول على معلومات حسابك من مدخل Microsoft Azure:

  1. من شريط Azure Search، ابحث عن اسم حساب Batch وحدده.
  2. في صفحة حساب Batch، حدد Keys من جزء التنقل الأيمن.
  3. في صفحة Keys ، انسخ القيم التالية:
  • حساب الدفعة
  • نقطة نهاية الحساب
  • مفتاح الوصول الأساسي
  • Storage account name
  • Key1

انتقل إلى مجلد batch-dotnet-quickstart الذي تم تنزيله وقم بتحرير سلاسل بيانات الاعتماد في Program.cs لتوفير القيم التي نسختها:

// Batch account credentials
private const string BatchAccountName = "<batch account>";
private const string BatchAccountKey  = "<primary access key>";
private const string BatchAccountUrl  = "<account endpoint>";

// Storage account credentials
private const string StorageAccountName = "<storage account name>";
private const string StorageAccountKey  = "<key1>

هام

لا ينصح بكشف مفاتيح الحساب في مصدر التطبيق لاستخدام الإنتاج. يجب تقييد الوصول إلى بيانات الاعتماد والإشارة إليها في التعليمات البرمجية باستخدام المتغيرات أو ملف التكوين. من الأفضل تخزين مفاتيح حساب الدفعة والتخزين في Azure Key Vault.

إنشاء التطبيق وتشغيله وعرض الإخراج

لمشاهدة سير عمل Batch أثناء العمل، قم بإنشاء التطبيق وتشغيله في Visual Studio. يمكنك أيضا استخدام سطر dotnet build الأوامر والأوامر dotnet run .

في Visual Studio:

  1. افتح ملف BatchDotNetQuickstart.sln، وانقر بزر الماوس الأيمن فوق الحل في مستكشف الحلول، وحدد Build. إذا طلب منك ذلك، فاستخدم nuGet مدير الحِزَم لتحديث حزم NuGet أو استعادتها.

  2. بمجرد اكتمال البناء، حدد BatchDotNetQuickstart في شريط القوائم العلوي لتشغيل التطبيق.

وقت التشغيل النموذجي مع التكوين الافتراضي حوالي خمس دقائق. يستغرق إعداد عقدة التجمع الأولي معظم الوقت. لإعادة تشغيل المهمة، احذف المهمة من التشغيل السابق، ولكن لا تحذف التجمع. على تجمع تم تكوينه مسبقًا، يتم إكمال المهمة في بضع ثوان.

يقوم التطبيق بإرجاع إخراج مشابه للمثال التالي:

Sample start: 11/16/2022 4:02:54 PM

Container [input] created.
Uploading file taskdata0.txt to container [input]...
Uploading file taskdata1.txt to container [input]...
Uploading file taskdata2.txt to container [input]...
Creating pool [DotNetQuickstartPool]...
Creating job [DotNetQuickstartJob]...
Adding 3 tasks to job [DotNetQuickstartJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...

هناك توقف مؤقت عند Monitoring all tasks for 'Completed' state, timeout in 00:30:00... بدء عقد حساب التجمع. عند إنشاء المهام، يقوم Batch بقوائم انتظارها لتشغيلها على التجمع. بمجرد توفر عقدة الحساب الأولى، يتم تشغيل المهمة الأولى على العقدة. يمكنك مراقبة العقدة والمهمة وحالة الوظيفة من صفحة حساب Batch في مدخل Microsoft Azure.

بعد اكتمال كل مهمة، سترى إخراجا مشابها للمثال التالي:

Printing task output.
Task: Task0
Node: tvm-2850684224_3-20171205t000401z
Standard out:
Batch processing began with mainframe computers and punch cards. Today it still plays a central role...
stderr:
...

مراجعة الرمز

راجع التعليمات البرمجية لفهم الخطوات في Azure Batch .NET Quickstart.

إنشاء عملاء الخدمة وتحميل ملفات الموارد

  1. للتفاعل مع حساب التخزين، يستخدم التطبيق مكتبة عميل Azure Storage Blobs ل .NET لإنشاء BlobServiceClient.

    var sharedKeyCredential = new StorageSharedKeyCredential(storageAccountName, storageAccountKey);
    string blobUri = "https://" + storageAccountName + ".blob.core.windows.net";
    
    var blobServiceClient = new BlobServiceClient(new Uri(blobUri), sharedKeyCredential);
    return blobServiceClient;
    
  2. يستخدم blobServiceClient التطبيق المرجع لإنشاء حاوية في حساب التخزين وتحميل ملفات البيانات إلى الحاوية. يتم تعريف الملفات الموجودة في التخزين كعناصر Batch ResourceFile التي يمكن للدفعة تنزيلها لاحقا إلى عقد الحوسبة.

    List<string> inputFilePaths = new()
    {
        "taskdata0.txt",
        "taskdata1.txt",
        "taskdata2.txt"
    };
    
    var inputFiles = new List<ResourceFile>();
    
    foreach (var filePath in inputFilePaths)
    {
        inputFiles.Add(UploadFileToContainer(containerClient, inputContainerName, filePath));
    }
    
  3. ينشئ التطبيق كائن BatchClient لإنشاء مجموعات الدفعات والوظائف والمهام وإدارتها. يستخدم عميل Batch مصادقة المفتاح المشترك. يدعم Batch أيضا مصادقة Microsoft Entra.

    var cred = new BatchSharedKeyCredentials(BatchAccountUrl, BatchAccountName, BatchAccountKey);
    
     using BatchClient batchClient = BatchClient.Open(cred);
    ...
    

قم بإنشاء مجموعة من العقد الحسابية

لإنشاء تجمع Batch، يستخدم التطبيق أسلوب BatchClient.PoolOperations.CreatePool لتعيين عدد العقد وحجم الجهاز الظاهري وتكوين التجمع. يحدد كائن VirtualMachineConfiguration التالي ImageReference إلى صورة Windows Server Marketplace. يدعم Batch مجموعة واسعة من صور نظام التشغيل Windows Server وLinux Marketplace، كما يدعم صور الجهاز الظاهري المخصصة.

حجم PoolVMSize الجهاز PoolNodeCount الظاهري و ثابتان معرفان. ينشئ التطبيق تجمعا من عقدتين Standard_A1_v2. يوفر هذا الحجم توازنا جيدا بين الأداء مقابل التكلفة لهذا التشغيل السريع.

يرسل أسلوب Commit التجمع إلى خدمة Batch.


private static VirtualMachineConfiguration CreateVirtualMachineConfiguration(ImageReference imageReference)
{
    return new VirtualMachineConfiguration(
        imageReference: imageReference,
        nodeAgentSkuId: "batch.node.windows amd64");
}

private static ImageReference CreateImageReference()
{
    return new ImageReference(
        publisher: "MicrosoftWindowsServer",
        offer: "WindowsServer",
        sku: "2016-datacenter-smalldisk",
        version: "latest");
}

private static void CreateBatchPool(BatchClient batchClient, VirtualMachineConfiguration vmConfiguration)
{
    try
    {
        CloudPool pool = batchClient.PoolOperations.CreatePool(
            poolId: PoolId,
            targetDedicatedComputeNodes: PoolNodeCount,
            virtualMachineSize: PoolVMSize,
            virtualMachineConfiguration: vmConfiguration);

        pool.Commit();
    }
...

إنشاء وظيفة دفعية

وظيفة الدفعة هي تجميع منطقي لمهمة واحدة أو أكثر. تتضمن المهمة الإعدادات الشائعة للمهام، مثل الأولوية والتجمع لتشغيل المهام عليها.

يستخدم التطبيق طريقة BatchClient.JobOperations.CreateJob لإنشاء وظيفة على مجموعتك. يرسل أسلوب Commit المهمة إلى خدمة Batch. في البداية المهمة ليس لها مهام.

try
{
    CloudJob job = batchClient.JobOperations.CreateJob();
    job.Id = JobId;
    job.PoolInformation = new PoolInformation { PoolId = PoolId };

    job.Commit();
}
...

إنشاء مهام

توفر Batch عدة طرق لنشر التطبيقات والبرامج النصية لحساب العقد. ينشئ هذا التطبيق قائمة بعناصر إدخال ResourceFile CloudTask. تعالج كل مهمة ملف إدخال باستخدام خاصية CommandLine . سطر الأوامر Batch هو المكان الذي تحدد فيه التطبيق أو البرنامج النصي.

يقوم سطر الأوامر في التعليمات البرمجية التالية بتشغيل أمر Windows type لعرض ملفات الإدخال. ثم يضيف التطبيق كل مهمة إلى المهمة باستخدام أسلوب AddTask ، الذي يقوم بقوائم انتظار المهمة لتشغيلها على عقد الحوسبة.

for (int i = 0; i < inputFiles.Count; i++)
{
    string taskId = String.Format("Task{0}", i);
    string inputFilename = inputFiles[i].FilePath;
    string taskCommandLine = String.Format("cmd /c type {0}", inputFilename);

    var task = new CloudTask(taskId, taskCommandLine)
    {
        ResourceFiles = new List<ResourceFile> { inputFiles[i] }
    };
    tasks.Add(task);
}

batchClient.JobOperations.AddTask(JobId, tasks);

عرض إخراج المهام

ينشئ التطبيق TaskStateMonitor لمراقبة المهام والتأكد من اكتمالها. عند تشغيل كل مهمة بنجاح، يكتب إخراجها إلى stdout.txt. ثم يستخدم التطبيق خاصية CloudTask.ComputeNodeInformation لعرض ملف stdout.txt لكل مهمة مكتملة.

foreach (CloudTask task in completedtasks)
{
    string nodeId = String.Format(task.ComputeNodeInformation.ComputeNodeId);
    Console.WriteLine("Task: {0}", task.Id);
    Console.WriteLine("Node: {0}", nodeId);
    Console.WriteLine("Standard out:");
    Console.WriteLine(task.GetNodeFile(Constants.StandardOutFileName).ReadAsString());
}

تنظيف الموارد

يقوم التطبيق تلقائيًا بحذف حاوية التخزين التي يقوم بإنشائها، ويمنحك خيار حذف تجمع الدفعة ووظيفتها. تتحمل التجمعات والعقد رسوما أثناء تشغيل العقد، حتى إذا لم تكن تشغل وظائف. إذا لم تعد بحاجة إلى التجمع، فاحذفه.

عندما لم تعد بحاجة إلى حساب Batch وحساب التخزين، يمكنك حذف مجموعة الموارد التي تحتوي عليها. في مدخل Microsoft Azure، حدد حذف مجموعة الموارد في أعلى صفحة مجموعة الموارد. في شاشة حذف مجموعة موارد، أدخل اسم مجموعة الموارد، ثم حدد حذف.

الخطوات التالية

في هذا التشغيل السريع، قمت بتشغيل تطبيق يستخدم Batch .NET API لإنشاء تجمع Batch والعقد والوظيفة والمهام. قامت المهمة بتحميل ملفات الموارد إلى حاوية تخزين، وتشغيل المهام على العقد، وعرض الإخراج من العقد.

الآن بعد أن فهمت المفاهيم الرئيسية لخدمة Batch، فأنت مستعد لاستخدام Batch مع أحمال عمل أكثر واقعية وأوسع نطاقا. لمعرفة المزيد حول Azure Batch والمرور عبر حمل عمل متوازي مع تطبيق في العالم الحقيقي، تابع إلى البرنامج التعليمي Batch .NET.