הגדרת סביבת Python

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

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

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

import getpass
import sys
import imp

print('This job is running as "{}".'.format(getpass.getuser()))
print(sys.executable, sys.version_info)
for package in sys.argv[1:]:
  print(imp.find_module(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".
('/usr/bin/python', sys.version_info(major=2, minor=7, micro=13, releaselevel='final', serial=0))
(None, '/usr/local/lib/python2.7/dist-packages/pandas', ('', '', 5))
(None, '/usr/local/lib/python2.7/dist-packages/scipy', ('', '', 5))

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

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

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

‫Miniconda3 מותקן באשכולות של Managed Service for Apache Spark 1.5. מפרש ברירת המחדל הוא Python 3.7, שנמצא במכונת ה-VM בנתיב /opt/conda/miniconda3/bin/python3.7. ‫Python 2.7 זמין גם בכתובת /usr/bin/python2.7.

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

כדי להשתמש ב-Python 2.7 כרכיב התרגום שמוגדר כברירת מחדל באשכולות 1.5, אל תשתמשו ברכיב Anaconda האופציונלי כשאתם יוצרים את האשכול. במקום זאת, אפשר להשתמש בפעולת האתחול של conda כדי להתקין את Miniconda2, ובמאפייני אשכול שקשורים ל-conda כדי להתקין חבילות של conda ו-pip בסביבת base, או להגדיר סביבת conda משלכם באשכול.

דוגמה

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.5 \
    --region=${REGION} \
    --metadata='MINICONDA_VARIANT=2' \
    --metadata='MINICONDA_VERSION=latest' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/conda/bootstrap-conda.sh \
    --properties=^#^dataproc:conda.packages='pytorch==1.0.1,visions==0.7.1'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.5.0'

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

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

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

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

דוגמה

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=2.0 \
    --region=${REGION} \
    --properties=^#^dataproc:conda.packages='pytorch==1.7.1,coverage==5.5'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.5.0'

הערה: Anaconda לא זמין באשכולות של Managed Service for Apache Spark 2.0.

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

כשמתקינים חבילות מותאמות אישית של 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 הנדרשת (לדוגמה, python2.7 או python3.6).

דוגמה

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

‫Python עם sudo

אם מתחברים לצומת של אשכול שמותקנים בו Miniconda או Anaconda באמצעות 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 הזה. דוגמה לאשכול של 1.5:

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

אתם יכולים להתאים אישית את סביבת 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 באשכול.

  • dataproc:conda.env.config.uri: הנתיב המוחלט לקובץ הגדרות YAML של סביבת conda שנמצא ב-Cloud Storage. הקובץ הזה ישמש ליצירה ולהפעלה של סביבת conda חדשה באשכול.

    לדוגמה:

    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חבילות עם גרסאות ספציפיות להתקנה בסביבת הבסיס, בפורמט pkg1==v1,pkg2==v2.... אם conda לא מצליח לפתור את הבעיות שנוצרות בגלל חבילות קיימות בסביבת הבסיס, החבילות הבעייתיות לא יותקנו.

    הערות:

    • אי אפשר להשתמש במאפייני האשכול 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=pytorch==1.7.1,coverage==5.5' \
    ... 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.10.1,datasets==1.4.1' \
    ... other flags ...
  • אפשר להשתמש גם ב-dataproc:conda.packages וגם ב-dataproc:pip.packages כשיוצרים אשכול.

    לדוגמה:

REGION=region
gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --image-version=1.5 \
    --metadata='MINICONDA_VARIANT=2' \
    --metadata='MINICONDA_VERSION=latest' \
    --properties=^#^dataproc:conda.packages='pytorch==1.7.1,coverage==5.5'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.4.1' \
    ... other flags ...