התאמה אישית של סביבת זמן הריצה של משימת Spark באמצעות Docker ב-YARN

התכונה Managed Service for Apache Spark Docker on YARN מאפשרת לכם ליצור קובץ אימג' של Docker ולהשתמש בו כדי להתאים אישית את סביבת זמן הריצה של משימת Spark. התמונה יכולה לכלול התאמות אישיות של יחסי תלות ב-Java, ב-Python וב-R, ושל קובץ ה-JAR של העבודה.

מגבלות

התכונה לא זמינה או לא נתמכת ב:

  • גרסאות תמונה של Managed Service for Apache Spark לפני גרסה 2.0.49 (לא זמין בתמונות 1.5)
  • משימות MapReduce (נתמכות רק במשימות Spark)
  • מצב לקוח Spark (נתמך רק במצב אשכול Spark)
  • אשכולות Kerberos: יצירת האשכול נכשלת אם יוצרים אשכול עם Docker ב-YARN ו-Kerberos מופעל.
  • התאמות אישיות של JDK,‏ Hadoop ו-Spark: נעשה שימוש ב-JDK,‏ Hadoop ו-Spark של המארח, ולא בהתאמות האישיות שלכם.

יצירת קובץ אימג' של Docker

השלב הראשון בהתאמה אישית של סביבת Spark הוא יצירת קובץ אימג' של Docker.

קובץ Docker

אפשר להשתמש בקובץ Dockerfile הבא כדוגמה, ולבצע בו שינויים והוספות בהתאם לצרכים שלכם.

FROM debian:10-slim

# Suppress interactive prompts.
ENV DEBIAN_FRONTEND=noninteractive

# Required: Install utilities required by Spark scripts.
RUN apt update && apt install -y procps tini

# Optional: Add extra jars.
ENV SPARK_EXTRA_JARS_DIR=/opt/spark/jars/
ENV SPARK_EXTRA_CLASSPATH='/opt/spark/jars/*'
RUN mkdir -p "${SPARK_EXTRA_JARS_DIR}"
COPY *.jar "${SPARK_EXTRA_JARS_DIR}"

# Optional: Install and configure Miniconda3.
ENV CONDA_HOME=/opt/miniconda3
ENV PYSPARK_PYTHON=${CONDA_HOME}/bin/python
ENV PYSPARK_DRIVER_PYTHON=${CONDA_HOME}/bin/python

ENV PATH=${CONDA_HOME}/bin:${PATH}
COPY Miniconda3-py39_4.10.3-Linux-x86_64.sh .
RUN bash Miniconda3-py39_4.10.3-Linux-x86_64.sh -b -p /opt/miniconda3 \
  && ${CONDA_HOME}/bin/conda config --system --set always_yes True \
  && ${CONDA_HOME}/bin/conda config --system --set auto_update_conda False \
  && ${CONDA_HOME}/bin/conda config --system --prepend channels conda-forge \
  && ${CONDA_HOME}/bin/conda config --system --set channel_priority strict

# Optional: Install Conda packages.
#
# The following packages are installed in the default image. It is strongly
# recommended to include all of them.
#
# Use mamba to install packages quickly.
RUN ${CONDA_HOME}/bin/conda install mamba -n base -c conda-forge \
    && ${CONDA_HOME}/bin/mamba install \
      conda \
      cython \
      fastavro \
      fastparquet \
      gcsfs \
      google-cloud-bigquery-storage \
      google-cloud-bigquery[pandas] \
      google-cloud-bigtable \
      google-cloud-container \
      google-cloud-datacatalog \
      google-cloud-dataproc \
      google-cloud-datastore \
      google-cloud-language \
      google-cloud-logging \
      google-cloud-monitoring \
      google-cloud-pubsub \
      google-cloud-redis \
      google-cloud-spanner \
      google-cloud-speech \
      google-cloud-storage \
      google-cloud-texttospeech \
      google-cloud-translate \
      google-cloud-vision \
      koalas \
      matplotlib \
      nltk \
      numba \
      numpy \
      openblas \
      orc \
      pandas \
      pyarrow \
      pysal \
      pytables \
      python \
      regex \
      requests \
      rtree \
      scikit-image \
      scikit-learn \
      scipy \
      seaborn \
      sqlalchemy \
      sympy \
      virtualenv

# Optional: Add extra Python modules.
ENV PYTHONPATH=/opt/python/packages
RUN mkdir -p "${PYTHONPATH}"
COPY test_util.py "${PYTHONPATH}"

# Required: Create the 'yarn_docker_user' group/user.
# The GID and UID must be 1099. Home directory is required.
RUN groupadd -g 1099 yarn_docker_user
RUN useradd -u 1099 -g 1099 -d /home/yarn_docker_user -m yarn_docker_user
USER yarn_docker_user

יצירה של קובץ האימג' והעלאה שלו

הפקודות הבאות משמשות ליצירה ולדחיפה של קובץ האימג' לדוגמה של Docker. אתם יכולים לבצע שינויים בהתאם להתאמות האישיות שלכם.

# Increase the version number when there is a change to avoid referencing
# a cached older image. Avoid reusing the version number, including the default
# `latest` version.
IMAGE=gcr.io/my-project/my-image:1.0.1

