1. מבוא
Workflows הוא שירות תזמור מנוהל, שמפעיל את Google Cloud או שירותים חיצוניים לפי הסדר שהגדרתם.
BigQuery הוא מחסן נתונים (data warehouse) מנוהל שאפשר לנהל ובעזרתו אפשר לנהל ולנתח כמויות עצומות של נתונים, באמצעות תכונות מובנות כמו למידת מכונה, ניתוח גיאו-מרחבי ובינה עסקית.
ב-Codelab הזה, תריצו כמה שאילתות של BigQuery על מערך הנתונים הציבורי של Wikipedia. לאחר מכן תראו איך להריץ שאילתות מרובות ב-BigQuery בזו אחר זו בצורה טורית, כחלק מתזמור של תהליכי עבודה. לבסוף, תעלו את השאילתות במקביל באמצעות תכונת החזרה המקבילה של Workflows לשיפור המהירות עד פי 5.
מה תלמדו
- איך מריצים שאילתות ב-BigQuery מול מערך הנתונים של ויקיפדיה.
- איך להריץ מספר שאילתות במסגרת תזמור של תהליכי עבודה באופן סדרתי.
- איך לבצע כפילות של שאילתות באמצעות איטרציה מקבילה של Workflows לשיפור המהירות עד פי 5.
2. הגדרה ודרישות
הגדרת סביבה בקצב אישי
- נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. אם אין לכם עדיין חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.
- Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא משמשת את Google APIs. אפשר לעדכן אותו בכל שלב.
- Project ID חייב להיות ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (בדרך כלל הוא מזוהה כ-
PROJECT_ID
). אם המזהה שנוצר לא מוצא חן בעיניך, יש לך אפשרות ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות תבנית משלך ולבדוק אם היא זמינה. לא ניתן לשנות אותו אחרי השלב הזה, והוא יישאר למשך הפרויקט. - לידיעתך, יש ערך שלישי – Project Number (מספר פרויקט), שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
- בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולא לצבור חיובים מעבר למדריך הזה, אתם יכולים למחוק את המשאבים שיצרתם או למחוק את הפרויקט כולו. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.
הפעלת Cloud Shell
אומנם אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל ב-Codelab הזה משתמשים ב-Google Cloud Shell, סביבת שורת הפקודה שפועלת ב-Cloud.
במסוף Google Cloud, לוחצים על הסמל של Cloud Shell בסרגל הכלים שבפינה השמאלית העליונה:
נדרשים רק כמה דקות כדי להקצות את הסביבה ולהתחבר אליה. בסיום התהליך, אתם אמורים לראות משהו כזה:
למכונה הווירטואלית הזו נטען כל כלי הפיתוח הדרושים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר משמעותית את ביצועי הרשת והאימות. כל העבודה ב-Codelab הזה יכולה להתבצע בתוך דפדפן. אתה לא צריך להתקין שום דבר.
3. לחקור את מערך הנתונים של ויקיפדיה
קודם כל, בוחנים את מערך הנתונים של Wikipedia ב-BigQuery.
נכנסים לקטע BigQuery במסוף Google Cloud:
במסגרת bigquery-samples
, אמורים לראות מערכי נתונים ציבוריים שונים, כולל מערכי נתונים שקשורים לוויקיפדיה:
במערך הנתונים wikipedia_pageviews
אפשר לראות טבלאות שונות של צפיות בדפים משנים שונות:
אתם יכולים לבחור אחת מהטבלאות (למשל, 201207
) ומעיינים בתצוגה מקדימה של הנתונים:
אפשר גם להריץ שאילתות על הטבלה. לדוגמה, השאילתה הזו בוחרת את 100 הכותרות המובילות עם הכי הרבה צפיות:
SELECT TITLE, SUM(views) FROM bigquery-samples.wikipedia_pageviews.201207h GROUP BY TITLE ORDER BY SUM(VIEWS) DESC LIMIT 100
לאחר הרצת השאילתה, טעינת הנתונים תימשך כ-20 שניות:
4. הגדרת תהליך עבודה להרצת שאילתות מרובות
קל להריץ שאילתה על טבלה אחת. עם זאת, לפעמים קשה מדי להריץ שאילתות מרובות על מספר טבלאות וקיבוץ התוצאות. כדי לעשות זאת, תוכלו להיעזר ב-Workflows בתחביר איטרציה.
בתוך Cloud Shell, יוצרים קובץ workflow-serial.yaml
כדי לבנות תהליך עבודה להרצת שאילתות מרובות על מספר טבלאות:
touch workflow-serial.yaml
לאחר מכן תוכלו לערוך את הקובץ באמצעות העורך ב-Cloud Shell:
בתוך הקובץ 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
:
לחלופין, אפשר גם להריץ את תהליך העבודה עם gcloud
ב-Cloud Shell:
gcloud workflows run bigquery-serial
ביצוע של תהליך העבודה אמור להימשך כדקה אחת (20 שניות לכל אחת מ-5 הטבלאות).
בסיום, תראו את הפלט מכל טבלה עם הכותרות והצפיות המובילות:
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 בעזרת שינוי של כמה שורות קוד בלבד!
בסופו של דבר, יוצג אותו פלט מכל טבלה עם הכותרות והצפיות המובילות, אך זמן הביצוע יהיה קצר בהרבה:
7. מזל טוב
כל הכבוד, סיימת את ה-Codelab! מידע נוסף זמין במסמכי התיעוד של תהליכי עבודה לגבי שלבים מקבילים.
הנושאים שטיפלנו בהם
- איך מריצים שאילתות ב-BigQuery מול מערך הנתונים של ויקיפדיה.
- איך להריץ מספר שאילתות במסגרת תזמור של תהליכי עבודה באופן סדרתי.
- איך לבצע כפילות של שאילתות באמצעות איטרציה מקבילה של Workflows לשיפור המהירות עד פי 5.