Menggunakan container kustom dengan Dataproc Serverless untuk Spark

Dataproc Serverless untuk Spark menjalankan workload dalam container Docker. Container menyediakan lingkungan runtime untuk proses driver dan eksekutor beban kerja. Secara default, Dataproc Serverless for Spark menggunakan image container yang menyertakan paket Spark, Java, Python, dan R default yang terkait dengan versi rilis runtime. Dataproc Serverless untuk API batches Spark memungkinkan Anda menggunakan image container kustom, bukan gambar default. Biasanya, image container kustom menambahkan dependensi Java atau Python workload Spark yang tidak disediakan oleh image container default. Penting: Jangan sertakan Spark di image container kustom Anda; Dataproc Serverless untuk Spark akan memasang Spark ke container saat runtime.

Mengirimkan workload batch Spark menggunakan image container kustom

gcloud

Gunakan perintah gcloud dataproc batch submit spark dengan flag --container-image untuk menentukan image container kustom saat Anda mengirimkan beban kerja batch Spark.

gcloud dataproc batches submit spark \
    --container-image=custom-image, for example, "gcr.io/my-project-id/my-image:1.0.1" \
    --region=region \
    --jars=path to user workload jar located in Cloud Storage or included in the custom container \
    --class=The fully qualified name of a class in the jar file, such as org.apache.spark.examples.SparkPi \
    -- add any workload arguments here

Catatan:

  • Custom-image: Tentukan image container kustom menggunakan format penamaan image Container Registry berikut: {hostname}/{project-id}/{image}:{tag}, misalnya, "gcr.io/my-project-id/my-image:1.0.1". Catatan: Anda harus menghosting image container kustom di Container Registry atau Artifact Registry. (Dataproc Serverless tidak dapat mengambil container dari registry lain).
  • --jars: Tentukan jalur ke workload pengguna yang disertakan dalam image container kustom Anda atau yang terletak di Cloud Storage, misalnya, /opt/spark/jars/spark-examples.jar atau gs://my-bucket/spark/jars/spark-examples.jar.
  • Opsi perintah batch lainnya: Anda dapat menambahkan flag perintah batch opsional lainnya, misalnya, untuk menggunakan Persistent History Server (PHS). Catatan: PHS harus berada di region tempat Anda menjalankan beban kerja batch.
  • argumen workloadAnda dapat menambahkan argumen beban kerja dengan menambahkan "--" di akhir perintah, diikuti dengan argumen beban kerja.

REST

Image container kustom disediakan melalui kolom RuntimeConfig.containerImage sebagai bagian dari permintaan API batches.create.

Contoh berikut menunjukkan cara menggunakan container kustom untuk mengirimkan workload batch menggunakan Dataproc Serverless untuk Spark batches.create API.

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • project-id: Project ID Google Cloud
  • region: region
  • custom-container-image: Tentukan image container kustom menggunakan format penamaan image Container Registry berikut: {hostname}/{project-id}/{image}:{tag}, misalnya, "gcr.io/my-project-id/my-image:1.0.1". Catatan: Anda harus menghosting container kustom di Container Registry atau Artifact Registry . (Dataproc Serverless tidak dapat mengambil container dari registry lain).
  • jar-uri: Tentukan jalur ke jar workload yang disertakan dalam image container kustom atau yang berada di Cloud Storage, misalnya, "/opt/spark/jars/spark-examples.jar" atau "gs:///spark/jars/spark-examples.jar".
  • class: Nama class yang sepenuhnya memenuhi syarat dalam file jar, seperti "org.apache.spark.examples.SparkPi".
  • Opsi lainnya: Anda dapat menggunakan kolom resource workload batch lainnya, misalnya, menggunakan kolom sparkBatch.args untuk meneruskan argumen ke workload Anda (lihat dokumentasi resource Batch untuk informasi selengkapnya). Untuk menggunakan Server Histori Persisten (PHS), lihat Menyiapkan Server Histori Persisten. Catatan: PHS harus berada di region tempat Anda menjalankan beban kerja batch.

Metode HTTP dan URL:

POST https://dataproc.googleapis.com/v1/projects/project-id/locations/region/batches

Meminta isi JSON:

{
  "runtimeConfig":{
    "containerImage":"custom-container-image
  },
  "sparkBatch":{
    "jarFileUris":[
      "jar-uri"
    ],
    "mainClass":"class"
  }
}

Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

