Menyesuaikan lingkungan runtime tugas Spark dengan Docker di YARN

Fitur Docker on YARN Dataproc memungkinkan Anda membuat dan menggunakan image Docker untuk menyesuaikan lingkungan runtime tugas Spark. Image dapat menyertakan penyesuaian pada dependensi Java, Python, dan R, serta ke jar tugas Anda.

Batasan

Dukungan atau ketersediaan fitur tidak tersedia dengan:

  • Versi image Dataproc sebelum 2.0.49 (tidak tersedia dalam image 1.5)
  • Tugas MapReduce (hanya didukung untuk tugas Spark)
  • Mode klien Spark (hanya didukung dengan mode cluster Spark)
  • Cluster Kerberos: pembuatan cluster gagal jika Anda membuat cluster dengan Docker di YARN dan Kerberos diaktifkan.
  • Penyesuaian JDK, Hadoop, dan Spark: JDK, Hadoop, dan Spark host digunakan, bukan penyesuaian Anda.

Membuat image Docker

Langkah pertama untuk menyesuaikan lingkungan Spark adalah mem-build image Docker.

Dockerfile

Anda dapat menggunakan Dockerfile berikut sebagai contoh, dengan melakukan perubahan dan penambahan untuk memenuhi kebutuhan Anda.

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

Mem-build dan mengirim image

Berikut adalah perintah untuk mem-build dan mengirim contoh image Docker, Anda dapat membuat perubahan sesuai dengan penyesuaian Anda.

# 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}"

Membuat cluster Dataproc

Setelah membuat image Docker yang menyesuaikan lingkungan Spark, buat cluster Dataproc yang akan menggunakan image Docker saat menjalankan tugas 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

Ganti kode berikut;

  • CLUSTER_NAME: Nama cluster.
  • REGION: Region cluster.
  • DP_IMAGE: Versi image Dataproc harus 2.0.49 atau yang lebih baru (--image-version=2.0 akan menggunakan versi minor yang memenuhi syarat setelah 2.0.49).
  • --optional-components=DOCKER: Mengaktifkan komponen Docker di cluster.
  • Flag --properties:
    • dataproc:yarn.docker.enable=true: Properti yang diperlukan untuk mengaktifkan fitur Dataproc Docker di YARN.
    • dataproc:yarn.docker.image: Properti opsional yang dapat Anda tambahkan untuk menentukan DOCKER_IMAGE menggunakan format penamaan image Container Registry berikut: {hostname}/{project-id}/{image}:{tag}.

      Contoh:

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

      Persyaratan: Anda harus menghosting image Docker di Container Registry atau Artifact Registry. (Dataproc tidak dapat mengambil kontainer dari registry lain).

      Rekomendasi: Tambahkan properti ini saat Anda membuat cluster untuk meng-cache image Docker dan menghindari waktu tunggu YARN nanti saat Anda mengirimkan tugas yang menggunakan image.

Jika dataproc:yarn.docker.enable ditetapkan ke true, Dataproc akan memperbarui konfigurasi Hadoop dan Spark untuk mengaktifkan fitur Docker di YARN di cluster. Misalnya, spark.submit.deployMode ditetapkan ke cluster, dan spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS serta spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS ditetapkan untuk memasang direktori dari host ke dalam penampung.

Mengirimkan tugas Spark ke cluster

Setelah membuat cluster Dataproc, kirimkan tugas Spark ke cluster yang menggunakan image Docker Anda. Contoh di bagian ini mengirimkan tugas PySpark ke cluster.

Tetapkan properti tugas:

# 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"

Catatan:

gcloud

Kirim tugas ke cluster.

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

Ganti kode berikut;

  • PYFILE: Jalur file ke file tugas PySpark Anda. Ini dapat berupa jalur file lokal atau URI file di Cloud Storage (gs://BUCKET_NAME/PySpark filename).
  • CLUSTER_NAME: Nama cluster.
  • REGION: Region cluster.