פעולות אתחול

כשיוצרים אשכול של Managed Service for Apache Spark, אפשר לציין פעולות אתחול בקובצי הפעלה או בסקריפטים ש-Managed Service for Apache Spark יפעיל בכל הצמתים באשכול של Managed Service for Apache Spark מיד אחרי שהאשכול יוגדר. פעולות אתחול מגדירות לרוב תלות בין משימות, כמו התקנת חבילות Python, כדי שאפשר יהיה לשלוח משימות לאשכול בלי להתקין תלויות כשהמשימות מופעלות.

אפשר למצוא סקריפטים לדוגמה של פעולות אתחול במיקומים הבאים: הערה: Google לא תומכת בדוגמאות האלה.

שיקולים חשובים והנחיות

  • אל תיצרו אשכולות לייצור שמפנים לפעולות אתחול שנמצאות בקטגוריות ציבוריות gs://goog-dataproc-initialization-actions-REGION. הסקריפטים האלה מסופקים כהטמעות לדוגמה. הם מסונכרנים עם שינויים שמתבצעים במאגר ב-GitHub, ועדכונים בסקריפטים האלה עלולים לשבש את יצירת האשכול. במקום זאת, מעתיקים את פעולת האתחול מהקטגוריה הציבורית לתיקייה של קטגוריה עם ניהול גרסאות ב-Cloud Storage, כמו בדוגמה הבאה:

    REGION=COMPUTE_REGION
    gcloud 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.sh
    
    לאחר מכן, יוצרים את האשכול על ידי הפניה להעתקה ב-Cloud Storage:
    gcloud 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).

  • משתמשים בסיומי שורות בסגנון 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: כדי לאפשר פעולות אתחול שפועלות ב-masters לכתוב קבצים ל-HDFS, פעולות האתחול של צומת ה-master לא מתחילות עד שניתן לכתוב ל-HDFS (עד ש-HDFS יוצא ממצב בטוח ולפחות שני צמתים של HDFS DataNode הצטרפו).
      • Worker: אם מגדירים את dataproc:dataproc.worker.custom.init.actions.mode cluster property ל-RUN_BEFORE_SERVICES, כל worker מריץ את פעולות האתחול שלו לפני שהוא מתחיל את ה-HDFS datanode ואת ה-YARN nodemanager daemons. Managed Service for Apache Spark לא מפעיל פעולות לאתחול של מאסטר עד שניתן לכתוב ב-HDFS, וזה קורה רק כששני דימונים של צומתי נתונים של HDFS פועלים. לכן, הגדרת המאפיין הזה עלולה להאריך את זמן יצירת האשכול.
    • מקבצי תמונות ברמה 2.0 ומעלה:

      • ראשי: פעולות ההגדרה של צומת ראשי עשויות לפעול לפני שניתן לכתוב ב-HDFS. אם מריצים פעולות אתחול שמכינות קבצים ב-HDFS או שמסתמכות על הזמינות של שירותים שתלויים ב-HDFS, כמו Ranger, צריך להגדיר את dataproc.master.custom.init.actions.mode מאפיין האשכול לערך RUN_AFTER_SERVICES. הערה: הגדרת המאפיין הזה עלולה להאריך את זמן יצירת האשכול. כדאי לעיין בהסבר על עיכוב ביצירת אשכול במקרים של עובדי אשכולות של תמונות מגרסה קודמת ל-2.0. לכן, מומלץ להשתמש בהגדרה הזו רק כשצריך (ככלל, כדאי להסתמך על הגדרת ברירת המחדל RUN_BEFORE_SERVICES של המאפיין הזה).
      • Worker: dataproc:dataproc.worker.custom.init.actions.mode מאפיין האשכול מוגדר כ-RUN_BEFORE_SERVICES ואי אפשר להעביר אותו לאשכול כשיוצרים את האשכול (אי אפשר לשנות את הגדרת המאפיין). כל תהליך worker מריץ את פעולות האתחול שלו לפני שהוא מתחיל את תהליכי ה-daemon של HDFS datanode ו-YARN nodemanager. מכיוון ש-Managed Service for Apache Spark לא ממתין עד שניתן לכתוב ב-HDFS לפני הפעלת פעולות אתחול של השרת הראשי, פעולות האתחול של השרת הראשי ושל העובד מופעלות במקביל.
    • המלצות:

      • אפשר להשתמש במטא-נתונים כדי לקבוע את התפקיד של צומת מסוים, וכך להפעיל באופן מותנה פעולת אתחול בצמתים (ראו שימוש במטא-נתונים של אשכול).
      • כדי לשמור על יציבות, יוצרים עותק של פעולת אתחול בקטגוריה של Cloud Storage (ראו איך משתמשים בפעולות אתחול).
      • כדי לייצב את פעולת האתחול, מוסיפים ניסיונות חוזרים כשמורידים מהאינטרנט.

שימוש בפעולות אתחול

אפשר לציין פעולות לאתחול אשכולות בלי קשר לשיטה שבה יוצרים את האשכול:

מסוףGoogle Cloud

  • פותחים את הדף יצירת אשכול.
  • לוחצים על הגדרה נוספת כדי להרחיב את הקטע.
  • עורכים את התאמה אישית ואחר.
  • בחלונית שנפתחת, לוחצים על הוספת פעולות אתחול, ואז מזינים את המיקום של פעולת אתחול ב-Cloud Storage או בוחרים אותו.
  • ‫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 מאפיין האשכול כדי להריץ את פעולת האתחול בעובדים הראשיים לפני שמפעילים את מנהל הצמתים ואת שדי הנתונים.

    ‫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"
          }
        ]
      }
    }
    
    Google Cloud

    העברת ארגומנטים לפעולות אתחול

    ‫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
    

    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
    

    ‫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 ואז לשלוח בקשת משיכה.

    רישום ביומן

    הפלט מהביצוע של כל פעולת אתחול נרשם ביומן לכל מופע ב-/var/log/dataproc-initialization-script-X.log, כאשר X הוא האינדקס מבוסס-אפס של כל סקריפט עוקב של פעולת אתחול. לדוגמה, אם באשכול יש שתי פעולות אתחול, הפלט יתועד בקובץ /var/log/dataproc-initialization-script-0.log ובקובץ /var/log/dataproc-initialization-script-1.log.

    המאמרים הבאים

    מידע נוסף על פעולות אתחול של GitHub