כשיוצרים אשכול Managed Service for Apache Spark, אפשר לציין פעולות אתחול בקובצי הפעלה או בסקריפטים ש-Managed Service for Apache Spark יריץ בכל הצמתים באשכול Managed Service for Apache Spark מיד אחרי הגדרת האשכול. פעולות אתחול בדרך כלל מגדירות יחסי תלות של משימות, כמו התקנת חבילות Python, כדי שיהיה אפשר לשלוח משימות לאשכול בלי להתקין יחסי תלות כשהמשימות פועלות.
אפשר למצוא סקריפטים לדוגמה של פעולות אתחול במיקומים הבאים: הערה: Google לא תומכת בדוגמאות האלה.
- מאגר GitHub
- Cloud Storage – בקטגוריות הציבוריות של
gs://goog-dataproc-initialization-actions-REGIONבאזור
שיקולים חשובים והנחיות
אל תיצרו אשכולות ייצור שמפנים לפעולות אתחול שנמצאות בקטגוריות הציבוריות של
gs://goog-dataproc-initialization-actions-REGION. הסקריפטים האלה מסופקים כהטמעות לדוגמה. הם מסונכרנים עם השינויים השוטפים במאגר ב-GitHub, ועדכונים בסקריפטים האלה עלולים לשבש את יצירת האשכול. במקום זאת, העתיקו את פעולת האיניציאליזציה מהקטגוריה הציבורית לתיקייה עם גרסאות בקטגוריה של Cloud Storage, כמו בדוגמה הבאה: אחר כך יוצרים את האשכול על ידי הפניה לעותק ב-Cloud Storage:REGION=COMPUTE_REGIONgcloud storage cp gs://goog-dataproc-initialization-actions-${REGION}/cloud-sql-proxy/cloud-sql-proxy.sh \ gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.shgcloud dataproc clusters create CLUSTER_NAME \ --region=${REGION} \ --initialization-actions=gs://my-bucket/cloud-sql-proxy/v1.0/cloud-sql-proxy.sh \ ...other flags...פעולות אתחול מבוצעות בכל צומת בסדרה במהלך יצירת האשכול. הם מופעלים גם בכל צומת שנוסף כשמבצעים התאמה לעומס או התאמה אוטומטית לעומס של אשכולות.
כשמעדכנים פעולות אתחול – לדוגמה, כשמסנכרנים את פעולות האתחול של Cloud Storage עם שינויים שבוצעו בפעולות אתחול של קטגוריה ציבורית או של מאגר GitHub – צריך ליצור תיקייה חדשה (רצוי עם שם גרסה) כדי לקבל את פעולות האתחול המעודכנות. לעומת זאת, אם תעדכנו את פעולת האיניציאליזציה במקום, צמתים חדשים, כמו אלה שנוספו על ידי המידרוג האוטומטי, יריצו את פעולת האיניציאליזציה המעודכנת במקום, ולא את פעולת האיניציאליזציה של הגרסה הקודמת שרצה בצמתים הקיימים. הבדלים כאלה בפעולות האתחול עלולים לגרום לצמתים לא עקביים או לא תקינים באשכול.
פעולות האתחול פועלות כמשתמש
root. אין צורך להשתמש ב-sudo.משתמשים בנתיבים מוחלטים בפעולות אתחול.
כדי לציין איך לפרש את הסקריפט (למשל
#!/bin/bashאו#!/usr/bin/python), משתמשים בשורת shebang בפעולות האתחול.בפעולות אתחול, משתמשים בסיומות שורה בסגנון Unix (LF). אם אתם יוצרים פעולות אתחול ב-Windows, יכול להיות שהן יכילו סיומות שורה בסגנון Windows (CRLF), מה שעלול לגרום לכשלים בהפעלת הסקריפט.
אם פעולת אתחול מסתיימת בקוד יציאה שאינו אפס, פעולת יצירת האשכול תדווח על סטטוס "ERROR". כדי לנפות באגים בפעולת האתחול, מתחברים למכונות הווירטואליות של האשכול באמצעות SSH ובודקים את היומנים. אחרי שפותרים את הבעיה בפעולת האתחול, אפשר למחוק את האשכול וליצור אותו מחדש.
אם יוצרים אשכול Managed Service for Apache Spark עם כתובות IP פנימיות בלבד, ניסיונות לגשת אל
github.comדרך האינטרנט בפעולת אתחול ייכשלו, אלא אם הגדרתם מסלולים להפניית התנועה דרך Cloud NAT או Cloud VPN. אם אין גישה לאינטרנט, אפשר להפעיל את הגישה הפרטית ל-Google ולהציב את יחסי התלות של המשימות ב-Cloud Storage. צומתי האשכול יכולים להוריד את יחסי התלות מ-Cloud Storage מכתובות IP פנימיות.כדי להגדיר יחסי תלות של משימות, אתם יכולים להשתמש בתמונות בהתאמה אישית של Managed Service for Apache Spark במקום בפעולות אתחול.
עיבוד האתחול:
- אשכולות של תמונות בגרסאות קודמות ל-2.0:
- Master: כדי לאפשר לפעולות אתחול שפועלות בצומתי מאסטר לכתוב קבצים ב-HDFS, פעולות אתחול של צומת מאסטר לא מתחילות עד שניתן לכתוב ב-HDFS (עד ש-HDFS יוצא ממצב בטוח ולפחות שני צומתי נתונים של HDFS הצטרפו).
- Worker: אם מגדירים את
dataproc:dataproc.worker.custom.init.actions.modeמאפיין האשכול ל-RUN_BEFORE_SERVICES, כל worker מריץ את פעולות האיניציאליזציה שלו לפני שהוא מפעיל את ה-daemons של HDFS datanode ו-YARN nodemanager. ב-Managed Service for Apache Spark, פעולות האיניציאליזציה של המאסטר לא פועלות עד שניתן לכתוב ב-HDFS, וזה דורש הפעלה של 2 דימונים של צומת נתונים ב-HDFS. לכן, הגדרת המאפיין הזה עשויה להאריך את זמן היצירה של האשכול.
2.0+ אשכולות של תמונות:
- Master: יכול להיות שפעולות האתחול של צומת ה-Master יפעלו לפני שניתן יהיה לכתוב ב-HDFS. אם אתם מריצים פעולות אתחול שמכינות קבצים ב-HDFS או תלויות בזמינות של שירותים שתלויים ב-HDFS, כמו Ranger, הגדירו את
dataproc.master.custom.init.actions.modeכמאפיין של האשכול ל-RUN_AFTER_SERVICES. הערה: מכיוון שהגדרת המאפיין הזו יכולה להאריך את זמן יצירת האשכול – ראו את ההסבר על העיכוב ביצירת אשכולות עבור רכיבי worker של אשכולות תמונות בגרסה שקודמת ל-2.0 – השתמשו בה רק כשצריך (ככלל, הסתמכו על הגדרת ברירת המחדלRUN_BEFORE_SERVICESשל המאפיין הזה). - Worker: מאפיין האשכול
dataproc:dataproc.worker.custom.init.actions.modeמוגדר לערךRUN_BEFORE_SERVICESואי אפשר להעביר אותו לאשכול כשהאשכול נוצר (אי אפשר לשנות את הגדרת המאפיין). כל worker מריץ את פעולות האיניציאליזציה שלו לפני שהוא מפעיל את ה-daemons של HDFS datanode ו-YARN nodemanager. מכיוון ש-Managed Service for Apache Spark לא ממתין עד ש-HDFS יהיה ניתן לכתיבה לפני הפעלת פעולות האיניציאליזציה של המאסטר, פעולות האיניציאליזציה של המאסטר וה-worker פועלות במקביל.
- Master: יכול להיות שפעולות האתחול של צומת ה-Master יפעלו לפני שניתן יהיה לכתוב ב-HDFS. אם אתם מריצים פעולות אתחול שמכינות קבצים ב-HDFS או תלויות בזמינות של שירותים שתלויים ב-HDFS, כמו Ranger, הגדירו את
המלצות:
- משתמשים במטא-נתונים כדי לקבוע את התפקיד של הצומת, כדי להריץ באופן מותנה פעולת אתחול בצמתים (ראו שימוש במטא-נתונים של אשכול).
- כדי לשמור על יציבות, כדאי ליצור עותק של פעולת האיניציאליזציה בקטגוריה של Cloud Storage (ראו איך משתמשים בפעולות איניציאליזציה).
- כדי לייצב את פעולת האיניציאליזציה, הוסיפו ניסיונות חוזרים כשאתם מורידים מהאינטרנט.
- אשכולות של תמונות בגרסאות קודמות ל-2.0:
שימוש בפעולות אתחול
אפשר לציין פעולות אתחול של אשכולות בלי קשר לאופן שבו יוצרים את האשכול:
- דרך מסוף Google Cloud
- באמצעות ה-CLI של gcloud
- באופן פרוגרמטי באמצעות Dataproc clusters.create API (ראו NodeInitializationAction)
מסוףGoogle Cloud
CLI של gcloud
כשיוצרים אשכול באמצעות הפקודה gcloud dataproc clusters create, מציינים מיקום אחד או יותר ב-Cloud Storage (מזהי URI) של קובצי ההפעלה או הסקריפטים של האתחול, מופרדים בפסיקים, באמצעות הדגל --initialization-actions. הערה: אין תמיכה בכמה תווים עוקבים של "/" ב-URI של מיקום ב-Cloud Storage אחרי ה-"gs://" הראשוני, כמו "gs://bucket/my//object//name". כדי לקבל מידע על הפקודה, מריצים את gcloud dataproc clusters create --help.
gcloud dataproc clusters create cluster-name \
--region=${REGION} \
--initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \
--initialization-action-timeout=timeout-value (default=10m) \
... other flags ...
- משתמשים בדגל
--initialization-action-timeoutכדי לציין את משך הזמן הקצוב לפעולת האתחול. ערך ברירת המחדל של הזמן הקצוב לתפוגה הוא 10 דקות. אם הסקריפט או קובץ ההפעלה של פעולת האתחול לא מסתיימים עד סוף תקופת הזמן הקצוב לתפוגה, Managed Service for Apache Spark מבטל את פעולת האתחול. -
משתמשים במאפיין האשכול
dataproc:dataproc.worker.custom.init.actions.modeכדי להריץ את פעולת האיניציאליזציה ב-primary workers לפני שמתחילים ה-daemons של Node Manager ו-datanode.
API בארכיטקטורת REST
מציינים סקריפט אחד או יותר או קובצי הפעלה במערך ClusterConfig.initializationActions כחלק מבקשת API של clusters.create.
דוגמה
POST /v1/projects/my-project-id/regions/us-central1/clusters/
{
"projectId": "my-project-id",
"clusterName": "example-cluster",
"config": {
"configBucket": "",
"gceClusterConfig": {
"subnetworkUri": "default",
"zoneUri": "us-central1-b"
},
"masterConfig": {
"numInstances": 1,
"machineTypeUri": "n1-standard-4",
"diskConfig": {
"bootDiskSizeGb": 500,
"numLocalSsds": 0
}
},
"workerConfig": {
"numInstances": 2,
"machineTypeUri": "n1-standard-4",
"diskConfig": {
"bootDiskSizeGb": 500,
"numLocalSsds": 0
}
},
"initializationActions": [
{
"executableFile": "gs://cloud-example-bucket/my-init-action.sh"
}
]
}
}
העברת ארגומנטים לפעולות אתחול
Managed Service for Apache Spark מגדיר ערכי מטא-נתונים מיוחדים למכונות שפועלות באשכולות שלכם. אתם יכולים להגדיר מטא-נתונים בהתאמה אישית כדי להעביר ארגומנטים לפעולות אתחול.
gcloud dataproc clusters create cluster-name \
--region=${REGION} \
--initialization-actions=Cloud Storage URI(s) (gs://bucket/...) \
--metadata=name1=value1,name2=value2... \
... other flags ...
אפשר לקרוא את ערכי המטא-נתונים בתוך פעולות אתחול באופן הבא:
var1=$(/usr/share/google/get_metadata_value attributes/name1)
בחירת צומת
אם רוצים להגביל את פעולות האיניציאליזציה לצומתי מאסטר, מנהל התקן או עובד, אפשר להוסיף לוגיקה של בחירת צומת לקובץ ההפעלה או לסקריפט.
ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role)
if [[ "${ROLE}" == 'Master' ]]; then
... master specific actions ...
else if [[ "${ROLE}" == 'Driver' ]]; then
... driver specific actions ...
else
... worker specific actions ...
fi
העלאת קבצים בינאריים לשלב הביניים
תרחיש נפוץ של אתחול אשכול הוא שלב הביניים של קובצי ה-binary של המשימה באשכול, כדי שלא יהיה צורך להעביר את קובצי ה-binary לשלב הביניים בכל פעם ששולחים משימה. לדוגמה, נניח שסקריפט האתחול הבא מאוחסן במיקום של קטגוריית Cloud Storage, gs://my-bucket/download-job-jar.sh:
#!/bin/bash
ROLE=$(/usr/share/google/get_metadata_value attributes/dataproc-role)
if [[ "${ROLE}" == 'Master' ]]; then
gcloud storage cp gs://my-bucket/jobs/sessionalize-logs-1.0.jar home/username
fi
אפשר להעביר את המיקום של הסקריפט הזה לפקודה gcloud dataproc clusters create:
gcloud dataproc clusters create my-dataproc-cluster \
--region=${REGION} \
--initialization-actions=gs://my-bucket/download-job-jar.sh
Managed Service for Apache Spark יריץ את הסקריפט הזה בכל הצמתים, וכתוצאה מהלוגיקה של בחירת הצמתים בסקריפט, יוריד את קובץ ה-JAR לצומת הראשי. אחרי שהעליתם את קובץ ה-JAR, אתם יכולים להשתמש בו במשימות שאתם שולחים:
gcloud dataproc jobs submit hadoop \
--cluster=my-dataproc-cluster \
--region=${REGION} \
--jar=file:///home/username/sessionalize-logs-1.0.jar
דוגמאות לפעולות אתחול
סקריפטים של פעולות אתחול שנמצאים בשימוש תכוף וסקריפטים לדוגמה אחרים נמצאים ב-gs://goog-dataproc-initialization-actions-<REGION>, קטגוריות ציבוריות אזוריות של Cloud Storage, ובמאגר GitHub.
כדי לתרום סקריפט, קוראים את המסמך CONTRIBUTING.md ואז שולחים בקשת משיכה (pull request).
רישום ביומן
הפלט מההפעלה של כל פעולת אתחול מתועד ביומן של כל מכונה ב-/var/log/dataproc-initialization-script-X.log, כאשר X הוא האינדקס מבוסס האפס של כל סקריפט פעולת אתחול עוקב. לדוגמה, אם לאשכול יש שתי פעולות אתחול, הפלט יתועד ב-/var/log/dataproc-initialization-script-0.log וב-/var/log/dataproc-initialization-script-1.log.