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

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

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

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

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

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

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

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

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

    git clone https://github.com/Azure-Samples/batch-python-quickstart.git
    
  2. قم بالتبديل إلى المجلد batch-python-quickstart/src ، وقم بتثبيت الحزم المطلوبة باستخدام pip.

    pip install -r requirements.txt
    

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

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

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

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

في تطبيق Python الذي تم تنزيله، قم بتحرير السلاسل التالية في ملف config.py لتوفير القيم التي نسختها.

BATCH_ACCOUNT_NAME = '<batch account>'
BATCH_ACCOUNT_KEY = '<primary access key>'
BATCH_ACCOUNT_URL = '<account endpoint>'
STORAGE_ACCOUNT_NAME = '<storage account name>'
STORAGE_ACCOUNT_KEY = '<key1>'

هام

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

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

قم بتشغيل التطبيق لمشاهدة سير عمل Batch قيد التنفيذ.

python python_quickstart_client.py

وقت التشغيل النموذجي حوالي ثلاث دقائق. يستغرق إعداد عقدة التجمع الأولي معظم الوقت.

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

Sample start: 11/26/2012 4:02:54 PM

Uploading file taskdata0.txt to container [input]...
Uploading file taskdata1.txt to container [input]...
Uploading file taskdata2.txt to container [input]...
Creating pool [PythonQuickstartPool]...
Creating job [PythonQuickstartJob]...
Adding 3 tasks to job [PythonQuickstartJob]...
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 output:
Batch processing began with mainframe computers and punch cards. Today it still plays a central role...

مراجعة الرمز

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

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

  1. ينشئ التطبيق كائن BlobServiceClient للتفاعل مع حساب التخزين.

    blob_service_client = BlobServiceClient(
            account_url=f"https://{config.STORAGE_ACCOUNT_NAME}.{config.STORAGE_ACCOUNT_DOMAIN}/",
            credential=config.STORAGE_ACCOUNT_KEY
        )
    
  2. يستخدم blob_service_client التطبيق المرجع لإنشاء حاوية في حساب التخزين وتحميل ملفات البيانات إلى الحاوية. يتم تعريف الملفات المخزنة على أنها كائنات مجمعة ResourceFile والتي يمكن لـ Batch تنزيلها لاحقاً إلى عقد الحساب.

    input_file_paths = [os.path.join(sys.path[0], 'taskdata0.txt'),
                        os.path.join(sys.path[0], 'taskdata1.txt'),
                        os.path.join(sys.path[0], 'taskdata2.txt')]
    
    input_files = [
        upload_file_to_container(blob_service_client, input_container_name, file_path)
        for file_path in input_file_paths]
    
  3. ينشئ التطبيق كائن BatchServiceClient لإنشاء وإدارة التجمعات والوظائف والمهام في حساب Batch. يستخدم عميل Batch مصادقة المفتاح المشترك. يدعم Batch أيضا مصادقة Microsoft Entra.

    credentials = SharedKeyCredentials(config.BATCH_ACCOUNT_NAME,
            config.BATCH_ACCOUNT_KEY)
    
        batch_client = BatchServiceClient(
            credentials,
            batch_url=config.BATCH_ACCOUNT_URL)
    

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

لإنشاء تجمع Batch، يستخدم التطبيق فئة PoolAddParameter لتعيين عدد العقد وحجم الجهاز الظاهري وتكوين التجمع. يحدد كائن VirtualMachineConfiguration التالي ImageReference لصورة Ubuntu Server 20.04 LTS Azure Marketplace. تدعم Batch مجموعة واسعة من صور Linux وWindows Server Marketplace، كما تدعم صور الجهاز الظاهري المخصصة.

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

ترسل طريقة pool.add التجمع إلى خدمة Batch.

new_pool = batchmodels.PoolAddParameter(
        id=pool_id,
        virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
            image_reference=batchmodels.ImageReference(
                publisher="canonical",
                offer="0001-com-ubuntu-server-focal",
                sku="20_04-lts",
                version="latest"
            ),
            node_agent_sku_id="batch.node.ubuntu 20.04"),
        vm_size=config.POOL_VM_SIZE,
        target_dedicated_nodes=config.POOL_NODE_COUNT
    )
    batch_service_client.pool.add(new_pool)

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

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

يستخدم التطبيق فئة JobAddParameter لإنشاء وظيفة على التجمع. يضيف أسلوب job.add المهمة إلى حساب Batch المحدد. في البداية المهمة ليس لها مهام.

job = batchmodels.JobAddParameter(
    id=job_id,
    pool_info=batchmodels.PoolInformation(pool_id=pool_id))

batch_service_client.job.add(job)

إنشاء مهام

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

يعالج البرنامج النصي التالي كائنات الإدخال resource_files عن طريق تشغيل الأمر Bash shell cat لعرض الملفات النصية. ثم يستخدم التطبيق أسلوب task.add_collection لإضافة كل مهمة إلى المهمة، والتي تقوم بقوائم انتظار المهام لتشغيلها على عقد الحوسبة.

tasks = []

for idx, input_file in enumerate(resource_input_files):
    command = f"/bin/bash -c \"cat {input_file.file_path}\""
    tasks.append(batchmodels.TaskAddParameter(
        id=f'Task{idx}',
        command_line=command,
        resource_files=[input_file]
    )
    )

batch_service_client.task.add_collection(job_id, tasks)

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

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

tasks = batch_service_client.task.list(job_id)

for task in tasks:

    node_id = batch_service_client.task.get(job_id, task.id).node_info.node_id
    print(f"Task: {task.id}")
    print(f"Node: {node_id}")

    stream = batch_service_client.file.get_from_task(
        job_id, task.id, config.STANDARD_OUT_FILE_NAME)

    file_text = _read_stream_as_string(
        stream,
        text_encoding)

    if text_encoding is None:
        text_encoding = DEFAULT_ENCODING

    sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = text_encoding)
    sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = text_encoding)

    print("Standard output:")
    print(file_text)

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

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

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

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

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

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