Anda akan melihat respons JSON seperti berikut:

{
"name":"projects/project-id/locations/region/batches/batch-id",
  "uuid":",uuid",
  "createTime":"2021-07-22T17:03:46.393957Z",
  "runtimeConfig":{
    "containerImage":"gcr.io/my-project/my-image:1.0.1"
  },
  "sparkBatch":{
    "mainClass":"org.apache.spark.examples.SparkPi",
    "jarFileUris":[
      "/opt/spark/jars/spark-examples.jar"
    ]
  },
  "runtimeInfo":{
    "outputUri":"gs://dataproc-.../driveroutput"
  },
  "state":"SUCCEEDED",
  "stateTime":"2021-07-22T17:06:30.301789Z",
  "creator":"account-email-address",
  "runtimeConfig":{
    "properties":{
      "spark:spark.executor.instances":"2",
      "spark:spark.driver.cores":"2",
      "spark:spark.executor.cores":"2",
      "spark:spark.app.name":"projects/project-id/locations/region/batches/batch-id"
    }
  },
  "environmentConfig":{
    "peripheralsConfig":{
      "sparkHistoryServerConfig":{
      }
    }
  },
  "operation":"projects/project-id/regions/region/operation-id"
}

Membuat image container kustom

Dataproc Serverless untuk image container kustom Spark adalah image Docker. Anda dapat menggunakan alat untuk mem-build image Docker guna membangun image container kustom, tetapi ada beberapa kondisi yang harus dipenuhi image tersebut agar kompatibel dengan Dataproc Serverless untuk Spark. Bagian berikut menjelaskan ketentuan tersebut.

Sistem operasi

Anda dapat memilih image sistem operasi apa pun sebagai image dasar image container kustom. Rekomendasi: Image Debian 11 default lebih disarankan (misalnya, debian:11-slim), karena telah menerima pengujian untuk menghindari masalah kompatibilitas.

Utilitas

Anda harus menyertakan paket utilitas berikut, yang diperlukan untuk menjalankan Spark, di image container kustom Anda:

  • procps
  • tini

Untuk menjalankan XGBoost dari Spark (Java atau Scala), Anda harus menyertakan libgomp1

Pengguna penampung

Dataproc Serverless untuk Spark menjalankan container sebagai pengguna Linux spark dengan UID 1099 dan GID 1099. Perintah USER yang ditetapkan dalam Dockerfile image container kustom akan diabaikan saat runtime. Gunakan UID dan GID untuk izin sistem file. Misalnya, jika Anda menambahkan file jar di /opt/spark/jars/my-lib.jar pada gambar sebagai dependensi beban kerja, Anda harus memberikan izin baca pengguna spark ke file tersebut.

Streaming gambar

Dataproc Serverless untuk Spark biasanya memulai beban kerja yang memerlukan image container kustom dengan mendownload seluruh image ke disk. Hal ini dapat menyebabkan penundaan waktu inisialisasi, terutama bagi pelanggan dengan gambar berukuran besar.

Sebagai gantinya, Anda dapat menggunakan streaming gambar, yang merupakan metode untuk menarik data gambar sesuai kebutuhan. Tindakan ini memungkinkan beban kerja dimulai tanpa menunggu seluruh gambar didownload, sehingga berpotensi meningkatkan waktu inisialisasi. Untuk mengaktifkan streaming gambar, Anda harus mengaktifkan Container Filesystem API. Anda juga harus menyimpan image container di Artifact Registry, dan repositori Artifact Registry harus berada di region yang sama dengan workload Dataproc Anda atau di multi-region yang sesuai dengan region tempat workload Anda dijalankan. Jika Dataproc tidak mendukung gambar atau layanan streaming gambar tidak tersedia, implementasi streaming kami akan mendownload seluruh gambar. Perlu diperhatikan bahwa kami tidak mendukung hal berikut untuk streaming gambar:

Dalam kasus ini, Dataproc akan mengambil seluruh gambar sebelum memulai beban kerja.

Spark

Jangan sertakan Spark dalam image container kustom Anda. Saat runtime, Dataproc Serverless untuk Spark memasang biner dan konfigurasi Spark dari host ke container: biner dipasang ke direktori /usr/lib/spark dan konfigurasi dipasang ke direktori /etc/spark/conf. File yang ada di direktori ini diganti oleh Dataproc Serverless untuk Spark saat runtime.

