1. מבוא

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



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

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

המכונה הווירטואלית הזו כוללת את כל הכלים שדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, מה שמשפר מאוד את הביצועים והאימות ברשת. אפשר לבצע את כל העבודה ב-codelab הזה בדפדפן. לא צריך להתקין שום דבר.
3. עיון במערך הנתונים של ויקיפדיה
קודם כל, בודקים את מערך הנתונים של ויקיפדיה ב-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 שלב. בשלב הזה, המערכת מבצעת איטרציה על כל טבלה ומשתמשת במחבר ל-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:

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