# Download the BigQuery connector.
gcloud storage cp \
  gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .

# Download the Miniconda3 installer.
wget https://repo.anaconda.com/miniconda/Miniconda3-py39_4.10.3-Linux-x86_64.sh

# Python module example:
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

# Build and push the image.
docker build -t "${IMAGE}" .
docker push "${IMAGE}"

יצירת אשכול Managed Service for Apache Spark

אחרי שיוצרים קובץ אימג' של Docker שמבצע התאמה אישית של סביבת Spark, יוצרים אשכול של Managed Service for Apache Spark שישתמש בקובץ האימג' של Docker כשמריצים משימות Spark.

gcloud

gcloud dataproc clusters create CLUSTER_NAME \
    --region=REGION \
    --image-version=DP_IMAGE \
    --optional-components=DOCKER \
    --properties=dataproc:yarn.docker.enable=true,dataproc:yarn.docker.image=DOCKER_IMAGE \
    other flags

מחליפים את מה שכתוב בשדות הבאים:

  • CLUSTER_NAME: שם האשכול.
  • REGION: האזור של האשכול.
  • DP_IMAGE: גרסת התמונה של Managed Service for Apache Spark צריכה להיות 2.0.49 או גרסה מתקדמת יותר (בגרסה --image-version=2.0 נעשה שימוש בגרסה משנית מתאימה שמתקדמת יותר מגרסה 2.0.49).
  • --optional-components=DOCKER: מפעיל את רכיב Docker באשכול.
  • --properties flag:
    • dataproc:yarn.docker.enable=true: מאפיין חובה להפעלת התכונה Managed Service for Apache Spark Docker on YARN.
    • dataproc:yarn.docker.image: מאפיין אופציונלי שאפשר להוסיף כדי לציין את DOCKER_IMAGE באמצעות פורמט השמות הבא של תמונות ב-Container Registry:‏ {hostname}/{project-id}/{image}:{tag}.

      דוגמה:

      dataproc:yarn.docker.image=gcr.io/project-id/image:1.0.1
      

      דרישה: את קובץ אימג' של Docker צריך לארח ב-Container Registry או ב-Artifact Registry. ‫(Managed Service for Apache Spark לא יכול לאחזר קונטיינרים ממרשמים אחרים).

      המלצה: כדאי להוסיף את המאפיין הזה כשיוצרים את האשכול כדי לשמור במטמון את קובץ האימג' של Docker ולמנוע מצבים של פסק זמן ב-YARN בהמשך, כששולחים עבודה שמשתמשת בקובץ האימג'.

כשההגדרה dataproc:yarn.docker.enable מוגדרת לערך true, ‏ Dataproc מעדכן את ההגדרות של Hadoop ו-Spark כדי להפעיל את התכונה Docker on YARN באשכול. לדוגמה, spark.submit.deployMode מוגדר ל-cluster, ו-spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS ו-spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS מוגדרים להרכבת ספריות מהמארח אל הקונטיינר.

שליחת עבודת Spark לאשכול

אחרי יצירת אשכול Managed Service for Apache Spark, שולחים משימת Spark לאשכול שמשתמש בקובץ האימג' של Docker. בדוגמה שבקטע הזה, מוגשת עבודת PySpark לאשכול.

הגדרת מאפייני התפקיד:

# Set the Docker image URI.
IMAGE=(e.g., gcr.io/my-project/my-image:1.0.1)

# Required: Use `#` as the delimiter for properties to avoid conflicts.
JOB_PROPERTIES='^#^'

# Required: Set Spark properties with the Docker image.
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=${IMAGE}"
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=${IMAGE}"

# Optional: Add custom jars to Spark classpath. Don't set these properties if
# there are no customizations.
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.driver.extraClassPath=/opt/spark/jars/*"
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.executor.extraClassPath=/opt/spark/jars/*"

# Optional: Set custom PySpark Python path only if there are customizations.
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.pyspark.python=/opt/miniconda3/bin/python"
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.pyspark.driver.python=/opt/miniconda3/bin/python"

# Optional: Set custom Python module path only if there are customizations.
# Since the `PYTHONPATH` environment variable defined in the Dockerfile is
# overridden by Spark, it must be set as a job property.
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.yarn.appMasterEnv.PYTHONPATH=/opt/python/packages"
JOB_PROPERTIES="${JOB_PROPERTIES}#spark.executorEnv.PYTHONPATH=/opt/python/packages"

הערות:

gcloud

שולחים את העבודה לאשכול.

gcloud dataproc jobs submit pyspark PYFILE \
    --cluster=CLUSTER_NAME \
    --region=REGION \
    --properties=${JOB_PROPERTIES}

מחליפים את מה שכתוב בשדות הבאים:

  • PYFILE: נתיב הקובץ של קובץ העבודה של PySpark. יכול להיות שזה נתיב של קובץ מקומי או ה-URI של הקובץ ב-Cloud Storage ‏(gs://BUCKET_NAME/PySpark filename).
  • CLUSTER_NAME: שם האשכול.
  • REGION: האזור של האשכול.