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

1. מבוא

1c05e3d0c2bd2b45.png 74be7b376d45258a.png

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

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

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

מה תלמדו

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

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

הגדרת סביבה בקצב אישי

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא משמשת את Google APIs. אפשר לעדכן אותו בכל שלב.
  • Project ID חייב להיות ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (בדרך כלל הוא מזוהה כ-PROJECT_ID). אם המזהה שנוצר לא מוצא חן בעיניך, יש לך אפשרות ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות תבנית משלך ולבדוק אם היא זמינה. לא ניתן לשנות אותו אחרי השלב הזה, והוא יישאר למשך הפרויקט.
  • לידיעתך, יש ערך שלישי – Project Number (מספר פרויקט), שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
  1. בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולא לצבור חיובים מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את הפרויקט כולו. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.

הפעלת Cloud Shell

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

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

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

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

נכנסים לקטע BigQuery במסוף Google Cloud:

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 או באמצעות 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 ולוחצים על הלחצן 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.