הגדרת סביבת Python

משימות PySpark ב-Managed Service for Apache Spark מורצות על ידי מתורגמן Python באשכול. קוד העבודה צריך להיות תואם בזמן הריצה לגרסה ולתלות של מתורגמן Python.

בדיקת גרסת המתרגם והמודולים

התוכנית לדוגמה הבאה check_python_env.py בודקת את משתמש Linux שמריץ את העבודה, את רכיב התרגום ב-Python ואת המודולים הזמינים.

import getpass
import importlib.util
import sys

print(f'This job is running as "{getpass.getuser()}".')
print(sys.executable, sys.version_info)
for package in sys.argv[1:]:
  print(importlib.util.find_spec(package))

מריצים את התוכנית:

REGION=region
gcloud dataproc jobs submit pyspark check_python_env.py \
    --cluster=my-cluster \
    --region=${REGION} \
    -- pandas scipy

פלט לדוגמה:

This job is running as "root".
/opt/conda/default/bin/python sys.version_info(major=3, minor=11, micro=8, releaselevel='final', serial=0)
ModuleSpec(name='pandas', loader=<_frozen_importlibexternal.SourceFileLoader object at 0x7f8b9c0a3d90>, origin='/opt/conda/default/lib/python3.11/site-packages/pandas/init_.py', submodule_search_locations=['/opt/conda/default/lib/python3.11/site-packages/pandas'])
ModuleSpec(name='scipy', loader=<_frozen_importlibexternal.SourceFileLoader object at 0x7f8b9c0a3e50>, origin='/opt/conda/default/lib/python3.11/site-packages/scipy/init_.py', submodule_search_locations=['/opt/conda/default/lib/python3.11/site-packages/scipy'])

סביבות Python של תמונות Managed Service for Apache Spark

בקטעים הבאים מתוארות סביבות Python לאשכולות נתמכים של גרסאות תמונות של Managed Service for Apache Spark.

גרסה 2.x של תמונת Managed Service for Apache Spark

Conda (או micromamba בתמונות 2.3) מותקן באשכולות של Managed Service for Apache Spark 2.x. מפרש Python 3 שמוגדר כברירת מחדל נמצא במכונת ה-VM בנתיב /opt/conda/default/bin. בדפים הבאים מפורטת גרסת Python שכלולה בגרסאות תמונות נתמכות של Managed Service for Apache Spark 2.x:

מתורגמן Python שאינו ברירת המחדל ממערכת ההפעלה זמין בנתיב /usr/bin/.

אפשר להתקין חבילות של conda ו-pip בסביבת base או להגדיר סביבת conda משלכם באשכול באמצעות מאפייני אשכול שקשורים ל-conda.

הערה לגבי ערוצי Conda: גרסאות התמונות של Managed Service for Apache Spark שמוגדרות כברירת מחדל 2.1, 2.2 ו-2.3 לא כוללות ערוצי חבילות Conda שהוגדרו מראש (כמו defaults או conda-forge) ב-.condarc (אפשר לעיין בהערת הגרסה מ-4 בספטמבר 2026). העברת שמות חבילות ללא קידומת אל dataproc:conda.packages או הפעלת conda install PACKAGE ללא ציון ערוץ נכשלת עם CondaValueError: No channels available to install from או PackagesNotFoundError.

כדי להתקין חבילות של Conda, צריך לציין במפורש את הערוץ:

  • כשמשתמשים במאפיין dataproc:conda.packages, צריך להשתמש בפורמט CHANNEL::PACKAGE==VERSION (לדוגמה, dataproc:conda.packages=conda-forge::pip==24.0).
  • כשמריצים את conda install בשורת הפקודה, מעבירים את ה-flag‏ -c (או --channel) (לדוגמה, conda install PACKAGES -c conda-forge).

דוגמה:

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=2.3 \
    --region=${REGION} \
    --properties=^#^dataproc:conda.packages='conda-forge::pytorch==2.1.0,conda-forge::coverage==6.5.0'#dataproc:pip.packages='tokenizers==0.15.0,datasets==2.16.1'

גרסה 3.0 של תמונת Managed Service for Apache Spark

