Dataproc Serverless untuk Spark menjalankan workload dalam penampung Docker. Container menyediakan lingkungan runtime untuk proses driver dan eksekutor beban kerja. Secara default, Dataproc Serverless untuk Spark menggunakan image penampung yang menyertakan paket Spark, Java, Python, dan R default yang terkait dengan versi rilis runtime. API batch Dataproc Serverless untuk Spark memungkinkan Anda menggunakan image penampung kustom, bukan image default. Biasanya, image container kustom menambahkan dependensi Java atau Python beban kerja Spark yang tidak disediakan oleh image container default. Penting: Jangan sertakan Spark dalam image container kustom Anda; Dataproc Serverless for Spark akan memasang Spark ke dalam penampung saat runtime.
Mengirim workload batch Spark menggunakan image container kustom
gcloud
Gunakan perintah gcloud dataproc batches submit spark dengan flag --container-image
untuk menentukan image penampung 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 penampung dari registry lain). --jars
: Tentukan jalur ke beban kerja pengguna yang disertakan dalam image penampung kustom atau yang terletak di Cloud Storage, misalnya,file:///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 workload apa pun dengan menambahkan "--" ke akhir perintah, diikuti dengan argumen workload.
REST
Image container kustom disediakan melalui kolom RuntimeConfig.containerImage sebagai bagian dari permintaan API batches.create.
Contoh berikut menunjukkan cara menggunakan penampung kustom untuk mengirimkan beban kerja 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 penampung 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 penampung dari registry lain). jar-uri
: Tentukan jalur ke jar beban kerja yang disertakan dalam image penampung kustom Anda 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,
gunakan kolom
sparkBatch.args
untuk meneruskan argumen ke workload Anda (lihat dokumentasi resourceBatch
untuk mengetahui informasi selengkapnya). Untuk menggunakan Persistent History Server (PHS), lihat Menyiapkan Persistent History Server. 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" }
Mem-build image container kustom
Image container kustom Dataproc Serverless untuk Spark adalah image Docker. Anda dapat menggunakan alat untuk mem-build image Docker guna mem-build image container kustom, tetapi ada kondisi yang harus dipenuhi image agar kompatibel dengan Dataproc Serverless untuk Spark. Bagian berikut menjelaskan kondisi ini.
Sistem operasi
Anda dapat memilih image sistem operasi apa pun sebagai image dasar image container kustom.
Rekomendasi: Image Debian 11 default lebih disukai (misalnya, debian:11-slim
),
karena telah menerima pengujian untuk menghindari masalah kompatibilitas.
Utilitas
Anda harus menyertakan paket utilitas berikut, yang diperlukan untuk menjalankan Spark, dalam image container kustom:
procps
tini
Untuk menjalankan XGBoost dari Spark (Java atau Scala), Anda harus menyertakan
libgomp1
Pengguna penampung
Dataproc Serverless untuk Spark menjalankan penampung 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
dalam image
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 besar.
Sebagai gantinya, Anda dapat menggunakan streaming gambar, yang merupakan metode untuk mengambil data gambar sesuai kebutuhan. Hal ini memungkinkan workload dimulai tanpa menunggu seluruh image didownload, yang berpotensi meningkatkan waktu inisialisasi. Untuk mengaktifkan streaming gambar, Anda harus mengaktifkan Container File System API. Anda juga harus menyimpan image container di Artifact Registry dan repositori Artifact Registry harus berada di region yang sama dengan beban kerja Dataproc atau di multi-region yang sesuai dengan region tempat beban kerja Anda berjalan. Jika Dataproc tidak mendukung gambar atau layanan streaming gambar tidak tersedia, penerapan streaming kami akan mendownload seluruh gambar.
Perhatikan bahwa kami tidak mendukung hal berikut untuk streaming gambar:
- Gambar dengan lapisan kosong atau lapisan duplikat
- Image yang menggunakan Manifes Image V2, skema versi 1
Dalam kasus ini, Dataproc akan mengambil seluruh image 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 dalam penampung: biner dipasang ke direktori /usr/lib/spark
dan konfigurasi dipasang ke direktori /etc/spark/conf
. File yang ada di direktori ini
akan diganti oleh Dataproc Serverless for Spark saat runtime.
Java Runtime Environment
Jangan sertakan Java Runtime Environment (JRE) Anda sendiri dalam image penampung kustom. Pada waktu proses berjalan, Dataproc Serverless untuk Spark akan memasang OpenJDK
dari host ke dalam penampung. Jika Anda menyertakan JRE dalam image penampung kustom, JRE tersebut akan diabaikan.
Paket Java
Anda dapat menyertakan file jar sebagai dependensi workload 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:
tempatkan jar di direktori /opt/spark/jars
dan tetapkan SPARK_EXTRA_CLASSPATH
ke /opt/spark/jars/*
.
Anda dapat menyertakan jar workload dalam image container kustom, lalu mereferensikannya dengan jalur lokal saat mengirimkan workload, misalnya file:///opt/spark/jars/my-spark-job.jar
(lihat Mengirimkan workload batch Spark menggunakan image container kustom untuk mengetahui contohnya).
Paket Python
Secara default, Dataproc Serverless for Spark memasang
Conda dari host ke
direktori /opt/dataproc/conda
dalam penampung 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 lain
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 OS Linux image container Anda, dan instal paket R menggunakan pengelola paket OS Linux (lihat indeks paket Software R).
Saat menggunakan salah satu opsi, Anda harus menetapkan variabel lingkungan R_HOME
agar mengarah ke lingkungan R kustom. Pengecualian: Jika menggunakan Conda untuk mengelola lingkungan R dan menyesuaikan lingkungan Python, Anda tidak perlu menetapkan variabel lingkungan R_HOME
; variabel ini ditetapkan secara otomatis berdasarkan variabel lingkungan PYSPARK_PYTHON
.
Contoh build image container kustom
Bagian ini mencakup contoh build image container kustom, dimulai dengan contoh Dockerfile.
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}" #Uncomment below and replace EXTRA_JAR_NAME with the jar file name. #COPY "EXTRA_JAR_NAME" "${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 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}"