تنفيذ مهام BigQuery بالتوازي مع Workflows

1. مقدمة

1c05e3d0c2bd2b45.png 74be7b376d45258a.png

Workflows هي خدمة تنسيق مُدارة بالكامل تنفِّذ Google Cloud أو خدمات خارجية بالترتيب الذي تحدّده.

BigQuery هو مستودع بيانات مؤسسة مُدار بالكامل يساعدك على إدارة وحدات تيرابايت من البيانات وتحليلها باستخدام ميزات مضمَّنة مثل تعلُّم الآلة والتحليل الجغرافي المكاني وذكاء الأعمال.

في هذا الدرس التطبيقي، ستقوم بتشغيل بعض استعلامات BigQuery مقابل مجموعة بيانات ويكيبيديا العامة. سترى بعد ذلك كيفية تشغيل استعلامات BigQuery متعددة واحدة تلو الأخرى بطريقة تسلسلية، كجزء من تنسيق Workflows. وأخيرًا، ستقوم بموازاة الاستعلامات باستخدام ميزة التكرار المتوازٍ لسير العمل لتحسين السرعة بما يصل إلى 5 أضعاف.

ما ستتعرَّف عليه

  • كيفية تشغيل استعلامات BigQuery مقابل مجموعة بيانات ويكيبيديا.
  • كيفية تنفيذ استعلامات متعددة كجزء من إدارة سير العمل بشكل تسلسلي.
  • كيفية موازاة طلبات البحث باستخدام تكرار متوازٍ لسير العمل لتحسين السرعة بما يصل إلى 5 أضعاف.

2. الإعداد والمتطلبات

إعداد بيئة ذاتية

  1. سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديله في أي وقت.
  • يجب أن يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الإشارة إلى رقم تعريف المشروع (يتم تحديده عادةً على أنّه PROJECT_ID). وإذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متوفّرًا. ولا يمكن تغييره بعد هذه الخطوة وسيبقى طوال مدة المشروع.
  • لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. إنّ تنفيذ هذا الدرس التطبيقي حول الترميز لن يكون مكلفًا أو مكلفًا على الإطلاق. لإيقاف تشغيل الموارد حتى لا تتحمل الفوترة بعد هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع بالكامل. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

بدء Cloud Shell

مع أنّه يمكن إدارة Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي Google Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.

من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:

55efc1aaa7a4d3ad.png

من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بالبيئة بضع لحظات فقط. عند الانتهاء، من المفترض أن يظهر لك شيء مثل هذا:

7ffe5cbb04455448.png

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

3- استكشاف مجموعة بيانات ويكيبيديا

أولاً، استكشف مجموعة بيانات ويكيبيديا في BigQuery.

انتقِل إلى قسم BigQuery في Google Cloud Console:

ea75ab12a7c012a4.png

ضمن bigquery-samples، يُفترض أن ترى مجموعات بيانات عامة متنوعة، بما في ذلك بعض مجموعات البيانات ذات الصلة بويكيبيديا:

c9484e305b8e1438.png

ضمن مجموعة بيانات wikipedia_pageviews، يمكنك الاطّلاع على جداول مختلفة لمشاهدات الصفحات على الويب من سنوات مختلفة:

c540a4162640cbb3.png

يمكنك تحديد أحد الجداول (على سبيل المثال، 201207) ومعاينة البيانات:

b5b2a334cd6f63c0.png

يمكنك أيضًا تنفيذ الاستعلامات مقابل الجدول. على سبيل المثال، يحدد طلب البحث هذا أفضل 100 عنوان حصلت على أكبر عدد من المشاهدات:

SELECT TITLE, SUM(views)
FROM bigquery-samples.wikipedia_pageviews.201207h
GROUP BY TITLE
ORDER BY SUM(VIEWS) DESC
LIMIT 100

بمجرد تشغيل الاستعلام، يستغرق تحميل البيانات حوالي 20 ثانية:

1df3877aed1653b4.png

4. تحديد سير عمل لتشغيل استعلامات متعددة

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

داخل Cloud Shell، أنشئ ملف workflow-serial.yaml لإنشاء سير عمل لتنفيذ طلبات بحث متعددة مقابل جداول متعددة:

touch workflow-serial.yaml

يمكنك بعد ذلك تعديل الملف باستخدام المحرِّر في Cloud Shell:

33bf9325b078ad8.png

داخل ملف workflow-serial.yaml، في الخطوة الأولى من init، أنشِئ خريطة results لتتبُّع كل تكرار يتضمّن أسماء الجداول. حدِّد أيضًا مصفوفة tables تضم قائمة الجداول التي تريد تنفيذ طلبات البحث وفقًا لها. في هذه الحالة، نختار 5 جداول:

main:
    steps:
    - init:
        assign:
            - results : {}
            - tables:
                - 201201h
                - 201202h
                - 201203h
                - 201204h
                - 201205h

