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
ataugs://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 resourceBatch
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:
- Gambar dengan lapisan kosong atau lapisan duplikat
- Gambar yang menggunakan Manifes Gambar V2, skema versi 1
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}"