הרצת משימות ב-BigQuery במקביל ל-Workflows

1. מבוא

1c05e3d0c2bd2b45.png 74be7b376d45258a.png

Workflows הוא שירות מנוהל לחלוטין של תזמור, שמפעיל שירותים של Google Cloud או שירותים חיצוניים לפי הסדר שאתם מגדירים.

BigQuery הוא מחסן נתונים ארגוני מנוהל שמאפשר לכם לנהל ולנתח טרה-בייט של נתונים באמצעות תכונות מובנות כמו למידת מכונה, ניתוח נתונים גיאו-מרחביים ובינה עסקית.

ב-codelab הזה תריצו כמה שאילתות BigQuery על מערך הנתונים הציבורי של ויקיפדיה. לאחר מכן תראו איך להריץ כמה שאילתות BigQuery אחת אחרי השנייה באופן סדרתי, כחלק מתיאום של Workflows. לבסוף, תריצו את השאילתות במקביל באמצעות תכונת האיטרציה המקבילה של Workflows כדי לשפר את המהירות עד פי 5.

מה תלמדו

  • איך מריצים שאילתות BigQuery על מערך הנתונים של ויקיפדיה.
  • איך מריצים כמה שאילתות כחלק מתזמור של תהליכי עבודה באופן סדרתי.
  • איך להריץ שאילתות במקביל באמצעות איטרציה מקבילה של Workflows כדי לשפר את המהירות עד פי 5.

2. הגדרה ודרישות

הגדרת סביבה בקצב עצמי

  1. נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • שם הפרויקט הוא השם המוצג של הפרויקט הזה למשתתפים. זו מחרוזת תווים שלא נמצאת בשימוש ב-Google APIs. אפשר לעדכן את המיקום הזה בכל שלב.
  • מזהה הפרויקט חייב להיות ייחודי בכל הפרויקטים ב-Google Cloud, והוא קבוע (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית, ובדרך כלל לא צריך לדעת מה היא. ברוב ה-Codelabs, תצטרכו להפנות למזהה הפרויקט (בדרך כלל הוא מסומן כ-PROJECT_ID). אם אתם לא אוהבים את המזהה שנוצר, אתם יכולים ליצור מזהה אקראי אחר. אפשר גם לנסות שם משתמש משלכם ולבדוק אם הוא זמין. אי אפשר לשנות את ההגדרה הזו אחרי השלב הזה, והיא תישאר כזו למשך הפרויקט.
  • לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
  1. בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API של Cloud. העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. כדי להשבית את המשאבים ולא לחייב אתכם מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את כל הפרויקט. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.

הפעלת Cloud Shell

אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-codelab הזה תשתמשו ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.

ב-מסוף Google Cloud, לוחצים על סמל Cloud Shell בסרגל הכלים שבפינה הימנית העליונה:

55efc1aaa7a4d3ad.png

יחלפו כמה רגעים עד שההקצאה והחיבור לסביבת העבודה יושלמו. בסיום התהליך, אמור להופיע משהו כזה:

7ffe5cbb04455448.png

המכונה הווירטואלית הזו כוללת את כל הכלים שדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את כל העבודה ב-codelab הזה בדפדפן. לא צריך להתקין שום דבר.

3. עיון במערך הנתונים של ויקיפדיה

קודם, כדאי לעיין במערך הנתונים של ויקיפדיה ב-BigQuery.

עוברים אל הקטע BigQuery במסוף Google Cloud:

ea75ab12a7c012a4.png

בקטע bigquery-samples, אמורים להופיע מערכי נתונים ציבוריים שונים, כולל כמה מערכי נתונים שקשורים לוויקיפדיה:

c9484e305b8e1438.png

בקטע wikipedia_pageviews dataset, אפשר לראות טבלאות שונות של צפיות בדפים משנים שונות:

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 שלב. בשלב הזה, המערכת מבצעת איטרציה על כל טבלה ומשתמשת במחבר BigQuery של Workflows כדי להריץ שאילתה שתמצא את 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 או באמצעות gcloud ב-Cloud Shell:

gcloud services enable workflows.googleapis.com

יוצרים חשבון שירות ל-Workflows:

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 שניות לכל אחת מ-5 הטבלאות).

בסופו של דבר, תראו את הפלט מכל טבלה עם השמות והצפיות המובילים:

304d11a5bffdada4.png

baf31533d3671c9e.png

6. הפעלת כמה שאילתות במקביל באמצעות שלבים מקבילים

תהליך העבודה בשלב הקודם נמשך כדקה כי הוא הפעיל 5 שאילתות שנמשכו 20 שניות כל אחת. מכיוון שאלה שאילתות עצמאיות, אפשר להריץ אותן במקביל באמצעות התכונה 'איטרציה מקבילה' של Workflows.

מעתיקים את הקובץ 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 השאילתות מורצות במקביל. שיפור מהירות של עד פי 5 עם שינוי של כמה שורות קוד בלבד!

בסופו של דבר, הפלט שיוצג מכל טבלה יהיה זהה, עם הכותרות והצפיות המובילות, אבל זמן הביצוע יהיה קצר בהרבה:

1825d49ef225c828.png

7. מזל טוב

כל הכבוד, סיימתם את ה-Codelab! מידע נוסף זמין במאמר תיעוד של תהליכי עבודה בנושא שלבים מקבילים.

מה נכלל

  • איך מריצים שאילתות BigQuery על מערך הנתונים של ויקיפדיה.
  • איך מריצים כמה שאילתות כחלק מתזמור של תהליכי עבודה באופן סדרתי.
  • איך להריץ שאילתות במקביל באמצעות איטרציה מקבילה של Workflows כדי לשפר את המהירות עד פי 5.