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 Dataproc di cluster virtual GKE atau mengirim 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

Image dasar

Anda dapat menggunakan alat docker untuk mem-build docker yang disesuaikan berdasarkan salah satu image Spark dasar Dataproc yang dipublikasikan di GKE.

Pengguna penampung

Dataproc di GKE menjalankan penampung 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 image sebagai dependensi beban kerja, Anda harus memberikan izin baca pengguna spark ke 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 informasi terbaru).

    • Jika Anda menyesuaikan lingkungan Java, pastikan JAVA_HOME ditetapkan ke lokasi yang benar dan PATH menyertakan jalur ke biner.
  • Python: Image Spark dasar Dataproc di GKE telah menginstal Miniconda3 di /opt/conda. CONDA_HOME mengarah ke lokasi ini, ${CONDA_HOME}/bin disertakan dalam PATH, dan PYSPARK_PYTHON ditetapkan 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 ditetapkan ke ${CONDA_HOME}/python.

    • Anda dapat menginstal, menghapus, dan mengupdate paket di lingkungan dasar default, atau membuat lingkungan baru, tetapi sangat disarankan agar lingkungan tersebut menyertakan semua paket yang diinstal di lingkungan dasar image penampung dasar.

    • Jika Anda menambahkan modul Python, seperti skrip Python dengan fungsi utilitas, ke image penampung, sertakan direktori modul di 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: masukkan jar ke dalam /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 menginstal ulang.

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

    • 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, eksekutor Spark, dan proses lainnya. Skrip inisialisasi dapat memilih jenis proses Spark berdasarkan arg pertama ($1): kemungkinan nilainya mencakup spark-submit untuk penampung driver, dan executor untuk penampung eksekutor.

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

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

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

Gambar Spark dasar

Dataproc mendukung image penampung Spark dasar berikut:

  • Spark 2.4: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_1.5
  • Spark 3.1: ${REGION}-docker.pkg.dev/cloud-dataproc/spark/dataproc_2.0

Contoh build 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. Build dan kirim image.

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