שימוש במנוע Lightning
Lightning Engine היא סביבת זמן ריצה עם ביצועים גבוהים ל-Apache Spark ב-Managed Service for Apache Spark, שמאיצה עומסי עבודה שדורשים משאבי מחשוב רבים ומפחיתה את עלויות זמן הריצה בלי שצריך לשנות את קוד ה-Spark. הוא מיועד למהנדסי מערכות מידע ולמומחי ניתוח נתונים שמריצים עומסי עבודה עתירי מחשוב, שמשתמשים בממשקי API של Spark DataFrame, בממשקי API של Spark Dataset או בשאילתות SQL של Spark.
יתרונות
היתרונות של Lightning Engine כוללים:
פעולות נתונים מואצות: שיפור משמעותי בביצועים וחיסכון בעלויות באמצעות אופטימיזציה של האינטראקציה עם Cloud Storage, כולל טיפול במטא-נתונים, עומסי עבודה של כתיבה וקלט/פלט וקטורי.
הרצת שאילתות חכמה: שיפורים מתקדמים בכלי האופטימיזציה שמפחיתים באופן דינמי את כמות הנתונים שנסרקים, משפרים את עיבוד הנתונים ויוצרים תוכניות הרצה יעילות יותר, כדי שהשאילתות יהיו מהירות וחסכוניות יותר.
עומסי עבודה יעילים של AI ו-ML: הפחתת זמני ההפעלה של אשכולות לעומסי עבודה מבוססי-GPU, ופישוט הפריסה בסביבות מאובטחות באמצעות קובצי אימג' שעברו אופטימיזציה ל-AI.
למרות ש-Lightning Engine משפר את הביצועים באופן משמעותי, ההשפעה הספציפית משתנה בהתאם לעומס העבודה.
השוואה למנוע רגיל
Lightning Engine הוא חלופה למנוע הרגיל שמשמש להרצת משימות Spark באשכול של Managed Service for Apache Spark. בטבלה הבאה מוצגת השוואה בין Lightning Engine לבין מנוע רגיל, לפי מאפייני ההפעלה, התאמה לעומסי עבודה והיתרונות העיקריים.
| תכונה | מנוע רגיל | Lightning Engine |
|---|---|---|
| דגל CLI | --engine=default או לבטל את ההגדרה של הדגל |
--engine=lightning |
| מתאים במיוחד עבור | משימות, פיתוח ובדיקות למטרות כלליות | עומסי עבודה בקנה מידה ארגוני שדורשים האצה משמעותית |
| יתרונות עיקריים | ביצועים בסיסיים | אינטראקציה אופטימלית עם אחסון בענן, הרצת שאילתות חכמה |
דרישות לגבי Lightning Engine
הדרישות הבאות חלות על התכונה Lightning Engine:
- Image version: Lightning Engine must be used with Managed Service for Apache Spark image version
2.3.3and later2.3subminor image version releases, or3.0.2and later3.0subminor image version releases (debian13andubuntu24images). - משימות נתמכות: Spark, PySpark, SparkSQL ו-SparkR. המנוע הרגיל פועל על סוגי עבודה אחרים שנשלחים לאשכול של Lightning Engine.
ביצוע שאילתה מקורית
הפעלת שאילתות מקוריות (NQE) היא רכיב אופציונלי של Lightning Engine, שמספק רמה עמוקה יותר של האצה למשימות ספציפיות. זהו מנוע מקורי שמבוסס על Apache Gluten ו-Velox, שעבר אופטימיזציה לחומרה של Google, ומשפר את הביצועים על ידי הרצת חלקים של שאילתת Spark מחוץ ל-JVM.
- מומלץ להשתמש ב-NQE במקרים הבאים:
- משימות שדורשות משאבי מחשוב רבים ומשתמשות בממשקי ה-API של Spark DataFrame ושל Spark Dataset, ושאילתות Spark SQL שקוראות נתונים מקבצים ומטבלאות של Parquet, ORC, Apache Iceberg ו-Delta Lake. פורמט קובץ הפלט לא משפיע על הביצועים שלו.
- לא מומלץ להשתמש ב-NQE במקרים הבאים:
- משימות שמסתמכות במידה רבה על קבוצות עמידות של נתונים מבוזרים (RDD), פונקציות בהגדרת המשתמש (UDF), רוב הספריות של למידת מכונה (ML) ב-Spark ופעולות שקשורות לקלט/פלט עם עיכובים בגלל הגישה לאחסון.
הרצת שאילתות מקוריות ב-ARM
ב-Managed Service for Apache Spark יש תמיכה בהרצת שאילתות מקוריות ב-Lightning Engine בארכיטקטורת ARM, שעברה אופטימיזציה ספציפית למעבדי Google Axion במכונות וירטואליות מסוג C4A ARM (ראו סוגי מכונות ARM שנתמכים ב-Managed Service for Apache Spark) באמצעות קובץ האימג' 2.3-ubuntu22-arm. מכונות Google Axion C4A הן מכונות וירטואליות מבוססות-ARM שמבוססות על ליבות ARM Neoverse V2, ומספקות שיפורים משמעותיים ביחס בין המחיר לביצועים.
הפעלת NQE במכונות Google Axion ARM משלבת בין יחס עלות-תועלת ברמת החומרה ורוחב פס גבוה של זיכרון לכל ליבה, לבין האצה וקטורית מקורית של שאילתות ברמת התוכנה. כך אפשר לצמצם משמעותית את זמני הריצה של השאילתות ואת עלות הבעלות הכוללת (TCO).
היתרונות העיקריים של ARM:
- מהירות גבוהה פי 2.5 עד 4 בהשוואה ל-Spark בקוד פתוח: שיפור של פי 2.5 עד 4 בביצועים בהשוואה ל-Apache Spark בקוד פתוח בעומסי עבודה של ניתוח נתונים.
- אופטימיזציה של עלויות: מיקסום היתרון של יחס המחיר-ביצועים במכונות Google Axion C4A (שמספקות יחס מחיר-ביצועים טוב יותר בשיעור של עד 65% בהשוואה למכונות x86 דומות).
- שוויון מלא בין אופרטורים ופורמטים: שוויון מלא עם אופרטורים של x86 NQE, עם האצה מובנית לפורמטים של טבלאות Cloud Storage Parquet, Apache Iceberg ו-Delta Lake.
- בלי שינויים בקוד: הפעלה חלקה באשכולות ARM באמצעות דגלי הגדרה רגילים, בלי לשנות את קוד האפליקציה של Spark.
הדרישות להרצת שאילתות מקוריות
הדרישות הבאות חלות על התכונה "הפעלת שאילתות מקוריות":
מנוע ביצוע: NQE זמין רק באשכולות שבהם מופעל מנוע Lightning בזמן יצירת האשכול.
משימות נתמכות: Spark, PySpark, Spark SQL ו-SparkR. המנוע הרגיל יפעל (ללא NQE) בסוגי עבודה אחרים שנשלחים לאשכול של Lightning Engine.
אין מעבדי GPU ומאיצים: משימות עם NQE שמוגשות במאיצי GPU ייכשלו (אבל אפשר להשתמש ב-Lightning Engine בלי NQE).
סוגי נתונים: אין תמיכה בקלט מסוגי הנתונים הבאים:
- Byte: ORC ו-Parquet
- Struct, Array, Map: Parquet
דרישות ארכיטקטורה ומערכת הפעלה
הדרישות של NQE משתנות בהתאם לארכיטקטורת המעבד:
| ארכיטקטורה | סוגי המכונות הנתמכים | מערכת הפעלה ותמונה נתמכות |
|---|---|---|
| x86 | משפחות מכונות של Intel ו-AMD | Debian-12 ו-Ubuntu-22 (גרסת תמונה 2.3.3 וגרסאות 2.3 מאוחרות יותר); Debian-13 ו-Ubuntu-24 (גרסת תמונה 3.0.2 וגרסאות 3.0 מאוחרות יותר) |
| ARM | סדרת המכונות C4A (מכונות וירטואליות של Google Axion ARM) | תמונה של 2.3-ubuntu22-arm (גרסה 2.3.3 וגרסאות 2.3 מאוחרות יותר) |
תמחור
למידע על מחירים, ראו התמחור של Managed Service for Apache Spark.
יצירת אשכול של Lightning Engine
בקטע הזה מוסבר איך יוצרים אשכול Managed Service for Apache Spark שמפעיל את Lightning Engine במשימות Spark שנשלחות לאשכול.
אפשר גם להפעיל את Native Query Execution (NQE) באשכול כשיוצרים אותו, או להפעיל את NQE מאוחר יותר למשימות Spark ספציפיות שנשלחות לאשכול.
לפני שמתחילים
-
In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that you have the permissions required to complete this guide.
-
Verify that billing is enabled for your Cloud de Confiance project.
Enable the Dataproc API, if it is not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Install the Google Cloud CLI.
-
Configure the gcloud CLI to use your federated identity.
For more information, see Sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
התפקידים הנדרשים
כדי ליצור אשכול Managed Service for Apache Spark ולשלוח אליו משימות, נדרשים תפקידים מסוימים של ניהול זהויות והרשאות גישה (IAM). בהתאם למדיניות הארגון, יכול להיות שהבעלים של הפרויקט בענן או האדמין של השירות כבר הקצו את התפקידים האלה לכם או לחשבון שירות. כדי לבדוק את הקצאות התפקידים, קראו את המאמר האם צריך להקצות תפקידים?.
להסבר על מתן תפקידים, קראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
תפקידי משתמשים
כדי לקבל את ההרשאות שדרושות ליצירת אשכול Managed Service for Apache Spark, בקשו מהאדמין להקצות לכם את התפקידים הבאים ב-IAM:
- עריכת Dataproc (
roles/dataproc.editor) בפרויקט - משתמש בחשבון שירות (
roles/iam.serviceAccountUser) בחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine
תפקיד של חשבון שירות
כדי לוודא שלחשבון השירות שמשמש כברירת מחדל ב-Compute Engine יש את ההרשאות שנדרשות ליצירת אשכול Managed Service for Apache Spark, צריך לבקש מהאדמין לתת לחשבון השירות שמשמש כברירת מחדל ב-Compute Engine את התפקיד Dataproc Worker (roles/dataproc.worker) ב-IAM בפרויקט.
יצירת האשכול
בדוגמאות הבאות מוסבר איך ליצור אשכול של Lightning Engine באמצעות מסוף Cloud de Confiance , Google Cloud CLI, Dataproc API, ספריות הלקוח של Cloud ל-Python או Terraform. אפשר גם ליצור אשכול עם Lightning Engine באמצעות ספריות הלקוח של Cloud ב-Go, ב-Java וב-Node.js.
המסוף
- פותחים את הדף Create cluster.
- לוחצים על הגדרות נוספות כדי להרחיב את הקטע.
- עורכים את ההתאמה האישית והגדרות אחרות.
- בחלונית שנפתחת, מוודאים שהתיבה Enable Lightning Engine מסומנת.
- אופציונלי: כדי להפעיל את סביבת זמן הריצה המקורית כברירת מחדל למשימות Spark, מסמנים את התיבה Enable Native Execution.
- לוחצים על Save.
- מגדירים את שאר ההגדרות של האשכול לפי הצורך.
- לוחצים על Create cluster.
יצירת אשכול ARM:
כדי ליצור אשכול ARM עם Google Axion והרצת שאילתות מקוריות:
- בקטע Worker configuration, בוחרים את סדרת המכונות C4A ואת סוג מכונת ה-ARM.
- בקטע תמונה, בוחרים את התמונה של
2.3-ubuntu22-arm. - בקטע Additional configuration > Customization & Other, מוודאים שהאפשרויות Enable Lightning Engine ו-Enable Native Execution מסומנות.
- לוחצים על Create cluster.
gcloud
כדי ליצור אשכול עם Lightning Engine, מריצים את הפקודה
gcloud dataproc clusters createעם הדגל--engine=lightning. למידע נוסף, קראו את המאמר יצירת אשכול באמצעות ה-CLI של gcloud.gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --engine=lightning \ --image-version=2.3אופציונלי: כדי להפעיל את סביבת זמן הריצה המקורית כברירת מחדל למשימות Spark, צריך לכלול את המאפיין
spark:spark.dataproc.lightningEngine.runtime=native.gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --engine=lightning \ --image-version=2.3 \ --properties='spark:spark.dataproc.lightningEngine.runtime=native'יצירת אשכול ARM עם NQE: כדי ליצור אשכול Managed Service for Apache Spark עם צומתי Google Axion C4A ARM ו-NQE מופעל:
gcloud dataproc clusters create CLUSTER_NAME \ --region=REGION \ --image-version=2.3-ubuntu22-arm \ --master-machine-type=c4a-standard-16 \ --worker-machine-type=c4a-standard-16 \ --engine=lightning \ --properties='spark:spark.dataproc.lightningEngine.runtime=native'
API
כדי ליצור אשכול עם מנוע Lightning, שולחים בקשת clusters.create. מידע נוסף זמין במאמר יצירת אשכול באמצעות API בארכיטקטורת REST.
בגוף הבקשה, מגדירים את השדה
engineלערךLIGHTNING.{ "projectId": "PROJECT_ID", "clusterName": "CLUSTER_NAME", "config": { "engine": "LIGHTNING", "gceClusterConfig": {}, "softwareConfig": { "imageVersion": "2.3" } } }אופציונלי: כדי להפעיל את סביבת זמן הריצה המקורית כברירת מחדל לכל המשימות, מוסיפים את המאפיין
spark:spark.dataproc.lightningEngine.runtime.{ "projectId": "PROJECT_ID", "clusterName": "CLUSTER_NAME", "config": { "engine": "LIGHTNING", "gceClusterConfig": {}, "softwareConfig": { "imageVersion": "2.3", "properties": { "spark:spark.dataproc.lightningEngine.runtime": "native" } } } }
Python
כדי ליצור אשכול עם Lightning Engine, משתמשים ב-method
create_clusterומגדירים את השדהengineבהגדרות האשכול כ-LIGHTNING. למידע נוסף, ראו יצירת אשכול באמצעות Python.from google.cloud import dataproc_v1 def create_lightning_cluster(project_id, region, cluster_name): client_options = {"api_endpoint": f"{region}-dataproc.googleapis.com:443"} cluster_client = dataproc_v1.ClusterControllerClient(client_options=client_options) cluster = { "project_id": project_id, "cluster_name": cluster_name, "config": { "engine": "LIGHTNING", "software_config": { "image_version": "2.3-debian12", }, } } operation = cluster_client.create_cluster( project_id=project_id, region=region, cluster=cluster ) result = operation.result() print(f"Cluster created successfully: {result.cluster_name}")אופציונלי: כדי להפעיל את סביבת זמן הריצה המקורית כברירת מחדל למשימות Spark, צריך לכלול את המאפיין
spark:spark.dataproc.lightningEngine.runtime.from google.cloud import dataproc_v1 def create_lightning_native_cluster(project_id, region, cluster_name): client_options = {"api_endpoint": f"{region}-dataproc.googleapis.com:443"} cluster_client = dataproc_v1.ClusterControllerClient(client_options=client_options) cluster = { "project_id": project_id, "cluster_name": cluster_name, "config": { "engine": "LIGHTNING", "software_config": { "image_version": "2.3-debian12", "properties": { "spark:spark.dataproc.lightningEngine.runtime": "native" } } } } operation = cluster_client.create_cluster( project_id=project_id, region=region, cluster=cluster ) result = operation.result() print(f"Cluster created successfully: {result.cluster_name}")
Terraform
- בהגדרת המשאב
google_dataproc_cluster, מגדירים את הארגומנטengineלערךLIGHTNING. - לפרטים נוספים ולאפשרויות מתקדמות, קראו את המאמר הרשמי של Terraform בנושא המשאב
google_dataproc_cluster.
אימות מנוע האשכול
המסוף
- נכנסים לדף Cluster Details במסוף Cloud de Confiance .
- מוודאים שהערך
Lightning Engineמופיע בשדה מנוע. - אם הפעלתם את Native Query Execution, ודאו ש-
nativeמופיע בשדה Native Execution.
gcloud
כדי לאמת את המנוע ואת ה-NQE (אם הוא מופעל), מריצים את הפקודה
gcloud dataproc clusters describe:gcloud dataproc clusters describe CLUSTER_NAME --project=PROJECT_ID --region=REGIONבודקים את הפלט של המאפיינים
engineו-lightningEngine.runtime:clusterName: lightning-engine-cluster engine: lightningEngine lightningEngine.runtime: native
שליחת משימה באמצעות Lightning Engine
אם הפעלתם את Lightning Engine כשיצרתם אשכול, כשאתם שולחים משימת Spark לאשכול, Lightning Engine מופעל כברירת מחדל במשימה.
הפעלת Native Query Execution במשימה
אם הפעלתם את Native Query Execution (NQE) כשיצרתם אשכול של Lightning Engine, כל משימות Spark יפעלו עם NQE, אלא אם תשביתו את NQE במשימה ספציפית.
אם לא הפעלתם את NQE כשיצרתם את אשכול Lightning Engine, אתם יכולים להפעיל את NQE למשימה כשאתם שולחים אותה, כמו שמוצג בדוגמאות הבאות.
gcloud
כדי להפעיל את Native Query Execution כששולחים משימת Spark, צריך לכלול את המאפיין spark.dataproc.lightningEngine.runtime=native:
gcloud dataproc jobs submit spark \
--cluster=CLUSTER_NAME \
--region=REGION \
--properties=spark.dataproc.lightningEngine.runtime=native \
-- ...
API
כדי להפעיל את Native Query Execution כששולחים משימת Spark, צריך לכלול את המאפיין spark.dataproc.lightningEngine.runtime בבקשה:
{
"job":{
"placement":{
"clusterName": ...
},
"sparkJob":{
"mainClass": ...,
"properties":{
"spark.dataproc.lightningEngine.runtime":"native"
}
}
}
}
השבתת הרצת שאילתות מקוריות במשימה
אם הפעלתם את Native Query Execution (NQE) כשיצרתם אשכול של Lightning Engine, כל משימות Spark יפעלו כש-NQE מופעל, אלא אם תשביתו את NQE במשימה ספציפית.
אפשר להשבית את NQE למשימת Spark ספציפית כששולחים את המשימה, כמו שמוצג בדוגמאות הבאות.
gcloud
כדי להשבית את Native Query Execution כששולחים משימת Spark לאשכול Lightning Engine, צריך לכלול את המאפיין spark.dataproc.lightningEngine.runtime=default:
gcloud dataproc jobs submit spark \
--cluster=CLUSTER_NAME \
--region=REGION \
--properties=spark.dataproc.lightningEngine.runtime=default \
-- ...
API
כדי להשבית את Native Query Execution כששולחים משימת Spark לאשכול Lightning Engine, צריך לכלול את המאפיין spark.dataproc.lightningEngine.runtime=default:
{
"job":{
"placement":{
"clusterName": ...
},
"sparkJob":{
"mainClass": ...,
"properties":{
"spark.dataproc.lightningEngine.runtime":"default"
}
}
}
}
אימות של הפעלת שאילתה מקורית במשימה
אחרי ששולחים משימה לאשכול של Lightning Engine, אפשר לוודא שהפעלת השאילתות המקוריות מופעלת במשימה.
המסוף
- נכנסים לדף Jobs במסוף Cloud de Confiance .
- לוחצים על מזהה המשימה כדי לפתוח את הדף Job details.
- מוודאים שהערך
nativeמופיע בשדה Native Execution.
gcloud
מריצים את הפקודה
gcloud dataproc jobs describe:gcloud dataproc jobs describe JOB_ID --project=PROJECT_ID --region=REGIONבודקים את הפלט של
lightningEngine.runtimeבקטע Properties:lightningEngine.runtime: native
פרמטרים להגדרה
בטבלה הבאה מפורטים הפרמטרים העיקריים להגדרת Lightning Engine ו-Native Query Execution.
| שם הפרמטר | תיאור | מנועי החיפוש הרלוונטיים | ערך ברירת המחדל | ערך ברירת המחדל (Lightning Engine) | המשתמש יכול לשנות (ברמת המשימה) | היקף |
|---|---|---|---|---|---|---|
--engine |
הגדרה ברמת האשכול לבחירת המנוע במהלך יצירת האשכול. | בכל האשכול | default |
lightning |
לא | אשכול |
spark:spark.dataproc.lightningEngine.runtime |
הגדרה ברמת האשכול לבחירת סביבת זמן הריצה של מנוע Lightning במהלך יצירת האשכול. | רק Lightning | default |
default |
לא | אשכול |
spark.dataproc.lightningEngine.runtime |
ההגדרה מפעילה או משביתה את Native Query Execution (NQE) ב-Lightning Engine. | רק Lightning | default |
default |
כן. אפשר להגדיר את הערך native או default. |
משימה |
מגבלות
הפעלת Native Query Execution בתרחישים הבאים עלולה לגרום לחריגות, לחוסר תאימות ל-Spark או להחזרת עומס העבודה למנוע ברירת המחדל של Spark.
חלופות
הפעלת שאילתות מקוריות בתרחישים הבאים יכולה לגרום לעומס עבודה שחוזר למנוע ההפעלה של Spark:
- ANSI: אם מצב ANSI מופעל, הביצוע חוזר ל-Spark.
- מצב תלוי אותיות רישיות: הרצת שאילתות מקוריות תומכת רק במצב ברירת המחדל של Spark, שלא תלוי באותיות רישיות. אם מופעל מצב תלוי אותיות רישיות, יכול להיות שיתקבלו תוצאות שגויות.
- סריקת טבלה מחולקת למחיצות: הרצת שאילתות מקוריות תומכת בסריקת טבלה מחולקת למחיצות רק כשהנתיב מכיל את פרטי המחיצה. אחרת, עומס העבודה חוזר למנוע הביצוע של Spark.
התנהגות לא תואמת
יכול להיות שתקבלו תוצאות שגויות או שתיתקלו בהתנהגות לא תואמת אם תשתמשו ב-Native Query Execution במקרים הבאים:
- פונקציות JSON: הרצת שאילתות מקוריות תומכת במחרוזות שמוקפות במירכאות כפולות, ולא במירכאות בודדות. אם משתמשים במירכאות בודדות, התוצאות שגויות. אם משתמשים ב-
*בנתיב עם הפונקציהget_json_object, הפונקציה מחזירה את הערךNULL. - הגדרת קריאה של Parquet:
- ב-Native Query Execution, המערכת מתייחסת ל-
spark.files.ignoreCorruptFilesכאילו הוא מוגדר לערך ברירת המחדלfalse, גם כשהוא מוגדר ל-true. - התכונה "הרצת שאילתות מקוריות" מתעלמת מ-
spark.sql.parquet.datetimeRebaseModeInReadומחזירה רק את תוכן הקובץ בפורמט Parquet. אין התייחסות להבדלים בין לוח השנה ההיברידי הקודם לבין לוח השנה הגרגוריאני הפרופטי. התוצאות של Spark יכולות להיות שונות.
- ב-Native Query Execution, המערכת מתייחסת ל-
- NaN: לא נתמך. יכול להיות שתקבלו תוצאות לא צפויות, למשל אם תשתמשו ב-
NaNבהשוואה מספרית. - קריאה עמודית של Spark: שגיאה חמורה יכולה להתרחש כי הווקטור העמודי של Spark לא תואם ל-Native Query Execution.
- זליגה: כשמגדירים מספר גדול של מחיצות ערבוב, התכונה "זליגה לדיסק" יכולה להפעיל
OutOfMemoryException. במקרה כזה, הקטנת מספר המחיצות יכולה למנוע את החריגה.