יצירת קובץ אימג' של קונטיינר בהתאמה אישית ב-Google Kubernetes Engine

אתם יכולים לציין קובץ אימג' של קונטיינר מותאם אישית לשימוש ב-Managed Service for Apache Spark ב-GKE . קובץ האימג' של הקונטיינר המותאם אישית צריך להשתמש באחד מקובצי הבסיס של Spark ב-Managed Service for Apache Spark ב-GKE.

שימוש בקובץ אימג' מותאם אישית של קונטיינר

כדי להשתמש ב-Managed Service for Apache Spark בקובץ אימג' של קונטיינר בהתאמה אישית ב-GKE, צריך להגדיר את spark.kubernetes.container.image property כשיוצרים אשכול וירטואלי של Managed Service for Apache Spark ב-GKE או כששולחים עבודת Spark לאשכול.

  • דוגמה ליצירת אשכול ב-CLI של gcloud:
    gcloud dataproc clusters gke create "${DP_CLUSTER}" \
        --properties=spark:spark.kubernetes.container.image=custom-image \
        ... other args ...
    
  • דוגמה לשליחת משימה באמצעות ה-CLI של gcloud:
    gcloud dataproc jobs submit spark \
        --properties=spark.kubernetes.container.image=custom-image \
        ... other args ...
    

הגדרות ודרישות לגבי קובצי אימג' של קונטיינר בהתאמה אישית

תמונות בסיס

אפשר להשתמש בכלים של docker כדי ליצור Docker בהתאמה אישית על סמך אחד מקובצי הבסיס של Spark שפורסמו ב-Managed Service for Apache Spark ב-GKE.

משתמש במאגר

‫Managed Service for Apache Spark on GKE מפעיל קונטיינרים של Spark כמשתמש Linux‏ spark עם מזהה משתמש (UID) 1099 ומזהה קבוצה (GID) 1099. שימוש ב-UID וב-GID להרשאות של מערכת הקבצים. לדוגמה, אם מוסיפים קובץ jar בנתיב /opt/spark/jars/my-lib.jar בתמונה כתלות בעומס העבודה, צריך לתת למשתמש spark הרשאת קריאה לקובץ.

