Dataproc di image container kustom GKE

Anda dapat menentukan image container kustom untuk digunakan dengan Dataproc di GKE . Image container kustom Anda harus menggunakan salah satu image Spark dasar Dataproc di GKE.

Menggunakan image container kustom

Untuk menggunakan image container kustom Dataproc di GKE, tetapkan spark.kubernetes.container.image property saat Anda membuat cluster virtual Dataproc di GKE atau mengirimkan tugas Spark ke cluster.

  • Contoh pembuatan cluster gcloud CLI:
    gcloud dataproc clusters gke create "${DP_CLUSTER}" \
        --properties=spark:spark.kubernetes.container.image=custom-image \
        ... other args ...
    
  • Contoh pengiriman tugas gcloud CLI:
    gcloud dataproc jobs submit spark \
        --properties=spark.kubernetes.container.image=custom-image \
        ... other args ...
    

Persyaratan dan setelan image container kustom

Gambar dasar

Anda dapat menggunakan alat docker untuk membangun Docker yang disesuaikan berdasarkan salah satu image Spark dasar Dataproc di GKE yang dipublikasikan.

Pengguna container

Dataproc di GKE menjalankan container Spark sebagai pengguna spark Linux dengan UID 1099 dan GID 1099. Gunakan UID dan GID untuk izin sistem file. Misalnya, jika Anda menambahkan file jar di /opt/spark/jars/my-lib.jar dalam gambar sebagai dependensi beban kerja, Anda harus memberikan izin baca kepada pengguna spark untuk file tersebut.