بعد ذلك، يجب تحديد خطوة runQueries. تتكرر هذه الخطوة فوق كل جدول وتستخدم "Workflows" أداة BigQuery لتنفيذ طلب بحث للعثور على أفضل 100 عنوان تتضمّن أكبر عدد من المشاهدات على الصفحة في كل جدول بعد ذلك، يتم حفظ أهم عنوان وطرق العرض من كل جدول في خريطة النتائج:

    - runQueries:
        for:
            value: table
            in: ${tables}
            steps:
            - runQuery:
                call: googleapis.bigquery.v2.jobs.query
                args:
                    projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    body:
                        useLegacySql: false
                        useQueryCache: false
                        timeoutMs: 30000
                        # Find the top 100 titles with most views on Wikipedia
                        query: ${
                            "SELECT TITLE, SUM(views)
                            FROM `bigquery-samples.wikipedia_pageviews." + table + "`
                            WHERE LENGTH(TITLE) > 10
                            GROUP BY TITLE
                            ORDER BY SUM(VIEWS) DESC
                            LIMIT 100"
                            }
                result: queryResult
            - returnResult:
                assign:
                    # Return the top title from each table
                    - results[table]: {}
                    - results[table].title: ${queryResult.rows[0].f[0].v}
                    - results[table].views: ${queryResult.rows[0].f[1].v}

في الخطوة الأخيرة، يمكنك إرجاع خريطة results:

    - returnResults:
        return: ${results}

5- تنفيذ استعلامات متعددة باستخدام Workflows

قبل أن تتمكّن من نشر سير العمل وتشغيله، عليك التأكّد من تفعيل Workflows API. يمكنك تفعيلها من Google Cloud Console أو باستخدام gcloud في Cloud Shell:

gcloud services enable workflows.googleapis.com

إنشاء حساب خدمة لسير العمل:

SERVICE_ACCOUNT=workflows-bigquery-sa
gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Workflows BigQuery service account"

تأكَّد من أنّ حساب الخدمة يتضمّن الأدوار لتسجيل مهام BigQuery وتشغيلها:

PROJECT_ID=your-project-id
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/logging.logWriter \
  --role roles/bigquery.jobUser \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

انشر سير العمل باستخدام حساب الخدمة:

gcloud workflows deploy bigquery-serial \
    --source=workflow-serial.yaml \
    --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

أخيرًا، أنت جاهز لتشغيل سير العمل.

ابحث عن سير عمل bigquery-serial ضمن قسم Workflows في Cloud Console وانقر على الزر Execute:

b6afa4747680334f.png

يمكنك بدلاً من ذلك تنفيذ سير العمل باستخدام "gcloud" في Cloud Shell:

gcloud workflows run bigquery-serial

من المفترض أن يستمر تنفيذ سير العمل لمدة دقيقة واحدة (20 ثانية لكل جدول من الجداول الخمسة).

في النهاية، ستظهر النتائج من كل جدول يتضمّن أهم العناوين وطرق العرض:

304d11a5bffdada4.png

baf31533d3671c9e.png

6- موازاة استعلامات متعددة بخطوات متوازية

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

انسخ ملف workflow-serial.yaml إلى ملف workflow-parallel.yaml جديد. في الملف الجديد، ستُجري بعض التغييرات لتحويل الخطوات التسلسلية إلى خطوات متوازية.

في ملف workflow-parallel.yaml، يمكنك تغيير الخطوة runQueries. أولاً، أضِف الكلمة الرئيسية parallel. ويسمح هذا بتشغيل كل تكرار لتكرار حلقة التكرار for بالتوازي. ثانيًا، عليك تعريف المتغيّر results على أنّه متغيّر shared. وهذا يسمح بأن يكون المتغير قابلاً للكتابة من قِبل الفرع. سنقوم بإلحاق كل نتيجة بهذا المتغير.

- runQueries:
    parallel:
        shared: [results]
        for:
            value: table
            in: ${tables}

نشر سير العمل الموازي:

gcloud workflows deploy bigquery-parallel \
    --source=workflow-parallel.yaml \
    --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

تنفيذ سير العمل:

gcloud workflows run bigquery-parallel

من المفترض أن يستمر تنفيذ سير العمل لمدة 20 ثانية تقريبًا. ويرجع ذلك إلى أنّ جميع طلبات البحث الخمسة تعمل بالتوازي. تحسين السرعة بما يصل إلى 5 مرات مع تغيير الرمز في سطرين فقط

في النهاية، ستلاحظ النتائج نفسها من كل جدول يتضمّن أفضل العناوين والمشاهدات ولكن بوقت تنفيذ أقصر:

1825d49ef225c828.png

7. تهانينا

تهانينا، لقد أنهيت الدرس التطبيقي حول الترميز. لمعرفة المزيد من المعلومات، يمكنك الاطّلاع على مستندات سير العمل حول الخطوات المتوازية.

المواضيع التي تناولناها

  • كيفية تشغيل استعلامات BigQuery مقابل مجموعة بيانات ويكيبيديا.
  • كيفية تنفيذ استعلامات متعددة كجزء من إدارة سير العمل بشكل تسلسلي.
  • كيفية موازاة طلبات البحث باستخدام تكرار متوازٍ لسير العمل لتحسين السرعة بما يصل إلى 5 أضعاف.