כשיוצרים אשכול Dataproc, אפשר לציין פעולות אתחול בקובצי הפעלה או בסקריפטים ש-Dataproc יפעיל בכל הצמתים באשכול Dataproc מיד אחרי שהאשכול יוגדר. פעולות אתחול מגדירות לרוב תלות בין משימות, כמו התקנת חבילות 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.משתמשים בנתיבים מוחלטים בפעולות אתחול.
משתמשים בשורת shebang בפעולות אתחול כדי לציין איך צריך לפרש את הסקריפט (לדוגמה,
#!/bin/bashאו#!/usr/bin/python).אם פעולת אתחול מסתיימת עם קוד יציאה שאינו אפס, פעולת יצירת האשכול תדווח על סטטוס ERROR. כדי לנפות באגים בפעולת האתחול, משתמשים ב-SSH כדי להתחבר למכונות הווירטואליות באשכול, ואז בודקים את היומנים. אחרי שפותרים את הבעיה בפעולת האתחול, אפשר למחוק את האשכול ואז ליצור אותו מחדש.
אם יוצרים אשכול Dataproc עם כתובות IP פנימיות בלבד, ניסיונות לגשת אל
github.comדרך האינטרנט בפעולת אתחול ייכשלו, אלא אם הגדרתם מסלולים להפניית התעבורה דרך Cloud NAT או Cloud VPN. אם אין גישה לאינטרנט, אפשר להפעיל את הגישה הפרטית ל-Google ולמקם את יחסי התלות של העבודות ב-Cloud Storage. צמתי האשכול יכולים להוריד את יחסי התלות מ-Cloud Storage מכתובות IP פנימיות.אפשר להשתמש בתמונות בהתאמה אישית של Dataproc במקום בפעולות הפעלה כדי להגדיר תלות בין עבודות.
עיבוד אתחול:
- קבוצות של תמונות לפני גרסה 2.0:
- Master: כדי לאפשר לפעולות אתחול לפעול ב-masters כדי לכתוב קבצים ל-HDFS, פעולות האתחול של צומת ה-master לא מתחילות עד שניתן לכתוב ל-HDFS (עד ש-HDFS יוצא ממצב בטוח ולפחות שני צמתים מסוג HDFS DataNode מצטרפים).
- Worker: אם מגדירים את
dataproc:dataproc.worker.custom.init.actions.modecluster property ל-RUN_BEFORE_SERVICES, כל worker מריץ את פעולות האתחול שלו לפני שהוא מתחיל את ה-daemon של HDFS datanode ושל YARN nodemanager. מכיוון ש-Dataproc לא מפעיל פעולות אתחול של master עד שניתן לכתוב ב-HDFS, ונדרשים 2 שדים של צומתי נתונים של HDFS כדי שניתן יהיה לכתוב ב-HDFS, הגדרת המאפיין הזה עשויה להאריך את זמן יצירת האשכול.
מקבצי תמונות בגרסה 2.0 ואילך:
- Master: פעולות ההגדרה של צומת ה-Master עשויות לפעול לפני שניתן לכתוב ב-HDFS. אם מריצים פעולות אתחול שמכינות קבצים ב-HDFS או תלויות בזמינות של שירותים שתלויים ב-HDFS, כמו Ranger, צריך להגדיר את
dataproc.master.custom.init.actions.modeמאפיין האשכול לערךRUN_AFTER_SERVICES. הערה: הגדרת המאפיין הזה עלולה להאריך את זמן יצירת האשכול. כדאי לעיין בהסבר על עיכוב ביצירת אשכול ל-workers של אשכול תמונות בגרסה קודמת ל-2.0. לכן, מומלץ להשתמש בהגדרה הזו רק כשצריך (ככלל, כדאי להסתמך על הגדרת ברירת המחדלRUN_BEFORE_SERVICESשל המאפיין הזה). - Worker:
dataproc:dataproc.worker.custom.init.actions.modeמאפיין האשכול מוגדר כ-RUN_BEFORE_SERVICESואי אפשר להעביר אותו לאשכול כשיוצרים את האשכול (אי אפשר לשנות את הגדרת המאפיין). כל תהליך worker מריץ את פעולות האתחול שלו לפני שהוא מתחיל את השדים (daemon) של צומת הנתונים של HDFS ומנהל הצמתים של YARN. מכיוון ש-Dataproc לא מחכה עד שניתן לכתוב ב-HDFS לפני הפעלת פעולות אתחול של הצומת הראשי, פעולות האתחול של הצומת הראשי ושל צומת העובד מופעלות במקביל.
- Master: פעולות ההגדרה של צומת ה-Master עשויות לפעול לפני שניתן לכתוב ב-HDFS. אם מריצים פעולות אתחול שמכינות קבצים ב-HDFS או תלויות בזמינות של שירותים שתלויים ב-HDFS, כמו Ranger, צריך להגדיר את
המלצות:
- אפשר להשתמש במטא-נתונים כדי לקבוע את התפקיד של צומת מסוים, וכך להפעיל באופן מותנה פעולת אתחול בצמתים (ראו שימוש במטא-נתונים של אשכול).
- כדי לשמור על יציבות, יוצרים עותק של פעולת אתחול בקטגוריה ב-Cloud Storage (ראו איך משתמשים בפעולות אתחול).
- מוסיפים ניסיונות חוזרים כשמורידים מהאינטרנט כדי לייצב את פעולת האתחול.
- קבוצות של תמונות לפני גרסה 2.0:
שימוש בפעולות אתחול
אפשר לציין פעולות לאתחול אשכולות בלי קשר לשיטה שבה יוצרים את האשכול:
- דרך מסוף Google Cloud
- באמצעות ה-CLI של gcloud
- באופן פרוגרמטי באמצעות API clusters.create של Dataproc (ראו NodeInitializationAction)
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 דקות. אם קובץ ההפעלה או הסקריפט של האתחול לא מסתיימים עד סוף תקופת הזמן הקצובה לתפוגה, Dataproc מבטל את פעולת האתחול. -
משתמשים ב
dataproc:dataproc.worker.custom.init.actions.modecluster property כדי להריץ את פעולת האתחול על העובדים הראשיים לפני הפעלת השדים (daemon) של 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"
}
]
}
}
המסוף
העברת ארגומנטים לפעולות אתחול
Dataproc מגדיר ערכי מטא-נתונים מיוחדים למופעים שפועלים באשכולות. אפשר להגדיר מטא-נתונים בהתאמה אישית כדי להעביר ארגומנטים לפעולות אתחול.
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
Stage binaries
תרחיש נפוץ לאתחול אשכול הוא העברה של קובצי הפעלה של משימות לאשכול, כדי שלא יהיה צורך להעביר את קובצי ההפעלה בכל פעם שמגישים משימה. לדוגמה, נניח שסקריפט האתחול הבא מאוחסן ב-gs://my-bucket/download-job-jar.sh, מיקום של קטגוריית Cloud Storage:
#!/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
Dataproc יפעיל את הסקריפט הזה בכל הצמתים, וכתוצאה מהלוגיקה של בחירת הצמתים בסקריפט, יוריד את קובץ ה-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 ואז לשלוח בקשת משיכה.
רישום ביומן
הפלט מהביצוע של כל פעולת אתחול נרשם ביומן לכל מופע ב-/var/log/dataproc-initialization-script-X.log, כאשר X הוא האינדקס מבוסס-אפס של כל סקריפט עוקב של פעולת אתחול. לדוגמה, אם באשכול יש שתי פעולות אתחול, הפלט יתועד בקובץ /var/log/dataproc-initialization-script-0.log ובקובץ /var/log/dataproc-initialization-script-1.log.
המאמרים הבאים
מידע נוסף על פעולות ההפעלה של GitHub