עבודה עם פונקציות מרוחקות
אתם יכולים להשתמש בפונקציות משירותים חיצוניים של BigQuery כדי להטמיע פונקציות בהתאמה אישית באמצעות שפות, ספריות או שירותים שלא נתמכים בפונקציות בהגדרת המשתמש (UDF) רגילות. אתם יכולים לפרוס את הפונקציות המרוחקות ב-Cloud Run או בפונקציות Cloud Run כדי להפעיל אותן ישירות מהשאילתות ב-GoogleSQL.
תהליך עבודה
- יוצרים את נקודת הקצה ל-HTTP בפונקציות Cloud Run או ב-Cloud Run.
- יוצרים פונקציה מרוחקת ב-BigQuery.
- יוצרים חיבור מסוג
CLOUD_RESOURCE. - יוצרים פונקציה מרוחקת.
- יוצרים חיבור מסוג
- משתמשים בפונקציה המרוחקת בשאילתה, בדיוק כמו בכל פונקציה בהגדרת המשתמש (UDF) אחרת.
מגבלות
פונקציות מרוחקות תומכות רק באחד מסוגי הנתונים הבאים כסוג ארגומנט או כסוג החזרה:
- בוליאני
- בייטים
- Numeric
- String
- תאריך
- תאריך ושעה
- שעה
- חותמת הזמן
- JSON
פונקציות מרוחקות לא תומכות בסוגים
ARRAY,STRUCT,INTERVALאוGEOGRAPHY.אי אפשר ליצור פונקציות מרוחקות עם ערכי טבלה.
אי אפשר להשתמש בפונקציות מרוחקות כשיוצרים תצוגות מהותיות.
ערך ההחזרה של פונקציה מרוחקת תמיד נחשב לא דטרמיניסטי, ולכן התוצאה של שאילתה שקוראת לפונקציה מרוחקת לא נשמרת במטמון.
יכול להיות שתראו בקשות חוזרות עם אותם נתונים לנקודת הקצה, גם אחרי תגובות מוצלחות, בגלל שגיאות זמניות ברשת או שגיאות פנימיות ב-BigQuery.
כשמדלגים על הערכה של פונקציה מרוחקת בשורות מסוימות בגלל קצר חשמלי, למשל בביטויים מותנים או בהצהרת
MERGEעםWHEN [NOT] MATCHED, לא נעשה שימוש באצווה עם הפונקציה המרוחקת. במקרה הזה, השדהcallsבגוף בקשת ה-HTTP מכיל בדיוק רכיב אחד.אם קבוצת הנתונים שמשויכת לפונקציה המרוחקת משוכפלת לאזור יעד באמצעות שכפול של קבוצת נתונים בין אזורים, אפשר לשלוח שאילתות לפונקציה המרוחקת רק באזור שבו היא נוצרה.
פונקציות מרוחקות תומכות בנתיב מותאם אישית בכתובת ה-URL של נקודת הקצה. לנתיבים בהתאמה אישית יש את המגבלות הבאות:
- הנתיב יכול להכיל רק אותיות רישיות (A-Z), אותיות קטנות (a-z), ספרות (0-9), מקפים (
-) וקווים תחתונים (_). - אסור להשתמש במזהי מקטעים (
#), בפרמטרים של שאילתות (?) ובטילדות (~). - אסור להשתמש בנתיבים שמתחילים ב-
/_ah/, בנתיב הספציפי/eventlogובכל נתיב שמסתיים באותz.
- הנתיב יכול להכיל רק אותיות רישיות (A-Z), אותיות קטנות (a-z), ספרות (0-9), מקפים (
יצירת נקודת קצה (endpoint)
כדי ליצור פונקציה מרוחקת שיכולה להטמיע לוגיקה עסקית, צריך ליצור נקודת קצה (endpoint) מסוג HTTP באמצעות פונקציות Cloud Run או Cloud Run. נקודת הקצה צריכה להיות מסוגלת לעבד קבוצה של שורות בבקשת POST אחת, ולהחזיר את התוצאות של הקבוצה כתגובת HTTP. פונקציות מרוחקות תומכות בנתיב בהתאמה אישית בכתובת ה-URL של נקודת הקצה (ראו מגבלות).
אם אתם יוצרים את הפונקציה המרוחקת באמצעות BigQuery DataFrames, אתם לא צריכים ליצור ידנית את נקודת הקצה של ה-HTTP. השירות עושה את זה בשבילכם באופן אוטומטי.
במדריך של פונקציות Cloud Run ובמסמכי התיעוד של פונקציות Cloud Run מוסבר איך לכתוב, לפרוס, לבדוק ולתחזק פונקציית Cloud Run.
במדריך למתחילים של Cloud Run ובמסמכי תיעוד אחרים של Cloud Run מוסבר איך לכתוב, לפרוס, לבדוק ולתחזק שירות של Cloud Run.
מומלץ להשאיר את האימות שמוגדר כברירת מחדל, ולא לאפשר הפעלה ללא אימות של פונקציית Cloud Run או של שירות Cloud Run.
פורמט הקלט
BigQuery שולח בקשות HTTP POST עם גוף JSON בפורמט הבא:
| שם השדה | תיאור | סוג השדה |
|---|---|---|
| requestId | מזהה הבקשה. ייחודית לכמה בקשות שנשלחות לנקודת הקצה הזו בשאילתת GoogleSQL. | תמיד מסופק. מחרוזת. |
| פונקציית קריאה חוזרת (caller) | השם המלא של משאב המשימה לשאילתת GoogleSQL שקוראת לפונקציה המרוחקת. | תמיד מסופק. מחרוזת. |
| sessionUser | כתובת האימייל של המשתמש שמריץ את שאילתת GoogleSQL. | תמיד מסופק. מחרוזת. |
| userDefinedContext | ההקשר שהוגדר על ידי המשתמש ושימש ליצירת הפונקציה המרוחקת ב-BigQuery. | זה שינוי אופציונלי. אובייקט JSON עם צמדי מפתח/ערך. |
| שיחות | אצווה של נתוני קלט. | תמיד מסופק. מערך JSON.
כל רכיב הוא מערך JSON, שהוא רשימת ארגומנטים בקידוד JSON של בקשה להפעלת פונקציה מרוחקת אחת. |
דוגמה לבקשה:
{
"requestId": "124ab1c",
"caller": "//bigquery.googleapis.com/projects/myproject/jobs/myproject:US.bquxjob_5b4c112c_17961fafeaf",
"sessionUser": "test-user@test-company.com",
"userDefinedContext": {
"key1": "value1",
"key2": "v2"
},
"calls": [
[null, 1, "", "abc"],
["abc", "9007199254740993", null, null]
]
}
פורמט הפלט
BigQuery מצפה שנקודת הקצה תחזיר תגובת HTTP בפורמט הבא, אחרת BigQuery לא יוכל לצרוך אותה והשאילתה שקוראת לפונקציה המרוחקת תיכשל.
| שם השדה | תיאור | טווח ערכים |
| תשובות | קבוצה של ערכי החזרה. | צריך למלא את השדה הזה כדי שהתגובה תהיה תקינה. מערך JSON.
כל רכיב תואם לערך החזרה בקידוד JSON של הפונקציה החיצונית.
גודל המערך חייב להתאים לגודל של מערך ה-JSON של |
| errorMessage | הודעת שגיאה שמוצגת כשמוחזר קוד תגובת HTTP שונה מ-200. בשגיאות שלא ניתן לנסות שוב, אנחנו מחזירים את השגיאה למשתמש כחלק מהודעת השגיאה של המשימה ב-BigQuery. | זה שינוי אופציונלי. מחרוזת. הגודל צריך להיות קטן מ-1KB. |
דוגמה לתגובה מוצלחת:
{
"replies": [
1,
0
]
}
דוגמה לתגובה שנכשלה:
{
"errorMessage": "Received but not expected that the argument 0 be null".
}
קוד תגובת HTTP
נקודת הקצה צריכה להחזיר את קוד התגובה 200 של תגובת HTTP כדי לציין שהתגובה תקינה. אם BigQuery מקבל ערך אחר, הוא מתייחס לתגובה כאל כשל ומנסה שוב כשהקוד של תגובת ה-HTTP הוא 408, 429, 500, 503 או 504, עד למגבלה פנימית מסוימת.
קידוד JSON של סוג נתונים ב-SQL
קידוד JSON בבקשת HTTP ובתגובה פועל לפי קידוד ה-JSON הקיים של BigQuery עבור הפונקציה TO_JSON_STRING.
קוד לדוגמה של פונקציית Cloud Run
קוד ה-Python לדוגמה הבא מטמיע הוספה של כל הארגומנטים של מספרים שלמים של הפונקציה המרוחקת. הוא מטפל בבקשה עם הארגומנטים להפעלות באצווה ומחזיר את כל התוצאות בתגובה.
import functions_framework
from flask import jsonify
# Max INT64 value encoded as a number in JSON by TO_JSON_STRING. Larger values are encoded as
# strings.
# See https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#json_encodings
_MAX_LOSSLESS=9007199254740992
@functions_framework.http
def batch_add(request):
try:
return_value = []
request_json = request.get_json()
calls = request_json['calls']
for call in calls:
return_value.append(sum([int(x) if isinstance(x, str) else x for x in call if x is not None]))
replies = [str(x) if x > _MAX_LOSSLESS or x < -_MAX_LOSSLESS else x for x in return_value]
return_json = jsonify( { "replies": replies } )
return return_json
except Exception as e:
return jsonify( { "errorMessage": str(e) } ), 400
נניח שהפונקציה נפרסה בפרויקט my_gcf_project באזור us-east1 בתור שם הפונקציה remote_add, אפשר לגשת אליה באמצעות נקודת הקצה https://us-east1-my_gcf_project.cloudfunctions.net/remote_add.
קוד לדוגמה של Cloud Run
הקוד הבא לדוגמה ב-Python מטמיע שירות אינטרנט שאפשר ליצור ולפרוס ב-Cloud Run כדי לקבל את אותה פונקציונליות.
import os
from flask import Flask, request, jsonify
# Max INT64 value encoded as a number in JSON by TO_JSON_STRING. Larger values are encoded as
# strings.
# See https://docs.cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#json_encodings
_MAX_LOSSLESS=9007199254740992
app = Flask(__name__)
@app.route("/", methods=['POST'])
def batch_add():
try:
return_value = []
request_json = request.get_json()
calls = request_json['calls']
for call in calls:
return_value.append(sum([int(x) if isinstance(x, str) else x for x in call if x is not None]))
replies = [str(x) if x > _MAX_LOSSLESS or x < -_MAX_LOSSLESS else x for x in return_value]
return jsonify( { "replies" : replies } )
except Exception as e:
return jsonify( { "errorMessage": str(e) } ), 400
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
במדריך מוסבר איך ליצור ולפרוס את הקוד.
נניח שהשירות של Cloud Run נפרס בפרויקט my_gcf_project באזור us-east1 בתור שם השירות remote_add. אפשר לגשת אליו באמצעות נקודת הקצה https://remote_add-<project_id_hash>-ue.a.run.app.
בדוגמה הבאה ב-Python, מיושם נתיב כתובת URL אחר /subtract_list (ראו מגבלות על נתיב כתובת ה-URL בהתאמה אישית) בשירות האינטרנט שנפרס קודם:
@app.route("/subtract_list", methods=['POST'])
def batch_subtract():
"""
Processes batch requests to subtract numbers within inner lists (e.g., a - b - c).
Handles integers, string representations of integers, and None values.
"""
try:
return_value = []
request_json = request.get_json()
calls = request_json['calls']
for call in calls:
nums_to_process = [int(x) if isinstance(x, str) else x for x in call if x is not None]
if not nums_to_process:
result = 0
else:
result = nums_to_process[0] - sum(nums_to_process[1:])
return_value.append(result)
replies = [str(x) if abs(x) > _MAX_LOSSLESS else x for x in return_value]
return jsonify({"replies": replies})
except Exception as e:
return jsonify({"errorMessage": str(e)}), 400
יצירת פונקציה מרוחקת
BigQuery משתמש בחיבור CLOUD_RESOURCE כדי לקיים אינטראקציה עם פונקציית Cloud Run. כדי ליצור פונקציה מרוחקת, צריך ליצור חיבור CLOUD_RESOURCE. אם אתם יוצרים את הפונקציה המרוחקת באמצעות BigQuery DataFrames וקיבלתם את התפקיד "אדמין IAM בפרויקט" (roles/resourcemanager.projectIamAdmin), אתם לא צריכים ליצור את החיבור באופן ידני ולתת לו גישה. השירות עושה את זה בשבילכם באופן אוטומטי.
יצירת חיבור
כדי להתחבר לפונקציית Cloud Run ול-Cloud Run, צריך קישור למשאבים ב-Cloud.
אם הגדרתם חיבור כברירת מחדל או שיש לכם את התפקיד אדמין ב-BigQuery, אתם יכולים לדלג על השלב הזה.
בוחרים באחת מהאפשרויות הבאות:המסוף
נכנסים לדף BigQuery.
בחלונית הימנית, לוחצים על Explorer:

אם החלונית הימנית לא מוצגת, לוחצים על Expand left pane כדי לפתוח אותה.
בחלונית Explorer, מרחיבים את שם הפרויקט ולוחצים על Connections.
בדף Connections, לוחצים על Create connection.
בשדה Connection type, בוחרים באפשרות Vertex AI remote models, remote functions, BigLake and Spanner (Cloud Resource).
בשדה מזהה החיבור, נותנים שם לחיבור.
בשדה Location type, בוחרים מיקום לחיבור. החיבור צריך להיות באותו מיקום כמו המשאבים האחרים, למשל מערכי נתונים.
לוחצים על יצירת חיבור.
לוחצים על מעבר לחיבור.
בחלונית Connection info, מעתיקים את מזהה חשבון השירות כדי להשתמש בו בשלב מאוחר יותר.
SQL
משתמשים בהצהרה CREATE CONNECTION:
נכנסים לדף BigQuery במסוף Google Cloud .
בעורך השאילתות, מזינים את ההצהרה הבאה:
CREATE CONNECTION [IF NOT EXISTS] `CONNECTION_NAME` OPTIONS ( connection_type = "CLOUD_RESOURCE", friendly_name = "FRIENDLY_NAME", description = "DESCRIPTION" );
מחליפים את מה שכתוב בשדות הבאים:
-
CONNECTION_NAME: שם החיבור בפורמטPROJECT_ID.LOCATION.CONNECTION_ID,LOCATION.CONNECTION_IDאוCONNECTION_ID. אם לא מציינים את הפרויקט או המיקום, הם נגזרים מהפרויקט ומהמיקום שבהם ההצהרה מופעלת. -
FRIENDLY_NAME(אופציונלי): שם תיאורי לחיבור. -
DESCRIPTION(אופציונלי): תיאור של החיבור.
-
לוחצים על Run.
מידע נוסף על הרצת שאילתות זמין במאמר הרצת שאילתה אינטראקטיבית.
BQ
בסביבה של שורת הפקודה, יוצרים חיבור:
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
הפרמטר
--project_idמבטל את פרויקט ברירת המחדל.מחליפים את מה שכתוב בשדות הבאים:
-
REGION: אזור החיבור שלכם -
PROJECT_ID: מזהה הפרויקט ב- Google Cloud -
CONNECTION_ID: מזהה לחיבור
כשיוצרים משאב חיבור, BigQuery יוצר חשבון שירות ייחודי של המערכת ומשייך אותו לחיבור.
פתרון בעיות: אם מופיעה שגיאת החיבור הבאה, עדכנו את Google Cloud SDK:
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
-
מאחזרים ומעתיקים את מזהה חשבון השירות כדי להשתמש בו בשלב מאוחר יותר:
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
הפלט אמור להיראות כך:
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel."}
Python
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Python במדריך למתחילים של BigQuery באמצעות ספריות לקוח. למידע נוסף, קראו את מאמרי העזרה של BigQuery Python API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
Node.js
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Node.js במדריך למתחילים של BigQuery באמצעות ספריות לקוח. למידע נוסף, קראו את מאמרי העזרה של BigQuery Node.js API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
Java
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Java במדריך למתחילים של BigQuery באמצעות ספריות לקוח. למידע נוסף, קראו את מאמרי העזרה של BigQuery Java API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
Terraform
משתמשים במשאב google_bigquery_connection.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
בדוגמה הבאה נוצר קישור למשאבים ב-Cloud בשם my_cloud_resource_connection באזור US:
כך מחילים את ההגדרות של Terraform בפרויקט ב- Google Cloud :
הכנת Cloud Shell
- מפעילים את Cloud Shell.
-
מגדירים את פרויקט ברירת המחדל ב- Google Cloud שבו רוצים להחיל את ההגדרות של Terraform.
תצטרכו להריץ את הפקודה הזו רק פעם אחת לכל פרויקט, ותוכלו לעשות זאת בכל ספרייה.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
אם תגדירו ערכים ספציפיים בקובץ התצורה של Terraform, הם יבטלו את ערכי ברירת המחדל של משתני הסביבה.
הכנת הספרייה
לכל קובץ תצורה של Terraform צריכה להיות ספרייה משלו (שנקראת גם מודול ברמה הבסיסית).
-
יוצרים ספרייה חדשה ב-Cloud Shell ובה יוצרים קובץ חדש. שם הקובץ חייב לכלול את הסיומת
.tf, למשלmain.tf. במדריך הזה, הקובץ נקראmain.tf.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
אם אתם עוקבים אחרי המדריך, תוכלו להעתיק את הקוד לדוגמה בכל קטע או שלב.
מעתיקים את הקוד לדוגמה בקובץ
main.tfהחדש שיצרתם.לחלופין, אפשר גם להעתיק את הקוד מ-GitHub. כדאי לעשות את זה כשקטע הקוד של Terraform הוא חלק מפתרון מקצה לקצה.
- בודקים את הפרמטרים לדוגמה ומשנים אותם בהתאם לסביבה שלכם.
- שומרים את השינויים.
-
מפעילים את Terraform. צריך לעשות זאת רק פעם אחת לכל ספרייה.
terraform init
אופציונלי: תוכלו לכלול את האפשרות
-upgrade, כדי להשתמש בגרסה העדכנית ביותר של הספק של Google:terraform init -upgrade
החלה של השינויים
-
בודקים את ההגדרות ומוודאים שהמשאבים שמערכת Terraform תיצור או תעדכן תואמים לציפיות שלכם:
terraform plan
מתקנים את ההגדרות לפי הצורך.
-
מריצים את הפקודה הבאה ומזינים
yesבהודעה שמופיעה, כדי להחיל את הגדרות Terraform:terraform apply
ממתינים עד שב-Terraform תוצג ההודעה "Apply complete!".
- פותחים את הפרויקט ב- Google Cloud כדי להציג את התוצאות. במסוף Google Cloud , נכנסים למשאבים בממשק המשתמש כדי לוודא שהם נוצרו או עודכנו ב-Terraform.
הגדרת הגישה
אתם צריכים לתת לחיבור החדש הרשאת קריאה בלבד לפונקציית Cloud Run או לשירות Cloud Run. לא מומלץ לאפשר הפעלה ללא אימות של פונקציית Cloud Run או של שירות Cloud Run.
כדי להקצות תפקידים:
נכנסים לדף IAM & Admin.
לוחצים על הוספה.
תיבת הדו-שיח Add principals נפתחת.
בשדה New principals, מזינים את מזהה חשבון השירות שהעתקתם קודם.
בשדה Select a role, בוחרים אחת מהאפשרויות הבאות:
- אם משתמשים בפונקציית Cloud Run מהדור הראשון, בוחרים באפשרות Cloud Function ואז בוחרים בתפקיד Cloud Function Invoker.
- אם משתמשים בפונקציית Cloud Run מהדור השני, בוחרים באפשרות Cloud Run ואז בוחרים בתפקיד Cloud Run Invoker.
- אם אתם משתמשים בשירות של Cloud Run, בחרו באפשרות Cloud Run ואז בתפקיד Cloud Run Invoker.
לוחצים על Save.
יצירת פונקציה מרוחקת
כדי ליצור פונקציה מרוחקת:
SQL
מריצים את ההצהרה הבאה של CREATE FUNCTION ב-BigQuery:
נכנסים לדף BigQuery במסוף Google Cloud .
בעורך השאילתות, מזינים את ההצהרה הבאה:
CREATE FUNCTION
PROJECT_ID.DATASET_ID.remote_add(x INT64, y INT64) RETURNS INT64 REMOTE WITH CONNECTIONPROJECT_ID.LOCATION.CONNECTION_NAMEOPTIONS ( endpoint = 'ENDPOINT_URL' )מחליפים את מה שכתוב בשדות הבאים:
-
DATASET_ID: המזהה של מערך הנתונים ב-BigQuery. -
ENDPOINT_URL: כתובת ה-URL של פונקציית Cloud Run או של נקודת הקצה של הפונקציה המרוחקת של Cloud Run. פונקציות מרוחקות תומכות בנתיב מותאם אישית בכתובת ה-URL של נקודת הקצה (ראו מגבלות של נתיב מותאם אישית). אפשר ליצור פונקציות מרוחקות שונות בכל נתיב באותה אפליקציה. האפשרותendpointבהצהרהCREATE FUNCTIONיכולה לכלול נתיב מסלול מיד אחרי כתובת ה-URL של Cloud Run (לדוגמה,https://service_name-project_number.region.run.app/subtract_list).
-
לוחצים על Run.
מידע נוסף על הרצת שאילתות זמין במאמר הרצת שאילתה אינטראקטיבית.
BigQuery DataFrames
- מפעילים את ממשקי ה-API הנדרשים ומוודאים שקיבלתם את התפקידים הנדרשים, כפי שמתואר בקטע דרישות במאמר פונקציות מרוחקות.
- משתמשים במעצב
remote_function.
צריכה להיות לכם ההרשאה bigquery.routines.create במערך הנתונים שבו אתם יוצרים את הפונקציה המרוחקת, וההרשאה bigquery.connections.delegate (זמינה מהתפקיד "אדמין של חיבורי BigQuery") בחיבור שבו משתמשת הפונקציה המרוחקת.
הצגת הקשר שהמשתמש הגדיר
אפשר לציין את user_defined_context ב-OPTIONS כצמדים של מפתח/ערך, שיהיו חלק מכל בקשת HTTP לנקודת הקצה. באמצעות הקשר בהגדרת המשתמש, אתם יכולים ליצור כמה פונקציות מרוחקות אבל להשתמש שוב בנקודת קצה אחת, שמספקת התנהגויות שונות על סמך ההקשר שמועבר אליה.
בדוגמאות הבאות נוצרות שתי פונקציות מרוחקות כדי להצפין ולפענח נתונים ב-BYTES באמצעות אותה נקודת קצה.
CREATE FUNCTION `PROJECT_ID.DATASET_ID`.encrypt(x BYTES)
RETURNS BYTES
REMOTE WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_NAME`
OPTIONS (
endpoint = 'ENDPOINT_URL',
user_defined_context = [("mode", "encryption")]
)
CREATE FUNCTION `PROJECT_ID.DATASET_ID`.decrypt(x BYTES)
RETURNS BYTES
REMOTE WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_NAME`
OPTIONS (
endpoint = 'ENDPOINT_URL',
user_defined_context = [("mode", "decryption")]
)
הגבלת מספר השורות בבקשת Batch
כדי למנוע זמן קצוב לתפוגה של פונקציות Cloud Run, אפשר לציין את הערך max_batching_rows ב-OPTIONS כמספר המקסימלי של שורות בכל בקשת HTTP. אם מציינים את הערך max_batching_rows, המערכת של BigQuery קובעת את מספר השורות באצווה עד למגבלה של max_batching_rows. אם לא מציינים את הפרמטר, BigQuery קובע את מספר השורות לכל אצווה באופן אוטומטי.
שימוש בפונקציה מרוחקת בשאילתה
חשוב לוודא שנתתם את ההרשאה לפונקציית Cloud Run, כדי שלחשבון השירות של BigQuery שמשויך לחיבור של הפונקציה המרוחקת תהיה גישה אליה.
בנוסף, צריכה להיות לכם ההרשאה bigquery.routines.get במערך הנתונים שבו נמצאת הפונקציה המרוחקת, וההרשאה bigquery.connections.use בחיבור שבו משתמשת הפונקציה המרוחקת, שאותה אפשר לקבל באמצעות התפקיד BigQuery Connection User.
אפשר להשתמש בפונקציה מרוחקת בשאילתה בדיוק כמו פונקציה בהגדרת המשתמש.
לדוגמה, אפשר להשתמש בפונקציה remote_add בשאילתה לדוגמה:
SELECT
val,
`PROJECT_ID.DATASET_ID`.remote_add(val, 2)
FROM
UNNEST([NULL,2,3,5,8]) AS val;
הפלט של הדוגמה הזו:
+------+-----+
| val | f0_ |
+------+-----+
| NULL | 2 |
| 2 | 4 |
| 3 | 5 |
| 5 | 7 |
| 8 | 10 |
+------+-----+
אזורים נתמכים
יש שני סוגים של מיקומים ב-BigQuery:
השדה הזה יכול להכיל אזור, כלומר, מקום גיאוגרפי ספציפי, כמו לונדון.
מספר אזורים – אזור גיאוגרפי נרחב, כמו ארצות הברית, שכולל שני מקומות גיאוגרפיים או יותר.
אזורים בודדים
במערך נתונים של BigQuery באזור אחד, אפשר ליצור פונקציה מרוחקת רק אם היא משתמשת בפונקציית Cloud Run שנפרסה באותו אזור. לדוגמה:
- פונקציה מרוחקת באזור יחיד
us-east4ב-BigQuery יכולה להשתמש רק בפונקציית Cloud Run באזורus-east4.
לכן, באזורים בודדים, פונקציות מרוחקות נתמכות רק באזורים שתומכים גם בפונקציות Cloud Run וגם ב-BigQuery.
במספר אזורים
במערך נתונים של BigQuery במספר אזורים (US, EU), אפשר ליצור פונקציה מרוחקת רק אם היא משתמשת בפונקציית Cloud Run שנפרסה באזור שנמצא באותו שטח גיאוגרפי גדול (ארה"ב, האיחוד האירופי). לדוגמה:
- פונקציה מרוחקת ב-BigQuery במספר אזורים
USיכולה להשתמש רק בפונקציית Cloud Run שנפרסה באזור אחד בארה"ב, כמוus-central1,us-east4,us-west2וכו'. - פונקציה מרוחקת ב-BigQuery במספר אזורים ב-
EUיכולה להשתמש רק בפונקציית Cloud Run שנפרסה באזור אחד במדינות החברות באיחוד האירופי, כמוeurope-north1,europe-west3וכו'.
למידע נוסף על אזורים ומספר אזורים ב-BigQuery, קראו את הדף מיקומי מערכי נתונים. מידע נוסף על אזורים של פונקציות Cloud Run מופיע בדף מיקומים של פונקציות Cloud Run.
חיבורים
במיקום באזור יחיד או במיקום במספר אזורים, אפשר ליצור פונקציה מרוחקת רק באותו מיקום של החיבור שבו משתמשים. לדוגמה, כדי ליצור פונקציה מרוחקת ב-US במספר אזורים, צריך להשתמש בחיבור שנמצא ב-US במספר אזורים.
תמחור
בנוסף, יכול להיות שתחויבו על השימוש בפונקציות Cloud Run וב-Cloud Run. לפרטים, קראו את דפי התמחור של פונקציות Cloud Run ושל Cloud Run.
שימוש ב-VPC Service Controls
VPC Service Controls הוא מאפיין של Google Cloud שמאפשר להגדיר מתחם אבטחה היקפית כדי להגן מפני זליגת נתונים. כדי להשתמש ב-VPC Service Controls עם פונקציות מרוחקות לאבטחה נוספת, או כדי להשתמש בנקודות קצה עם הגדרות תעבורת נתונים נכנסת (ingress) של internal traffic, פועלים לפי המדריך של VPC Service Controls כדי:
יוצרים גבולות גזרה לשירות.
מוסיפים להיקף את פרויקט BigQuery של השאילתה שמשתמשת בפונקציה המרוחקת.
מוסיפים את הפרויקט של נקודת הקצה להיקף ההגנה ומגדירים את
Cloud Functions APIאו אתCloud Run APIבשירותים המוגבלים, בהתאם לסוג של נקודת הקצה. פרטים נוספים זמינים במאמרים VPC Service Controls בפונקציות Cloud Run ו-VPC Service Controls ב-Cloud Run.
שיטות מומלצות לשימוש בפונקציות מרוחקות
- סינון מראש של הקלט: אם אתם יכולים לסנן את הקלט לפני שאתם מעבירים אותו לפונקציה מרוחקת, סביר להניח שהשאילתה תהיה מהירה וזולה יותר.
שמירה על פונקציית Cloud Run ניתנת להתאמה. יכולת ההתאמה לעומס היא פונקציה של מספר המכונות המינימלי, מספר המכונות המקסימלי והבו-זמניות.
- אם אפשר, השתמשו בערך ברירת המחדל של המספר המקסימלי של מכונות לפונקציית Cloud Run.
- שימו לב שאין מגבלת ברירת מחדל לפונקציות Cloud Run מסוג HTTP מהדור הראשון. כדי למנוע אירועי התרחבות בלתי מוגבלים עם פונקציות Cloud Run מסוג HTTP מהדור הראשון במהלך בדיקה או בסביבת הייצור, מומלץ להגדיר מגבלה, למשל 3, 000.
כדי לשפר את הביצועים, כדאי לפעול לפי הטיפים הנוספים לפונקציות Cloud Run. שאילתות של פונקציות מרוחקות שמקיימות אינטראקציה עם פונקציית Cloud Run עם זמן אחזור ארוך עלולות להיכשל בגלל זמן קצוב לתפוגה.
מטמיעים את נקודת הקצה (endpoint) כך שתחזיר קוד תגובה של HTTP ומטען ייעודי (payload) מתאימים לתגובה שנכשלה.
כדי לצמצם את מספר הניסיונות החוזרים מ-BigQuery, השתמשו בקודי תגובה של HTTP שאינם 408, 429, 500, 503 ו-504 לתגובה שנכשלה, וודאו שאתם תופסים את כל החריגות בקוד הפונקציה. אחרת, יכול להיות שמסגרת שירות ה-HTTP תחזיר באופן אוטומטי את הקוד 500 לכל חריגה שלא נתפסה. יכול להיות שעדיין תראו בקשות HTTP חוזרות כש-BigQuery מנסה שוב לבצע שאילתה או מחיצה של נתונים שנכשלו.
נקודת הקצה צריכה להחזיר מטען ייעודי (payload) של JSON בפורמט שהוגדר לתגובה שנכשלה. למרות שזה לא חובה, זה עוזר ל-BigQuery להבחין אם התגובה שנכשלה היא מההטמעה של הפונקציה או מהתשתית של פונקציות Cloud Run או Cloud Run. במקרה השני, יכול להיות ש-BigQuery ינסה שוב עם מגבלה פנימית אחרת.
מכסות
כדי לפתור בעיות שקשורות למכסות של פונקציות מרוחקות, אתם יכולים להיעזר במידע הבא.
המספר המקסימלי של שאילתות בו-זמניות שמכילות פונקציות מרוחקות
השגיאה הזו מוחזרת מ-BigQuery כשמספר השאילתות בו-זמנית שמכילות פונקציות מרוחקות חורג מהמגבלה.
מידע נוסף על המגבלות של פונקציות מרוחקות זמין במאמר פונקציות מרוחקות.
הודעת שגיאה
Exceeded rate limits: too many concurrent queries with remote functions for this project
אפשר להגדיל את המכסה הזו. קודם כדאי לנסות את הפתרונות העקיפים והשיטות המומלצות.
האבחון
במאמר מגבלות של פונקציות מרוחקות מפורטות המגבלות על שאילתות בו-זמניות שמכילות פונקציות מרוחקות.
רזולוציה
- כשמשתמשים בפונקציות מרוחקות, חשוב לפעול לפי השיטות המומלצות לפונקציות מרוחקות.
- כדי לבקש להגדיל את המכסה, אתם יכולים לפנות לתמיכה או למכירות. יכול להיות שיחלפו כמה ימים עד שנבדוק את הבקשה ונטפל בה. מומלץ לציין בבקשה את העדיפות, את תרחיש השימוש ואת מזהה הפרויקט.