‫Python 3 מותקן באשכולות של Managed Service for Apache Spark 3.0. בתמונות 3.0, ‏ Pixi מותקן כחלק מהתקנת Python ומשמש להתקנת חבילות Python במקום Conda.

איך למנוע בעיות בהורדת חבילות

כשמתקינים חבילות מותאמות אישית של conda ו-pip (ראו מאפיינים של אשכול שקשורים ל-conda), הצמתים של אשכול Managed Service for Apache Spark מורידים חבילות ממאגרי Python ציבוריים חיצוניים. כדי להימנע מכשלים ביצירת אשכולות בגלל חוסר זמינות של מאגרי Python ציבוריים, כדאי ליצור תמונה מותאמת אישית של Managed Service for Apache Spark או להעלות את התלות לקטגוריית Cloud Storage (ראו הורדת תלויות באמצעות אשכולות עם כתובות IP פנימיות בלבד).

בחירת מתורגמן Python לעבודה

אם כמה רכיבי תרגום של Python מותקנים באשכול, המערכת מריצה את /etc/profile.d/effective-python.sh, שמייצא את משתנה הסביבה PYSPARK_PYTHON כדי לבחור את רכיב התרגום של Python שמוגדר כברירת מחדל לעבודות PySpark. אם אתם צריכים מפרש Python שאינו ברירת המחדל עבור משימת PySpark, כשאתם שולחים את המשימה לאשכול, צריך להגדיר את המאפיינים spark.pyspark.python ו-spark.pyspark.driver.python לנתיב או לגרסה של Python שנדרשים (לדוגמה, ‎/usr/bin/python3 או python3.11).

דוגמה:

REGION=region
gcloud dataproc jobs submit pyspark check_python_env.py \
    --cluster=my-cluster \
    --region=${REGION} \
    --properties="spark.pyspark.python=/usr/bin/python3,spark.pyspark.driver.python=/usr/bin/python3"

‫Python עם sudo

אם מתחברים לצומת של אשכול באמצעות SSH, כשמריצים את הפקודה sudo python --version, גרסת Python שמוצגת יכולה להיות שונה מהגרסה שמוצגת על ידי python --version. ההבדל בגרסאות יכול לקרות כי sudo משתמש ב-Python /usr/bin/python של המערכת כברירת מחדל, ולא מפעיל את /etc/profile.d/effective-python.sh כדי לאתחל את סביבת Python. כדי לקבל חוויה עקבית כשמשתמשים ב-sudo, מאתרים את נתיב Python שמוגדר ב-/etc/profile.d/effective-python.sh, ואז מריצים את הפקודה env כדי להגדיר את PATH לנתיב Python הזה. לדוגמה:

sudo env PATH=/opt/conda/default/bin:${PATH} python --version

שימוש במאפייני אשכול שקשורים ל-conda

אתם יכולים להתאים אישית את סביבת conda במהלך יצירת האשכול באמצעות מאפייני אשכול שקשורים ל-conda.

יש שתי דרכים בלעדיות הדדית להתאמה אישית של סביבת conda כשיוצרים אשכול Managed Service for Apache Spark:

  1. משתמשים במאפיין dataproc:conda.env.config.uri cluster כדי ליצור ולהפעיל סביבת conda חדשה באשכול. או

  2. משתמשים במאפייני האשכול dataproc:conda.packages ו-dataproc:pip.packages כדי להוסיף חבילות conda ו-pip, בהתאמה, לסביבת conda base באשכול.