רכיבים

  • ‫Java: משתנה הסביבה JAVA_HOME מצביע על המיקום של התקנת Java. ערך ברירת המחדל הנוכחי הוא /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64, אבל הוא עשוי להשתנות (מידע עדכני זמין בהערות הגרסה של Managed Service for Apache Spark).

    • אם אתם מבצעים התאמה אישית של סביבת Java, חשוב לוודא שהמשתנה JAVA_HOME מוגדר למיקום הנכון ושהמשתנה PATH כולל את הנתיב לקבצים הבינאריים.
  • ‫Python: ‫Managed Service for Apache Spark on GKE base Spark images יש Miniconda3 מותקן ב-/opt/conda. CONDA_HOME מפנה למיקום הזה, ${CONDA_HOME}/bin נכלל ב-PATH, והערך של PYSPARK_PYTHON הוא ${CONDA_HOME}/python.

    • אם מבצעים התאמה אישית של Conda, צריך לוודא ש-CONDA_HOME מצביע על ספריית הבית של Conda ,${CONDA_HOME}/bin כלול ב-PATH, ו-PYSPARK_PYTHON מוגדר ל-${CONDA_HOME}/python.

    • אתם יכולים להתקין, להסיר ולעדכן חבילות בסביבת הבסיס שמוגדרת כברירת מחדל, או ליצור סביבה חדשה. עם זאת, מומלץ מאוד שהסביבה תכלול את כל החבילות שהותקנו בסביבת הבסיס של קובץ אימג' של קונטיינר.

    • אם מוסיפים מודולים של Python, כמו סקריפט Python עם פונקציות שירות, לקובץ אימג' של קונטיינר, צריך לכלול את ספריות המודולים ב-PYTHONPATH.

  • ‫Spark:‏ Spark מותקן ב-/usr/lib/spark, ו-SPARK_HOME מצביע על המיקום הזה. אי אפשר להתאים אישית את Spark. אם הוא ישתנה, תמונת מאגר התגים תידחה או שהיא לא תפעל בצורה תקינה.

    • משימות: אפשר להתאים אישית את יחסי התלות של משימות Spark. ‫SPARK_EXTRA_CLASSPATH מגדיר את נתיב המחלקה הנוסף לתהליכי Spark JVM. המלצה: כדאי להוסיף את קובצי ה-JAR מתחת ל-/opt/spark/jars ולהגדיר את SPARK_EXTRA_CLASSPATH ל-/opt/spark/jars/*.

      אם מטמיעים את קובץ ה-JAR של המשימה בתמונה, ספריית ברירת המחדל המומלצת היא /opt/spark/job. כששולחים את העבודה, אפשר להפנות אליה באמצעות נתיב מקומי, לדוגמה, file:///opt/spark/job/my-spark-job.jar.

    • חיבור ל-Cloud Storage: החיבור ל-Cloud Storage מותקן בכתובת /usr/lib/spark/jars.

    • כלי עזר: כדי להפעיל את Spark, צריך את חבילות כלי העזר procps ו-tini. כלי השירות האלה כלולים בתמונות הבסיסיות של Spark, כך שלא צריך להתקין אותם מחדש בתמונות בהתאמה אישית.

    • נקודת כניסה: ‫Managed Service for Apache Spark ב-GKE מתעלם מכל שינוי שנעשה בפרימיטיבים ENTRYPOINT ו-CMD בקובץ אימג' של קונטיינר.

    • סקריפטים של אתחול: אפשר להוסיף סקריפט אופציונלי של אתחול ב-/opt/init-script.sh. סקריפט אתחול יכול להוריד קבצים מ-Cloud Storage, להפעיל שרת proxy בתוך המאגר, לקרוא לסקריפטים אחרים ולבצע משימות אחרות של הפעלה.

      סקריפט נקודת הכניסה קורא לסקריפט ההפעלה עם כל הארגומנטים של שורת הפקודה ($@) לפני הפעלת מנהל ההתקנים של Spark, מנהל הביצוע של Spark ותהליכים אחרים. סקריפט ההפעלה יכול לבחור את סוג תהליך Spark על סמך הארגומנט הראשון ($1): ערכים אפשריים כוללים spark-submit עבור מאגרי driver ו-executor עבור מאגרי executor.

  • הגדרות: הגדרות Spark נמצאות בתיקייה /etc/spark/conf. משתנה הסביבה SPARK_CONF_DIR מצביע על המיקום הזה.

    אל תתאימו אישית את הגדרות Spark בקובץ אימג' של קונטיינר. במקום זאת, צריך לשלוח את המאפיינים דרך Managed Service for Apache Spark on GKE API מהסיבות הבאות:

    • חלק מהמאפיינים, כמו גודל הזיכרון של מנהל הביצוע, נקבעים בזמן הריצה ולא בזמן בניית תמונת הקונטיינר. המערכת צריכה להוסיף אותם באמצעות השירות המנוהל של Apache Spark ב-GKE.
    • ב-Managed Service for Apache Spark on GKE יש הגבלות על המאפיינים שמשתמשים מספקים. ‫Managed Service for Apache Spark on GKE מעלה הגדרות מ- configMap אל /etc/spark/conf בקונטיינר, ומבטל את ההגדרות שמוטמעות בתמונה.

תמונות בסיסיות של Spark

‫Managed Service for Apache Spark תומך בקובצי האימג' הבאים של קונטיינרים של Spark:

  • ‫Spark 3.5: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.2

דוגמה ליצירת קובץ אימג' מותאם אישית של קונטיינר

קובץ Docker לדוגמה

FROM us-central1-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.0:latest

# Change to root temporarily so that it has permissions to create dirs and copy
# files.
USER root

# Add a BigQuery connector jar.
ENV SPARK_EXTRA_JARS_DIR=/opt/spark/jars/
ENV SPARK_EXTRA_CLASSPATH='/opt/spark/jars/*'
RUN mkdir -p "${SPARK_EXTRA_JARS_DIR}" \
    && chown spark:spark "${SPARK_EXTRA_JARS_DIR}"
COPY --chown=spark:spark \
    spark-bigquery-with-dependencies_2.12-0.22.2.jar "${SPARK_EXTRA_JARS_DIR}"

# Install Cloud Storage client Conda package.
RUN "${CONDA_HOME}/bin/conda" install google-cloud-storage

# Add a custom Python file.
ENV PYTHONPATH=/opt/python/packages
RUN mkdir -p "${PYTHONPATH}"
COPY test_util.py "${PYTHONPATH}"

# Add an init script.
COPY --chown=spark:spark init-script.sh /opt/init-script.sh

# (Optional) Set user back to `spark`.
USER spark

יוצרים את קובץ האימג' של הקונטיינר

מריצים את הפקודות הבאות בספריית Dockerfile

  1. מגדירים את התמונה (לדוגמה: us-central1-docker.pkg.dev/my-project/spark/spark-test-image:latest) ועוברים לספריית ה-build.
    IMAGE=custom container image \
        BUILD_DIR=$(mktemp -d) \
        cd "${BUILD_DIR}"
    
  2. מורידים את המחבר ל-BigQuery.

    gcloud storage cp \
        gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .
    

  3. יוצרים קובץ לדוגמה ב-Python.

    cat >test_util.py <<'EOF'
    def hello(name):
      print("hello {}".format(name))
    def read_lines(path):   with open(path) as f:     return f.readlines() EOF

  4. יוצרים סקריפט הפעלה לדוגמה.

    cat >init-script.sh <<EOF
    echo "hello world" >/tmp/init-script.out
    EOF
    

  5. מבצעים build ודוחפים את האימג'.

    docker build -t "${IMAGE}" . && docker push "${IMAGE}"