Java Runtime Environment

Jangan menyertakan Java Runtime Environment (JRE) Anda sendiri dalam image container kustom. Saat runtime, Dataproc Serverless for Spark memasang OpenJDK dari host ke container. Jika Anda menyertakan JRE dalam image container kustom, JRE tersebut akan diabaikan.

Paket Java

Anda dapat menyertakan file jar sebagai dependensi beban kerja Spark dalam image container kustom, dan Anda dapat menetapkan variabel env SPARK_EXTRA_CLASSPATH untuk menyertakan jar. Dataproc Serverless untuk Spark akan menambahkan nilai variabel env di classpath proses JVM Spark. Rekomendasi: letakkan jar di direktori /opt/spark/jars dan tetapkan SPARK_EXTRA_CLASSPATH ke /opt/spark/jars/*.

Anda dapat menyertakan jar workload di image container kustom, lalu mereferensikannya dengan jalur lokal saat mengirimkan beban kerja, misalnya file:///opt/spark/jars/my-spark-job.jar (lihat Mengirimkan workload batch Spark menggunakan image container kustom sebagai contoh).

Paket Python

Secara default, Dataproc Serverless for Spark memasang Conda dari host ke direktori /opt/dataproc/conda di dalam container saat runtime. PYSPARK_PYTHON disetel ke /opt/dataproc/conda/bin/python. Direktori dasarnya, /opt/dataproc/conda/bin, disertakan dalam PATH.

Anda dapat menyertakan lingkungan Python dengan paket di direktori yang berbeda dalam image container kustom, misalnya di /opt/conda, dan menetapkan variabel lingkungan PYSPARK_PYTHON ke /opt/conda/bin/python.

Image container kustom Anda dapat menyertakan modul Python lain yang bukan bagian dari lingkungan Python, misalnya, skrip Python dengan fungsi utilitas. Tetapkan variabel lingkungan PYTHONPATH untuk menyertakan direktori tempat modul berada.

Lingkungan R

Anda dapat menyesuaikan lingkungan R di image container kustom menggunakan salah satu opsi berikut: - gunakan Conda untuk mengelola dan menginstal paket R dari saluran conda-forge - tambahkan repositori R untuk image container Linux OS, dan instal paket R melalui pengelola paket Linux OS (lihat Indeks paket Software R)

Saat menggunakan salah satu opsi tersebut, Anda harus menetapkan variabel lingkungan R_HOME agar mengarah ke lingkungan R kustom. Pengecualian: Jika Anda menggunakan Conda untuk mengelola lingkungan R dan menyesuaikan lingkungan Python, Anda tidak perlu menyetel variabel lingkungan R_HOME; variabel tersebut akan otomatis ditetapkan berdasarkan variabel lingkungan PYSPARK_PYTHON.

Contoh build image container kustom

Dockerfile

# Debian 11 is recommended.
FROM debian:11-slim

# Suppress interactive prompts
ENV DEBIAN_FRONTEND=noninteractive

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

# (Optiona) Install utilities required by XGBoost for Spark.
RUN apt install -y procps libgomp1

# Enable jemalloc2 as default memory allocator
ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2

# (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 spark-bigquery-with-dependencies_2.12-0.22.2.jar "${SPARK_EXTRA_JARS_DIR}"

# (Optional) Install and configure Miniconda3.
ENV CONDA_HOME=/opt/miniconda3
ENV PYSPARK_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
# Packages ipython and ipykernel are required if using custom conda and want to
# use this container for running notebooks.
RUN ${CONDA_HOME}/bin/conda install ipython ipykernel

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

# (Optional) Install R and R libraries.
RUN apt update \
  && apt install -y gnupg \
  && apt-key adv --no-tty \
      --keyserver "hkp://keyserver.ubuntu.com:80" \
      --recv-keys E19F5F87128899B192B1A2C2AD5F960A256A04AF \
  && echo "deb http://cloud.r-project.org/bin/linux/debian bullseye-cran40/" \
      >/etc/apt/sources.list.d/cran-r.list \
  && apt update \
  && apt install -y \
      libopenblas-base \
      libssl-dev \
      r-base \
      r-base-dev \
      r-recommended \
      r-cran-blob

ENV R_HOME=/usr/lib/R

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

Perintah build

Jalankan di direktori Dockerfile.

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