מאפייני אשכול שקשורים ל-conda

  • dataproc:conda.env.config.uri: הנתיב המוחלט לקובץ ההגדרות של סביבת conda בפורמט YAML שנמצא ב-Cloud Storage. הקובץ הזה משמש ליצירה ולהפעלה של סביבת conda חדשה באשכול. מכיוון שתמונות ברירת המחדל לא כוללות ערוצי Conda שהוגדרו מראש, צריך לוודא שבקובץ environment.yaml מפורטים במפורש ערוצי החבילות הנדרשים (כמו conda-forge) בקטע channels.

    דוגמה:

    1. מקבלים או יוצרים קובץ תצורה של conda environment.yaml. אפשר ליצור את הקובץ באופן ידני, להשתמש בקובץ קיים או לייצא סביבת conda קיימת לקובץ environment.yaml באמצעות הפקודה הבאה:

      conda env export --name=env-name > environment.yaml
      

    2. מעתיקים את קובץ ההגדרות לקטגוריה של Cloud Storage.

      gcloud storage cp environment.yaml gs://bucket-name/environment.yaml
      

    3. יוצרים את האשכול ומצביעים על קובץ הגדרות הסביבה ב-Cloud Storage.

      REGION=region
      gcloud dataproc clusters create cluster-name \
          --region=${REGION} \
          --properties='dataproc:conda.env.config.uri=gs://bucket-name/environment.yaml' \
          ... other flags ...
      

  • dataproc:conda.packages: רשימה של חבילות conda עם ערוצים וגרסאות ספציפיים להתקנה בסביבת הבסיס, בפורמט CHANNEL::PACKAGE==VERSION (לדוגמה, conda-forge::pkg1==v1,conda-forge::pkg2==v2...). אם conda לא מצליח לפתור קונפליקטים עם חבילות קיימות בסביבת הבסיס, החבילות שגורמות לקונפליקט לא יותקנו.

    הערות:

    • מכיוון שגרסאות ברירת המחדל של תמונות של Managed Service for Apache Spark‏ 2.1,‏ 2.2 ו-2.3 לא כוללות ערוצי Conda שהוגדרו מראש ב-.condarc, צריך להוסיף לכל שם חבילה את הקידומת של הערוץ שלה (למשל conda-forge::). העברה של שמות חבילות ללא קידומת תיכשל עם CondaValueError: No channels available to install from או PackagesNotFoundError.

    • אי אפשר להשתמש במאפייני האשכול dataproc:conda.packages ו-dataproc:pip.packages עם מאפיין האשכול dataproc:conda.env.config.uri.

    • כשמציינים כמה חבילות (מופרדות בפסיק), צריך לציין תו מפריד חלופי (ראו מאפיין האשכול Formatting). בדוגמה הבאה, התו '#' מוגדר כתו המפריד להעברת כמה שמות של חבילות, מופרדים בפסיקים, למאפיין dataproc:conda.packages.

    דוגמה:

    REGION=region
    gcloud dataproc clusters create cluster-name \
        --region=${REGION} \
        --properties='^#^dataproc:conda.packages=conda-forge::pytorch==2.1.0,conda-forge::coverage==6.5.0' \
        ... other flags ...
    

  • dataproc:pip.packages: רשימה של חבילות pip עם גרסאות ספציפיות להתקנה בסביבת הבסיס, בפורמט pkg1==v1,pkg2==v2.... ‫pip משדרג תלויות קיימות רק אם יש צורך בכך. קונפליקטים עלולים לגרום לחוסר עקביות בסביבה.

    הערות:

    • אי אפשר להשתמש במאפייני האשכול dataproc:pip.packages ו-dataproc:conda.packages עם מאפיין האשכול dataproc:conda.env.config.uri.

    • כשמציינים כמה חבילות (מופרדות בפסיק), צריך לציין תו מפריד חלופי (ראו מאפיין האשכול Formatting). בדוגמה הבאה, התו '#' מצוין כתו המפריד להעברת כמה שמות של חבילות, מופרדים בפסיקים, למאפיין dataproc:pip.packages.

    דוגמה:

    REGION=region
    gcloud dataproc clusters create cluster-name \
        --region=${REGION} \
        --properties='^#^dataproc:pip.packages=tokenizers==0.15.0,datasets==2.16.1' \
        ... other flags ...
    
  • אתם יכולים להשתמש גם ב-dataproc:conda.packages וגם ב-dataproc:pip.packages כשאתם יוצרים אשכול.

    דוגמה:

    REGION=region
    gcloud dataproc clusters create cluster-name \
        --region=${REGION} \
        --image-version=2.3 \
        --properties=^#^dataproc:conda.packages='conda-forge::pytorch==2.1.0,conda-forge::coverage==6.5.0'#dataproc:pip.packages='tokenizers==0.15.0,datasets==2.16.1' \
        ... other flags ...