Komponen

  • Java: Variabel lingkungan JAVA_HOME mengarah ke lokasi penginstalan Java. Nilai default saat ini adalah /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64, yang dapat berubah (lihat catatan rilis Dataproc untuk mengetahui informasi terbaru).

    • Jika Anda menyesuaikan lingkungan Java, pastikan JAVA_HOME disetel ke lokasi yang benar dan PATH menyertakan jalur ke biner.
  • Python: Dataproc di GKE image Spark dasar telah menginstal Miniconda3 di /opt/conda. CONDA_HOME mengarah ke lokasi ini, ${CONDA_HOME}/bin disertakan dalam PATH, dan PYSPARK_PYTHON disetel ke ${CONDA_HOME}/python.

    • Jika Anda menyesuaikan Conda, pastikan CONDA_HOME mengarah ke direktori utama Conda ,${CONDA_HOME}/bin disertakan dalam PATH, dan PYSPARK_PYTHON disetel ke ${CONDA_HOME}/python.

    • Anda dapat menginstal, menghapus, dan mengupdate paket di lingkungan dasar default, atau membuat lingkungan baru, tetapi sangat direkomendasikan agar lingkungan mencakup semua paket yang diinstal di lingkungan dasar image container dasar.

    • Jika Anda menambahkan modul Python, seperti skrip Python dengan fungsi utilitas, ke image container, sertakan direktori modul dalam PYTHONPATH.

  • Spark: Spark diinstal di /usr/lib/spark, dan SPARK_HOME mengarah ke lokasi ini. Spark tidak dapat disesuaikan. Jika diubah, image penampung akan ditolak atau gagal beroperasi dengan benar.

    • Tugas: Anda dapat menyesuaikan dependensi tugas Spark. SPARK_EXTRA_CLASSPATH menentukan classpath tambahan untuk proses JVM Spark. Rekomendasi: letakkan jar di bawah /opt/spark/jars, dan tetapkan SPARK_EXTRA_CLASSPATH ke /opt/spark/jars/*.

      Jika Anda menyematkan JAR tugas dalam image, direktori yang direkomendasikan adalah /opt/spark/job. Saat mengirimkan tugas, Anda dapat mereferensikannya dengan jalur lokal, misalnya, file:///opt/spark/job/my-spark-job.jar.

    • Konektor Cloud Storage: Konektor Cloud Storage diinstal di /usr/lib/spark/jars.

    • Utilitas: Paket utilitas procps dan tini diperlukan untuk menjalankan Spark. Utilitas ini disertakan dalam image Spark dasar, sehingga image kustom tidak perlu menginstalnya ulang.

    • Titik entri: Dataproc di GKE mengabaikan perubahan apa pun yang dilakukan pada primitif ENTRYPOINT dan CMD dalam image container.

    • Skrip inisialisasi: Anda dapat menambahkan skrip inisialisasi opsional di /opt/init-script.sh. Skrip inisialisasi dapat mendownload file dari Cloud Storage, memulai proxy dalam penampung, memanggil skrip lain, dan melakukan tugas startup lainnya.

      Skrip titik entri memanggil skrip inisialisasi dengan semua argumen command line ($@) sebelum memulai driver Spark, executor Spark, dan proses lainnya. Skrip inisialisasi dapat memilih jenis proses Spark berdasarkan argumen pertama ($1): kemungkinan nilai mencakup spark-submit untuk penampung driver, dan executor untuk penampung eksekutor.

  • Configs: Konfigurasi Spark terletak di bagian /etc/spark/conf. Variabel lingkungan SPARK_CONF_DIR mengarah ke lokasi ini.

    Jangan menyesuaikan konfigurasi Spark di image container. Sebagai gantinya, kirimkan properti apa pun melalui Dataproc on GKE API untuk alasan berikut:

    • Beberapa properti, seperti ukuran memori eksekutor, ditentukan saat runtime, bukan saat waktu build image container; properti tersebut harus disuntikkan oleh Dataproc di GKE .
    • Dataproc di GKE menerapkan batasan pada properti yang diberikan oleh pengguna. Dataproc di GKE memasang konfigurasi dari configMap ke /etc/spark/conf dalam container, menggantikan setelan yang disematkan dalam image.

Gambar Spark dasar

Dataproc mendukung image penampung Spark dasar berikut:

  • Spark 3.5: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.2

Contoh pembuatan image container kustom

Contoh Dockerfile

FROM us-central1-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.0:latest

# Change to root temporarily so that it has permissions to create dirs and copy
# files.
USER root

# Add a BigQuery connector jar.
ENV SPARK_EXTRA_JARS_DIR=/opt/spark/jars/
ENV SPARK_EXTRA_CLASSPATH='/opt/spark/jars/*'
RUN mkdir -p "${SPARK_EXTRA_JARS_DIR}" \
    && chown spark:spark "${SPARK_EXTRA_JARS_DIR}"
COPY --chown=spark:spark \
    spark-bigquery-with-dependencies_2.12-0.22.2.jar "${SPARK_EXTRA_JARS_DIR}"

# Install Cloud Storage client Conda package.
RUN "${CONDA_HOME}/bin/conda" install google-cloud-storage

# Add a custom Python file.
ENV PYTHONPATH=/opt/python/packages
RUN mkdir -p "${PYTHONPATH}"
COPY test_util.py "${PYTHONPATH}"

# Add an init script.
COPY --chown=spark:spark init-script.sh /opt/init-script.sh

# (Optional) Set user back to `spark`.
USER spark

Membangun image container

Jalankan perintah berikut di direktori Dockerfile

  1. Tetapkan gambar (contoh: us-central1-docker.pkg.dev/my-project/spark/spark-test-image:latest) dan ubah ke direktori build.
    IMAGE=custom container image \
        BUILD_DIR=$(mktemp -d) \
        cd "${BUILD_DIR}"
    
  2. Download konektor BigQuery.

    gcloud storage cp \
        gs://spark-lib/bigquery/spark-bigquery-with-dependencies_2.12-0.22.2.jar .
    

  3. Buat file contoh Python.

    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

  4. Buat contoh skrip init.

    cat >init-script.sh <<EOF
    echo "hello world" >/tmp/init-script.out
    EOF
    

  5. Bangun dan kirim image.

    docker build -t "${IMAGE}" . && docker push "${IMAGE}"