משימות PySpark ב-Dataproc מורצות על ידי רכיב תרגום של 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 בתמונות Dataproc
בקטעים הבאים מתוארות סביבות Python עבור גרסאות שונות של תמונות Dataproc.
גרסה 1.5 של תמונת Dataproc
Miniconda3 מותקן באשכולות Dataproc 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'
גרסת תמונה של Dataproc 2.x
conda מותקן באשכולות Dataproc מגרסה 2.x. מפרש Python3 שמוגדר כברירת מחדל נמצא במכונת ה-VM בנתיב /opt/conda/default/bin. בדפים הבאים מפורטת גרסת Python שכלולה בגרסאות של תמונות Dataproc:
מתורגמן 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 לא זמין באשכולות Dataproc 2.0.
איך למנוע בעיות בהורדת חבילות
כשמתקינים חבילות מותאמות אישית של conda ו-pip (ראו מאפייני אשכול שקשורים ל-conda), הצמתים של אשכול Dataproc מורידים חבילות ממאגרי Python ציבוריים חיצוניים.
כדי להימנע מכשלים ביצירת אשכול בגלל חוסר זמינות של מאגרי Python ציבוריים, כדאי ליצור תמונה מותאמת אישית של Dataproc או להעלות את התלות לקטגוריה של 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.
יש שתי דרכים בלעדיות להתאמה אישית של סביבת conda כשיוצרים אשכול Dataproc:
משתמשים במאפיין
dataproc:conda.env.config.uricluster כדי ליצור ולהפעיל סביבת conda חדשה באשכול. אומשתמשים במאפייני האשכול
dataproc:conda.packagesו-dataproc:pip.packagesכדי להוסיף את החבילותcondaו-pip, בהתאמה, לסביבתcondabaseבאשכול.
מאפייני אשכול שקשורים ל-conda
dataproc:conda.env.config.uri: הנתיב המוחלט לקובץ התצורה של סביבת conda בפורמט YAML שנמצא ב-Cloud Storage. הקובץ הזה ישמש ליצירה ולהפעלה של סביבתcondaחדשה באשכול.לדוגמה:
מקבלים או יוצרים קובץ תצורה של conda
environment.yaml. אפשר ליצור את הקובץ באופן ידני, להשתמש בקובץ קיים או לייצא סביבת conda קיימת לקובץenvironment.yamlבאמצעות הפקודה הבאה:conda env export --name=env-name > environment.yaml
מעתיקים את קובץ התצורה לקטגוריה של Cloud Storage.
gcloud storage cp environment.yaml gs://bucket-name/environment.yaml
יוצרים את האשכול ומצביעים על קובץ התצורה של הסביבה ב-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 ...