שימוש ב-Lightning Engine
Lightning Engine הוא הדור הבא של ביצועי Apache Spark, עם שיפורים בלעדיים שנועדו לספק שיפורים משמעותיים בביצועים, ביעילות מבחינת עלויות וביציבות התפעולית.
יתרונות
היתרונות של Lightning Engine כוללים את הדברים הבאים:
פעולות נתונים מואצות: שיפורים באינטראקציה עם אחסון בענן, כולל טיפול במטא-נתונים, עומסי עבודה של כתיבה וקלט/פלט וקטורי, מאפשרים להשיג שיפורים משמעותיים בביצועים וחיסכון בעלויות.
ביצוע חכם של שאילתות: שימוש בשיפורים מתקדמים של כלי האופטימיזציה כדי לצמצם באופן דינמי את הנתונים שנסרקים, לבצע אופטימיזציה של עיבוד הנתונים וליצור תוכניות ביצוע יעילות יותר לשאילתות מהירות וחסכוניות יותר.
עומסי עבודה יעילים של AI ו-ML: קיצור זמני ההפעלה של אשכולות לעומסי עבודה מבוססי GPU, ופישוט הפריסה בסביבות מאובטחות באמצעות תמונות שעברו אופטימיזציה ל-AI.
מנוע Lightning מציע שיפורים משמעותיים בביצועים, אבל ההשפעה הספציפית משתנה בהתאם לעומס העבודה. הוא מתאים במיוחד למשימות עתירות-חישוב שמנצלות את ממשקי ה-API של Spark Dataframe, ממשקי ה-API של Spark Dataset ושאילתות Spark SQL, ולא לפעולות שמוגבלות על ידי קלט/פלט.
השוואה למנוע רגיל
Lightning Engine הוא חלופה למנוע הרגיל שמשמש להפעלת משימות Spark באשכול Managed Service for Apache Spark. בטבלה הבאה מוצגת השוואה בין Lightning Engine לבין מאפייני ההפעלה של מנוע רגיל, תחולת עומס העבודה והיתרונות העיקריים.
| תכונה | מנוע רגיל | Lightning Engine |
|---|---|---|
| דגל CLI | --engine=default או ביטול ההגדרה של הדגל |
--engine=lightning |
| מתאים במיוחד עבור | משרות לשימוש כללי, פיתוח ובדיקה | עומסי עבודה בקנה מידה ארגוני שדורשים האצה משמעותית |
| יתרונות עיקריים | ביצועים בסיסיים | אינטראקציה אופטימלית עם אחסון בענן, ביצוע חכם של שאילתות |
דרישות
הדרישות הבאות חלות על התכונה Lightning Engine:
- גרסת התמונה: צריך להשתמש ב-Lightning Engine עם גרסה
2.3.3ואילך של תמונת Managed Service for Apache Spark. - משימות נתמכות: המשימות Spark, PySpark, SparkSQL ו-SparkR נתמכות. המנוע הרגיל פועל על סוגים אחרים של משימות שנשלחות לאשכול Lightning Engine.
ביצוע שאילתה מקורית
Native Query Execution (NQE) הוא רכיב אופציונלי של Lightning Engine שמספק רמת האצה עמוקה יותר למשימות ספציפיות. זהו מנוע מקורי שמבוסס על Apache Gluten ועל Velox, ועבר אופטימיזציה למכשירי Google. הוא משפר את הביצועים על ידי הפעלת חלקים של שאילתת Spark מחוץ ל-JVM.
- מומלץ להשתמש ב-NQE בשביל:
- משימות עתירות-חישוב שמתבססות על ממשקי Spark Dataframe API ו-Spark Dataset API, ועל שאילתות Spark SQL שקוראות נתונים מקובצי Parquet ו-ORC. הפורמט של קובץ הפלט לא משפיע על הביצועים שלו.
- לא מומלץ להשתמש ב-NQE:
- משימות שמסתמכות במידה רבה על Resilient Distributed Datasets (RDDs), User-Defined Functions (UDFs), רוב ספריות Spark Machine Learning (ML) ופעולות שמוגבלות על ידי קלט/פלט עם עיכובים בגלל גישה לאחסון.
דרישות
הדרישות הבאות חלות על התכונה Native Query Execution:
מנוע ההפעלה: NQE זמין רק באשכולות שמופעל בהם מנוע Lightning בזמן יצירת האשכול.
מערכת הפעלה: נתמכות רק מערכות הפעלה
Debian-12ו-Ubuntu-22. עבודות שהופעלה בהן NQE ומשתמשות במערכת הפעלה אחרת ייכשלו.משימות נתמכות: המשימות Spark, PySpark, SparkSQL ו-SparkR נתמכות. המנוע הרגיל יפעל (ללא NQE) בסוגי משימות אחרים שנשלחים לאשכול של Lightning Engine.
סוגי מכונות: נתמכות רק משפחות של מכונות שמשתמשות במעבדי Intel או AMD. עבודות שמופעל בהן NQE באמצעות מעבדי ARM ייכשלו (אבל יכולות להפיק תועלת מ-Lightning Engine בלי NQE).
ללא מעבדי GPU ומאיצים: משימות שהופעלה בהן NQE ונשלחו למאיצי GPU ייכשלו (אבל יכולות להפיק תועלת מ-Lightning Engine ללא NQE).
סוגי נתונים: לא ניתן להשתמש בקלט מסוגי הנתונים הבאים:
- בייט: ORC ו-Parquet
- Struct, Array, Map: Parquet
תמחור
למידע על מחירים אפשר לעיין במאמר בנושא מחירים של Managed Service for Apache Spark.
יצירת אשכול Lightning Engine
בקטע הזה מוסבר איך ליצור אשכול של Managed Service for Apache Spark שמאפשר להשתמש ב-Lightning Engine במשימות Spark שנשלחות לאשכול.
אפשר גם להפעיל את התכונה Native Query Execution (NQE) באשכול כשיוצרים את האשכול, או להפעיל אותה מאוחר יותר למשימות ספציפיות של Spark שנשלחות לאשכול.
לפני שמתחילים
- נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud 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 Google Cloud project.
Enable the Dataproc API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud 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 Google Cloud project.
Enable the Dataproc API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
gcloud init
התפקידים הנדרשים
כדי ליצור אשכול של Managed Service for Apache Spark ולשלוח אליו משימות, צריך תפקידי IAM מסוימים. יכול להיות שבעלים של פרויקט בענן או אדמין של שירות כבר הקצו לכם או לחשבון שירות את התפקידים האלה, בהתאם למדיניות הארגון. כדי לבדוק את הקצאות התפקידים, אפשר לעיין במאמר האם צריך להקצות תפקידים?.
מידע נוסף על הקצאת תפקידים מופיע במאמר ניהול הגישה לפרויקטים, לתיקיות ולארגונים.
תפקידי משתמשים
כדי לקבל את ההרשאות שדרושות ליצירת אשכול של Managed Service for Apache Spark, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:
-
הכול:
- עריכת Dataproc (
roles/dataproc.editor) בפרויקט - משתמש בחשבון שירות (
roles/iam.serviceAccountUser) בחשבון השירות של Compute Engine שמוגדר כברירת מחדל
- עריכת Dataproc (
תפקיד בחשבון שירות
כדי לוודא שלחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine יש את ההרשאות שנדרשות ליצירת אשכול של Managed Service for Apache Spark, צריך לבקש מהאדמין להקצות לחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine את תפקיד ה-IAM Dataproc Worker (roles/dataproc.worker) בפרויקט.
יצירת האשכול
בדוגמאות הבאות מוסבר איך ליצור אשכול Lightning Engine באמצעות מסוף Google Cloud , Google Cloud CLI, Dataproc API, ספריות לקוח של Cloud ל-Python או Terraform. אפשר גם ליצור אשכול עם Lightning Engine מופעל באמצעות ספריות הלקוח ב-Cloud של Go, Java ו-Node.js.
המסוף
- פותחים את הדף Create cluster.
- לוחצים על הגדרה נוספת כדי להרחיב את הקטע.
- עורכים את התאמה אישית ואחר.
- בחלונית שנפתחת, מוודאים שתיבת הסימון הפעלת מנוע Lightning מסומנת.
- אופציונלי: כדי להפעיל את זמן הריצה של הביצוע המקורי כברירת מחדל לעבודות Spark, מסמנים את תיבת הסימון הפעלת ביצוע מקורי.
- לוחצים על Save.
- מגדירים את שאר ההגדרות של האשכול לפי הצורך.
- לוחצים על יצירת אשכול.
CLI של 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'
API
כדי ליצור אשכול עם Lightning Engine מופעל, שולחים בקשת clusters.create. מידע נוסף זמין במאמר בנושא יצירת אשכול באמצעות REST API.
בגוף הבקשה, מגדירים את השדה
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 מופעל, משתמשים בשיטה
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.
אימות מנוע האשכול
המסוף
- במסוף Google Cloud , נכנסים לדף Cluster Details.
- מוודאים שהערך
Lightning Engineמופיע בשדה Engine (מנוע). - אם הפעלתם את התכונה 'ביצוע שאילתות מקוריות', ודאו שהערך
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 (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, אפשר לוודא שהאפשרות Native Query Execution (הרצת שאילתות מקוריות) מופעלת עבור העבודה.
המסוף
- נכנסים לדף Jobs במסוף Google Cloud .
- לוחצים על מזהה העבודה כדי לפתוח את הדף פרטי העבודה.
- מוודאים ש-
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.
התנהגות לא תואמת
התנהגות לא תואמת או תוצאות שגויות יכולות להתרחש כשמשתמשים בהרצת שאילתות מקוריות במקרים הבאים:
- פונקציות 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 לא תואם להרצת שאילתות מקוריות.
- Spill: כשמגדירים מספר גדול של מחיצות לערבוב, התכונה spill-to-disk יכולה להפעיל
OutOfMemoryException. אם זה קורה, אפשר לצמצם את מספר המחיצות כדי לבטל את החריגה הזו.