במאמר הזה מוסבר איך להריץ אלגוריתמים ב-Spanner Graph.
מבנה שאילתת האלגוריתם של Spanner Graph
המבנה של שאילתת אלגוריתם ב-Spanner Graph:
EXPORT DATA OPTIONS (export_option_list) AS
GRAPH graph_name
match_clause
call_statement algorithm_name(common_input, algorithm_specific_input)
YIELD algorithm_specific_output
RETURN results
export_option_list: אפשרויות שמגדירות איך לשמור את תוצאות השאילתה של האלגוריתם. מידע נוסף זמין במאמרים בנושא אפשרויות Cloud Storage ואפשרויות Spanner.
graph_name: שם התרשים.
match_clause: הצהרות MATCH אופציונליות להגדרת רכיבי קלט של אלגוריתם.
call_statement: משתמשים בהצהרתCALLכשמשמיטים את המשתנהmatch_clauseורוצים לבצע פעולה על הגרף כולו. משתמשים בהצהרהCALL PER()כשהמשתנהmatch_clauseקיים ורוצים לבצע פעולה בטבלת העבודה. מידע נוסף זמין במאמר GQL CALL.
algorithm_name: שם האלגוריתם שרוצים להריץ. לרשימת האלגוריתמים הזמינים, ראו האלגוריתמים של Spanner Graph.
common_input: פרמטרים של קלט עם שם שמשותפים לכל השאילתות של האלגוריתם. מידע נוסף זמין במאמר פרמטרים נפוצים של קלט אלגוריתם.algorithm_specific_input: פרמטרים של קלט עם שם לאלגוריתם. מידע נוסף על פרמטרים של קלט מופיע במאמר אלגוריתמים של Spanner Graph.
algorithm_specific_output: הפלט של קריאת האלגוריתם. מידע נוסף זמין בפלטים שמוגדרים באלגוריתמים של Spanner Graph ובסעיףYIELDבהצהרת CALL.
results: מגדיר מה יוחזר בתוצאות השאילתה.
השאילתה מורכבת מהצהרת EXPORT DATA, שמגדירה איך לשמור את התוצאות, ומ-GRAPH CLAUSE שמפיק את תוצאת השאילתה של האלגוריתם.
בצורה הפשוטה ביותר, סעיף הגרף מזהה את הגרף, משתמש בהצהרת CALL כדי להפעיל אלגוריתם שמניב פלט מוגדר מראש, ואז משתמש בהצהרת RETURN כדי לציין מה להחזיר מהפלט של האלגוריתם.
אם רוצים, אפשר להשתמש בהצהרות MATCH נתמכות בסעיף הגרף כדי לבחור רכיבים רלוונטיים. במקרה כזה, משתמשים בסעיף PER () כדי לקבץ את כל השורות שהוחזרו על ידי ההצהרה MATCH כקלט לאלגוריתם.
האלגוריתם פועל על תת-גרף לוגי שמורכב מקבוצה ייחודית של צמתים וקצוות שנבחרו.
השאילתה לא מחזירה נתונים. המשתנה export_option_list קובע איך התוצאות נשמרות.
למידע נוסף על שאילתות של אלגוריתמים ב-Spanner Graph, עיינו בקטעים הבאים במאמר הזה:
פרמטרים נפוצים של קלט אלגוריתם
מציינים את הפרמטרים האלה של קלט בעל שם בפורמט הבא: NAME => VALUE, ....
| שם | סוג הערך | חובה | ערך ברירת המחדל | תיאור |
|---|---|---|---|---|
node_labels |
ARRAY |
לא | (ללא) | נתמך רק כשמשתמשים ב-CALL. רשימה של תוויות צומת שצריך לכלול בקלט של האלגוריתם. אם מציינים תווית, נכללים רק צמתים עם תווית אחת לפחות שתואמת לתווית שצוינה.
|
edge_labels |
ARRAY |
לא | (ללא) | נתמך רק כשמשתמשים ב-CALL. רשימה של תוויות קצה שייכללו בקלט של האלגוריתם. אם צוין, רק קצוות עם לפחות תווית תואמת אחת נכללים.
|
edge_weight_property |
STRING |
לא | (ללא) | השם של מאפיין הקצה שמכיל את המשקלים. אם לא מגדירים משקל, המערכת מקצה משקל ברירת מחדל של 1 לכל הקצוות. סוג הערך של המאפיין חייב להיות מספרי. |
machine_category |
STRING |
לא | ברירת מחדל | קטגוריית המכונה שבה יש להשתמש להרצת האלגוריתם. הערכים הנתמכים הם: default, large |
fallback_compute_region |
STRING |
לא | (ללא) | אזור הגיבוי שבו מתבצעת ההפעלה של האלגוריתם אם יש מגבלות קיבולת באזור הבית. הוא חייב להיות באותה סמכות שיפוט כמו אזור הבית של המכונה של Spanner (לדוגמה, us-central1 אם אזור הבית הוא us-east1). |
max_idle_time |
STRING |
לא | 30 מ' | מציין כמה זמן המכונה צריכה להישאר פעילה לשימוש חוזר אחרי שהאלגוריתם מסתיים. הפורמט הוא רצף של מספרים עשרוניים, שלכל אחד מהם יש סיומת של יחידה, כמו 4m, 1.5h או 1h45m. יחידות הזמן התקינות הן ns, us (או µs), ms, s, m, h. |
טיפול בפלט של האלגוריתם
כדי לבדוק את תוצאות השאילתה של האלגוריתם, צריך לשמור אותן. אפשר להשתמש ב-export_data_option כדי לתאר איך לשמור את התוצאות. אתם יכולים לשמור את התוצאות ב-Cloud Storage או להחזיר אותן לאותו מכונה של Spanner שממנה הגיעה השאילתה.
שמירת התוצאות ב-Cloud Storage
כדי להשתמש באפשרות הזו, ודאו שהתפקיד אדמין של אובייקט אחסון (roles/storage.objectAdmin) מוקצה לחשבון השירות של Spanner
service-PROJECT_NUMBER@gcp-sa-spanner. שמנוהל על ידי Google.
האפשרויות הבאות של EXPORT DATA נתמכות כששומרים תוצאות ב-Cloud Storage. מציינים את האפשרויות בפורמט הבא: NAME=VALUE, ....
| שם | סוג הערך | חובה | תיאור |
|---|---|---|---|
uri |
STRING |
כן | ה-URI של היעד לייצוא, בפורמט gs://bucket/path/file. אם אתם מייצאים כמות גדולה של נתונים, השתמשו בתו כללי לחיפוש ב-uri כדי לייצא נתונים למספר קבצים. לדוגמה, gs://bucket/path/file_*.csv. |
format |
STRING |
כן | הפורמט של הנתונים המיוצאים. ערכים נתמכים: CSV, PARQUET, AVRO. |
header |
BOOL |
לא | אם true, המערכת מדפיסה כותרות עמודות בשורה הראשונה של כל קובץ נתונים. ערך ברירת המחדל הוא false. המאפיין הזה רלוונטי רק לקובצי CSV. |
overwrite |
BOOL |
לא | אם הערך הוא true, המערכת מחליפה את כל הקבצים הקיימים עם אותו URI. אחרת, אם קיימים קבצים עם אותו URI, ההצהרה מחזירה שגיאה. ערך ברירת המחדל הוא false. |
field_delimiter |
STRING |
לא | התו שמפריד בין השדות. ברירת המחדל: , (פסיק). רלוונטי רק ל-CSV. |
compression |
STRING |
לא | מציינים את פורמט הדחיסה. אם לא מציינים פורמט דחיסה, הקבצים לא נדחסים.
|
שמות העמודות בסעיף RETURN מגדירים את שמות העמודות בקובצי הפלט של Cloud Storage.
ייצוא נתונים לקובץ אחד או יותר
שאילתות Spanner Graph תומכות באופרטור תו כללי אחד (*) ב-uri. התו הכללי לחיפוש יכול להופיע ברכיב של שם הקובץ, אבל לא בשם הקטגוריה, בשם התיקייה או בסיומת הקובץ. אם קבוצת התוצאות גדולה, שימוש באופרטור התו הכללי יורה ל-Spanner Graph ליצור כמה קבצים מחולקים על סמך התבנית שסיפקתם. המערכת מחליפה את האופרטור של התו הכללי במספר, החל מאפס, עם אפסים משמאל עד 12 ספרות. לדוגמה, URI של gs://my-bucket/file-*.csv יוצר קבצים כמו gs://my-bucket/file-000000000000.csv, gs://my-bucket/file-000000000001.csv וקבצים דומים.
אם משתמשים ב-uri בלי תו כללי, התוצאה היא קובץ יחיד, כמו gs://my-bucket/file.csv.
סוגי הנתונים
כשמייצאים נתונים, סוגי הנתונים של הגרף ב-Spanner מומרים באופן הבא, בהתאם לפורמט:
CSV
כל סוגי הנתונים מומרים לייצוג המחרוזת שלהם:
- ערכי
BOOLמומרים ל-trueאו ל-false. - ערכי
BYTESמקודדים ב-Base64. - הפורמט של ערכי
TIMESTAMPהואYYYY-MM-DD HH:MM:SS.ffffff UTC. - ערכי
NULLמופיעים כמחרוזות ריקות.
אי אפשר לייצא נתונים מקוננים ונתונים שחוזרים על עצמם בפורמט CSV.
Avro
| סוג הנתונים ב-Spanner | סוג הנתונים Avro |
|---|---|
BOOL |
BOOLEAN |
INT64 |
LONG |
FLOAT |
FLOAT |
DOUBLE |
DOUBLE |
NUMERIC |
BYTES עם סוג לוגי DECIMAL(38,9) |
STRING |
STRING |
BYTES |
BYTES |
TIMESTAMP |
LONG (מיקרו-שניות מאז ראשית זמן יוניקס) |
NULL |
null |
Parquet
| סוג הנתונים ב-Spanner | סוג הנתונים ב-Parquet |
|---|---|
BOOL |
BOOLEAN |
INT64 |
INT64 |
FLOAT |
FLOAT |
DOUBLE |
DOUBLE |
NUMERIC |
DECIMAL(38,9) |
STRING |
STRING |
BYTES |
BYTE_ARRAY |
TIMESTAMP |
TIMESTAMP_MICROS |
NULL |
null |
שמירת התוצאות ב-Spanner
האפשרויות הבאות של EXPORT DATA נתמכות כששומרים את התוצאות במכונה המקורית של Spanner. מציינים את האפשרויות בפורמט הבא: NAME=VALUE, ....
| שם | סוג הערך | חובה | תיאור |
|---|---|---|---|
format |
STRING |
כן | הפורמט של הנתונים שמייצאים. חייב להיות CLOUD_SPANNER. |
table |
STRING |
כן | שם טבלת היעד ב-Spanner שאליה ייכתבו התוצאות. זו יכולה להיות כל טבלה במכונה של Spanner. |
write_mode |
STRING |
כן | מצב הכתיבה שבו רוצים להשתמש. הערכים הנתמכים הם:
בשני המצבים, Spanner מדלג על כל רשומה שגורמת להפרת אילוץ (לדוגמה, מפתחות חסרים בעדכון, הפרה של אינדקס ייחודי, הפרה של אילוץ מפתח זר). עם זאת, הכתיבה נכשלת בגלל שגיאות שלא קשורות להפרת אילוצים (לדוגמה, חוסר התאמה בסוג העמודה, ערכים חסרים בעמודות NOT NULL). |
דרישות
כששומרים את תוצאות האלגוריתם בחזרה ב-Spanner, שאילתת האלגוריתם צריכה לעמוד בדרישות הבאות:
- טבלת היעד חייבת להתקיים.
- העמודות חייבות להיות קיימות עם סוג תואם: כל שמות העמודות שצוינו במשפט
RETURNחייבים להיות קיימים כבר בטבלת היעד עם סוג נתונים תואם. אם צריך, משתמשים בכינויים כדי להתאים לשמות העמודות בטבלת היעד. לדוגמה:RETURN node.id AS person_id. - הכללה של כל העמודות של המפתח הראשי: סעיף
RETURNחייב לכלול את כל העמודות של המפתח הראשי בטבלת היעד.
כתיבת סמנטיקה
שמירת התוצאות בחזרה ב-Spanner היא פעולה לא טרנזקציונלית. היא מספקת אטומיות ברמת השורה. כלומר, המערכת כותבת את כל העמודות מאותה שורה או לא כותבת אף אחת מהן. היא פועלת לפי סמנטיקה של 'לפחות פעם אחת'. כלומר, אפשר לכתוב שורה כמה פעמים. קריאה מטבלת היעד בזמן שההרצה מתבצעת עלולה להניב תוצאות חלקיות.
אם הביצוע הכולל נכשל, המערכת לא מבטלת שינויים שכבר בוצעו. תהליך הכתיבה נכשל בשגיאה הראשונה שלא ניתן לנסות שוב. אם מתרחש כשל בכתיבה, הערך של ERROR_MESSAGE ב-GRAPH_OPERATION_EXECUTION_STATUS מציין את המפתח הראשי של השורה שנכשלה, יחד עם הסיבה הספציפית לכשל.
המערכת כותבת את תוצאות האלגוריתם בחזרה ל-Spanner Graph באמצעות MEDIUM priority.
הרצת שאילתות אלגוריתם לדוגמה
בקטע הזה מוצגות דוגמאות לשאילתות של אלגוריתם Spanner Graph שאפשר להריץ על מופע בדיקה. רשימה מלאה של האלגוריתמים שנתמכים ב-Spanner Graph מופיעה במאמר אלגוריתמים של Spanner Graph.
לפני שמתחילים
כדי להריץ את השאילתות לדוגמה של אלגוריתם Spanner Graph, צריך קודם לבצע את הפעולות הבאות:
- כדי ליצור Spanner Graph, פועלים לפי ההוראות במאמר הגדרה של Spanner Graph ושליחת שאילתות.
- מוודאים שיש לכם את ההרשאות הנדרשות.
- אופציונלי: אם אתם שומרים את הפלט ב-Spanner, אתם יכולים להרחיב את הסכימה של Spanner Graph.
מוסיפים עמודה חדשה בשם page_rank לטבלה Account. Spanner כותב את תוצאות האלגוריתם בעמודה החדשה הזו. אחר כך מרעננים את הגדרת התרשים כדי שאפשר יהיה לגשת אל page_rank כמאפיין של צומת.
-- Add `page_rank` as a column. Data type of this column matches the data type defined in `PageRank` output signature.
ALTER TABLE Account ADD COLUMN page_rank FLOAT64;
-- Rerun the graph definition DDL to pickup `page_rank` as a new property.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (`Account`, `Person`)
EDGE TABLES (
`PersonOwnAccount`
SOURCE KEY (id) REFERENCES `Person` (id)
DESTINATION KEY (account_id) REFERENCES `Account` (id)
LABEL `Owns`,
`AccountTransferAccount`
SOURCE KEY (id) REFERENCES `Account` (id)
DESTINATION KEY (to_id) REFERENCES `Account` (id)
LABEL `Transfers`
);
הפעלת אלגוריתם על גרף מלא עם מסנן תוויות ושמירת התוצאות ב-Cloud Storage
בדוגמה הזו מריצים את ההצהרה PageRank כדי לדרג את החשבונות על סמך ההעברות שהם משתתפים בהן. תוצאות השאילתה נשמרות בקטגוריה של Cloud Storage בפורמט CSV בשם my-bucket-name/my-output.csv.
EXPORT DATA OPTIONS (
uri = "gs://my-bucket-name/my-output.csv",
format = "csv"
) AS
GRAPH FinGraph
CALL PageRank(node_labels => ['Account'], edge_labels => ['Transfers']) YIELD node, score
RETURN node.id, score AS page_rank
ב-Cloud Storage, אחרי שהשאילתה הזו תסתיים בהצלחה, אמור להופיע קובץ CSV עם שתי עמודות (id ו-page_rank).
הפעלת אלגוריתם על תת-גרף שמוגדר על ידי MATCH ושמירת התוצאות בגרף
בדוגמה הזו נעשה שימוש בתבנית MATCH כדי להתאים באופן דינמי תת-גרף לוגי שמכיל את כל הצמתים Account ורק קשתות Transfer עם סכום שקטן מ-500.
תת-התרשים הלוגי הזה הוא הקלט של האלגוריתם PageRank.
Spanner שומר את תוצאות האלגוריתם בחזרה בטבלה Account.
EXPORT DATA OPTIONS (
format = "CLOUD_SPANNER",
table = "Account",
write_mode = 'update_ignore_all'
) AS
GRAPH FinGraph
MATCH (n:Account)
RETURN n
FULL UNION ALL
MATCH -[e:Transfers WHERE e.amount < 500]->
RETURN e
NEXT
CALL PER () PageRank() YIELD node, score
RETURN node.id, score AS page_rank
אחרי שהשאילתה מסתיימת, מריצים את השאילתה הבאה:
GRAPH FinGraph
MATCH (n:Account)
RETURN n.id, ROUND(n.page_rank, 2) AS page_rank
ORDER BY page_rank DESC, id ASC
אמורות להתקבל תוצאות דומות לאלה:
| id | page_rank |
|---|---|
| 20 | 0.49 |
| 16 | 0.46 |
| 7 | 0.05 |
בדיקת סטטוס ההפעלה של האלגוריתם
כששאילתה של אלגוריתם גרף מסתיימת בהצלחה, היא מחזירה אפס שורות וסטטוס Success. בהתאם לגודל גרף הקלט ולהגדרות הספציפיות של האלגוריתם, יכול להיות שייקח זמן עד שביצוע האלגוריתם יסתיים. אפשר לבדוק את ההתקדמות ואת סטטוס הביצוע של שאילתת אלגוריתם גרף בטבלה SPANNER_SYS.GRAPH_OPERATION_EXECUTION_STATUS. המידע בטבלה הזו נשמר למשך 30 ימים.
GRAPH_OPERATION_EXECUTION_STATUS schema
| שם עמודה | סוג | תיאור |
|---|---|---|
QUERY_ID |
STRING |
המזהה של שאילתת אלגוריתם הגרף. |
QUERY_TEXT |
STRING |
טקסט הצהרת השאילתה. |
START_TIMESTAMP |
TIMESTAMP |
השעה שבה התחילה הרצת השאילתה. |
LAST_UPDATE_TIMESTAMP |
TIMESTAMP |
המועד שבו הסטטוס עודכן לאחרונה. |
PROGRESS |
FLOAT64 |
אחוז ההשלמה המשוער. הערך הוא בין 0 ל-1, כאשר 0 מייצג התחלה ו-1 מייצג סיום. |
STATUS |
STRING |
המצב הנוכחי של ההרצה. הערכים האפשריים כוללים את PENDING, IN_PROGRESS, OK או קוד סטטוס של שגיאה כמו CANCELLED, DEADLINE_EXCEEDED, INVALID_ARGUMENT, FAILED_PRECONDITION, RESOURCE_EXHAUSTED, UNAVAILABLE או UNKNOWN. |
ERROR_MESSAGE |
STRING |
הודעת שגיאה אם הרצת השאילתה נכשלה. |
השאילתה לדוגמה הבאה מפרטת שאילתות גרף שעדיין לא הושלמו בהצלחה:
SELECT
query_id,
query_text,
start_timestamp,
last_update_timestamp,
progress,
status,
error_message
FROM
SPANNER_SYS.GRAPH_OPERATION_EXECUTION_STATUS
WHERE
status != "OK"
ORDER BY
start_timestamp DESC;
ביטול הרצת האלגוריתם
כדי לבטל שאילתה של אלגוריתם גרף שפועלת, מאתרים את ה-query_id מהטבלה SPANNER_SYS.GRAPH_OPERATION_EXECUTION_STATUS ואז קוראים ל-cancel_query בשביל ה-query_id הזה.