Menyesuaikan lingkungan runtime tugas Spark dengan Docker di YARN

Dengan fitur Dataproc Docker on YARN, Anda dapat membuat dan menggunakan image Docker untuk menyesuaikan lingkungan runtime tugas Spark. Gambar ini dapat mencakup penyesuaian pada dependensi Java, Python, dan R, serta ke jar tugas Anda.

Batasan

Ketersediaan atau dukungan fitur tidak tersedia dengan:

  • Versi gambar Dataproc sebelum 2.0.49 (tidak tersedia di gambar 1.5)
  • Tugas MapReduce (hanya didukung untuk tugas Spark)
  • Mode klien Spark (hanya didukung dengan mode cluster Spark)
  • Cluster Kerberos: pembuatan cluster akan gagal jika Anda membuat cluster dengan Docker di YARN dan Kerberos diaktifkan.
  • Penyesuaian JDK, Hadoop, dan Spark: JDK host, Hadoop, dan Spark 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, sehingga membuat perubahan dan penambahan sesuai 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

Membangun dan mengirim image

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

# 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.
gsutil 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 Anda 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 gambar 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 pada cluster.
  • Tanda --properties:
    • dataproc:yarn.docker.enable=true: Properti yang diperlukan untuk mengaktifkan Dataproc Docker di fitur 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 penampung 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 Docker pada fitur YARN di cluster. Misalnya, spark.submit.deployMode ditetapkan ke cluster, dan spark.yarn.appMasterEnv.YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS dan spark.executorEnv.YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS ditetapkan untuk memasang direktori dari host ke dalam container.

Mengirim 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 pekerjaan:

# 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. Lokasi ini dapat berupa jalur file lokal atau URI file di Cloud Storage (gs://BUCKET_NAME/PySpark filename).
  • CLUSTER_NAME: Nama cluster.
  • REGION: Region cluster.