1. מבוא

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

אפשר לבחור אחד מהטבלאות (למשל, 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 כדי לשפר את המהירות עד פי 5.