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

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

  • تحميل العديد من ملفات بيانات الإدخال إلى حاوية كائن ثنائي كبير الحجم ل تخزين Azure لاستخدامها لمعالجة مهام 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 وحدده.
  • حساب الدفعة
  • نقطة نهاية الحساب
  • اسم حساب التخزين
  • مُعرّف الاشتراك
  • اسم مجموعة الموارد

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

// Batch account credentials
const string BatchAccountName = "<batch account>";
const string BatchAccountUrl  = "<account endpoint>";

// Azure Resource Manager credentials for the Batch account
const string SubscriptionId    = "<subscription ID>";
const string ResourceGroupName = "<resource group name>";

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

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

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

في Visual Studio:

  1. افتح ملف BatchDotNetQuickstart.sln ، وانقر بزر الماوس الأيمن فوق الحل في مستكشف الحلول، وحدد إنشاء. إذا طلب منك ذلك، استخدم 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.

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

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

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

    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 من Azure. Compute.Batch لإنشاء وإدارة وظائف ومهام الدفعات. يستخدم عميل Batch مصادقة Microsoft Entra.

    BatchClient batchClient = new BatchClient(new Uri(BatchAccountUrl), new DefaultAzureCredential());
    ...
    
  4. التطبيق يستخدم أيضا Azure. ResourceManager.Batch لإدارة حساب Batch ومجموعاته. يقوم بإنشاء ArmClient ويحصل على مرجع BatchAccountResource لحساب Batch باستخدام معرف الاشتراك، واسم مجموعة الموارد، واسم حساب Batch من خلال الحساب.

    ArmClient armClient = new ArmClient(new DefaultAzureCredential());
    
    ResourceIdentifier batchAccountIdentifier = BatchAccountResource.CreateResourceIdentifier(
        SubscriptionId,
        ResourceGroupName,
        BatchAccountName);
    
    BatchAccountResource batchAccount = armClient.GetBatchAccountResource(batchAccountIdentifier);
    

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

لإنشاء مجموعة دفعات، يستخدم التطبيق طريقة BatchAccountPoolCollection.CreateOrUpdateAsync لتعيين عدد العقد، حجم الآلات الافتراضية، وتكوين المجموعة. الكائن التالي BatchVmConfiguration يحدد صورة BatchImageReference لصورة سوق Windows Server. يدعم Batch مجموعة واسعة من صور نظام التشغيل Windows Server وLinux Marketplace، كما يدعم صور الجهاز الظاهري المخصصة.

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

BatchImageReference imageReference = new BatchImageReference()
{
    Publisher = "MicrosoftWindowsServer",
    Offer = "WindowsServer",
    Sku = "2016-datacenter-smalldisk",
    Version = "latest"
};

BatchVmConfiguration vmConfiguration = new BatchVmConfiguration(
    imageReference: imageReference,
    nodeAgentSkuId: "batch.node.windows amd64");

BatchAccountPoolData poolData = new BatchAccountPoolData()
{
    VmSize = PoolVMSize,
    DeploymentConfiguration = new BatchDeploymentConfiguration() { VmConfiguration = vmConfiguration },
    ScaleSettings = new BatchAccountPoolScaleSettings()
    {
        FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = PoolNodeCount }
    }
};

await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(WaitUntil.Completed, PoolId, poolData);

إنشاء وظيفة Batch

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

يستخدم التطبيق BatchClient.CreateJobAsync لإنشاء وظيفة في مجموعتك. في البداية لا توجد مهام للوظيفة.

BatchJobCreateOptions job = new BatchJobCreateOptions(JobId, new BatchPoolInfo() { PoolId = PoolId });
await batchClient.CreateJobAsync(job);

إنشَاء مهام

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

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

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);

    BatchTaskCreateOptions task = new BatchTaskCreateOptions(taskId, taskCommandLine)
    {
        ResourceFiles = { inputFiles[i] }
    };
    tasks.Add(task);
}

await batchClient.CreateTasksAsync(JobId, tasks);

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

التطبيق ينتظر إكمال المهام. عند تشغيل كل مهمة بنجاح، يكتب إخراجها إلى stdout.txt. ثم يستخدم التطبيق خاصية BatchTask.NodeInfo لعرض ملف stdout.txt لكل مهمة مكتملة.

await foreach (BatchTask task in batchClient.GetTasksAsync(JobId))
{
    string nodeId = task.NodeInfo?.NodeId ?? "<unknown>";
    Console.WriteLine("Task: {0}", task.Id);
    Console.WriteLine("Node: {0}", nodeId);
    Console.WriteLine("Standard out:");
    BinaryData stdout = await batchClient.GetTaskFileAsync(JobId, task.Id, "stdout.txt");
    Console.WriteLine(stdout.ToString());
}

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

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

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

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

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

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