全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan Celeborn untuk mengaktifkan RSS pada pekerjaan Spark

更新时间:Mar 05, 2026

Apache Celeborn adalah Remote Shuffle Service (RSS) yang mengelola data perantara, seperti data shuffle dan spill, untuk mesin komputasi data besar. Topik ini menjelaskan cara men-deploy Celeborn di kluster Alibaba Cloud Container Service for Kubernetes (ACK) serta menggunakannya sebagai RSS untuk pekerjaan Spark.

Manfaat

Celeborn memberikan manfaat berikut untuk beban kerja data besar berbasis MapReduce, Spark, dan Flink:

  • Push-based shuffle: Mapper tidak perlu menyimpan data di disk lokal. Pendekatan ini sangat cocok untuk arsitektur cloud-native yang memisahkan penyimpanan dari komputasi.

  • Merge-based shuffle: Data digabungkan di worker, bukan di reducer, sehingga menghilangkan overhead jaringan akibat I/O file kecil acak dan transfer data kecil.

  • Ketersediaan tinggi: Master menggunakan protokol konsensus Raft untuk mencapai ketersediaan tinggi.

  • Toleransi kesalahan: Replika ganda secara signifikan mengurangi kemungkinan kegagalan fetch.

Prasyarat

Sebelum memulai, pastikan Anda telah menyelesaikan tugas-tugas berikut:

Lingkungan kluster

Buat dua kelompok node dengan konfigurasi berikut.

kelompok node celeborn-master

Parameter

Nilai

Nama kelompok node

celeborn-master

Jumlah node

3

Tipe instans Elastic Compute Service (ECS)

g8i.2xlarge

Label

celeborn.apache.org/role=master

Taints

celeborn.apache.org/role=master:NoSchedule

Penyimpanan data per master

/mnt/celeborn_ratis (1024 GB)

kelompok node celeborn-worker

Parameter

Nilai

Nama kelompok node

celeborn-worker

Jumlah node

5

Tipe instans ECS

g8i.4xlarge

Label

celeborn.apache.org/role=worker

Taints

celeborn.apache.org/role=worker:NoSchedule

Penyimpanan data per worker

/mnt/disk1 (1024 GB), /mnt/disk2 (1024 GB), /mnt/disk3 (1024 GB), /mnt/disk4 (1024 GB)

Ikhtisar prosedur

Langkah

Ringkasan

Langkah 1: Bangun gambar kontainer Celeborn

Unduh rilis Celeborn dan bangun gambar kontainer. Dorong gambar tersebut ke repositori Container Registry Anda.

Langkah 2: Deploy komponen ack-celeborn

Instal Helm chart ack-celeborn dari Marketplace Konsol ACK untuk men-deploy kluster Celeborn.

Langkah 3: Bangun gambar kontainer Spark

Bangun gambar Spark yang mencakup JAR klien Celeborn dan dependensi OSS. Dorong gambar tersebut ke repositori Container Registry Anda.

Langkah 4: Siapkan dan unggah data uji ke OSS

Buat set data uji PageRank dan unggah ke OSS.

Langkah 5: Buat Secret untuk menyimpan kredensial akses OSS

Buat Kubernetes Secret yang menyimpan kredensial untuk mengakses OSS.

Langkah 6: Kirim pekerjaan Spark contoh

Jalankan pekerjaan PageRank yang menggunakan Celeborn sebagai layanan shuffle-nya.

(Opsional) Langkah 7: Bersihkan lingkungan

Hapus pekerjaan Spark dan lepas sumber daya.

Langkah 1: Bangun gambar kontainer Celeborn

Unduh paket rilis Celeborn dari situs web resmi Celeborn, bangun gambar kontainer, lalu dorong ke repositori Container Registry Anda. Untuk informasi lebih lanjut tentang men-deploy Celeborn di Kubernetes, lihat Deploy Celeborn di Kubernetes.

Perintah docker buildx memerlukan Docker 19.03 atau versi yang lebih baru. Untuk informasi selengkapnya, lihat Instal Docker.

Ganti <IMAGE-REGISTRY> dan <IMAGE-REPOSITORY> dengan alamat Container Registry dan nama gambar Anda. Ubah variabel PLATFORMS untuk menentukan arsitektur target.

CELEBORN_VERSION=0.5.2               # Versi Celeborn.

IMAGE_REGISTRY=<IMAGE-REGISTRY>      # Alamat Container Registry, misalnya docker.io.
IMAGE_REPOSITORY=<IMAGE-REPOSITORY>  # Nama gambar, misalnya apache/celeborn.
IMAGE_TAG=${CELEBORN_VERSION}        # Tag gambar. Secara default menggunakan versi Celeborn.

# Unduh paket distribusi.
wget https://downloads.apache.org/celeborn/celeborn-${CELEBORN_VERSION}/apache-celeborn-${CELEBORN_VERSION}-bin.tgz

# Ekstrak paket.
tar -zxvf apache-celeborn-${CELEBORN_VERSION}-bin.tgz

# Masuk ke direktori kerja.
cd apache-celeborn-${CELEBORN_VERSION}-bin

# Bangun dan dorong gambar ke Container Registry.
docker buildx build \
    --output=type=registry \
    --push \
    --platform=${PLATFORMS} \
    --tag=${IMAGE_REGISTRY}/${IMAGE_REPOSITORY}:${IMAGE_TAG} \
    -f docker/Dockerfile \
    .

Langkah 2: Deploy komponen ack-celeborn

  1. Masuk ke Container Service Management Console atau . Di panel navigasi sebelah kiri, klik Marketplace > Marketplace.

  2. Pada halaman Marketplace, klik tab App Catalog. Temukan dan klik ack-celeborn. Pada halaman ack-celeborn, klik Deploy.

  3. Pada panel Deploy, pilih kluster dan namespace, pertahankan nama rilis default, lalu klik Next.

  4. Pada langkah Parameters, konfigurasikan parameter dan klik OK. YAML berikut menunjukkan contoh konfigurasi. Ganti alamat gambar dengan gambar yang Anda bangun di Langkah 1. Tabel berikut menjelaskan parameter utama. Untuk daftar lengkap, lihat bagian Parameters di halaman ack-celeborn.

    Pengaturan parameter

    Parameter

    Deskripsi

    Contoh

    image.registry

    Alamat Container Registry.

    "docker.io"

    image.repository

    Nama gambar.

    "apache/celeborn"

    image.tag

    Tag gambar.

    "0.5.2"

    image.pullPolicy

    Kebijakan penarikan gambar.

    "IfNotPresent"

    celeborn

    Properti konfigurasi Celeborn.

    Lihat contoh YAML di atas.

    master.replicas

    Jumlah pod master.

    3

    master.volumeMounts

    Titik mount volume di pod master.

    [{"mountPath": "/mnt/celeborn_ratis", "name": "celeborn-ratis"}]

    master.volumes

    Deklarasi volume untuk pod master. Hanya volume hostPath dan emptyDir yang didukung.

    [{"hostPath": {"path": "/mnt/celeborn_ratis", "type": "DirectoryOrCreate"}, "name": "celeborn-ratis"}]

    master.nodeSelector

    Selektor node untuk pod master.

    {}

    master.affinity

    Aturan afinitas untuk pod master.

    Pod anti-affinity berdasarkan hostname.

    master.tolerations

    Toleransi untuk pod master.

    []

    worker.replicas

    Jumlah pod worker.

    5

    worker.volumeMounts

    Titik mount volume di pod worker.

    [{"mountPath": "/mnt/disk1", "name": "disk1"}, ...]

    worker.volumes

    Deklarasi volume untuk pod worker. Hanya volume hostPath dan emptyDir yang didukung.

    [{"hostPath": "/mnt/disk1", "mountPath": "/mnt/disk1", "type": "hostPath", "diskType": "SSD", "capacity": "1024Gi"}, ...]

    worker.nodeSelector

    Selektor node untuk pod worker.

    {}

    worker.affinity

    Aturan afinitas untuk pod worker.

    Pod anti-affinity berdasarkan hostname.

    worker.tolerations

    Toleransi untuk pod worker.

    []

       image:                         # Ganti dengan gambar Celeborn dari Langkah 1.
         registry: docker.io          # Alamat Container Registry.
         repository: apache/celeborn  # Nama gambar.
         tag: 0.5.2                   # Tag gambar.
    
       celeborn:
         celeborn.client.push.stageEnd.timeout: 120s
         celeborn.master.ha.enabled: true
         celeborn.master.ha.ratis.raft.server.storage.dir: /mnt/celeborn_ratis
         celeborn.master.heartbeat.application.timeout: 300s
         celeborn.master.heartbeat.worker.timeout: 120s
         celeborn.master.http.port: 9098
         celeborn.metrics.enabled: true
         celeborn.metrics.prometheus.path: /metrics/prometheus
         celeborn.rpc.dispatcher.numThreads: 4
         celeborn.rpc.io.clientThreads: 64
         celeborn.rpc.io.numConnectionsPerPeer: 2
         celeborn.rpc.io.serverThreads: 64
         celeborn.shuffle.chunk.size: 8m
         celeborn.worker.fetch.io.threads: 32
         celeborn.worker.flusher.buffer.size: 256K
         celeborn.worker.http.port: 9096
         celeborn.worker.monitor.disk.enabled: false
         celeborn.worker.push.io.threads: 32
         celeborn.worker.storage.dirs: /mnt/disk1:disktype=SSD:capacity=1024Gi,/mnt/disk2:disktype=SSD:capacity=1024Gi,/mnt/disk3:disktype=SSD:capacity=1024Gi,/mnt/disk4:disktype=SSD:capacity=1024Gi
    
       master:
         replicas: 3
         env:
         - name: CELEBORN_MASTER_MEMORY
           value: 28g
         - name: CELEBORN_MASTER_JAVA_OPTS
           value: -XX:-PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:gc-master.out -Dio.netty.leakDetectionLevel=advanced
         - name: CELEBORN_NO_DAEMONIZE
           value: "1"
         - name: TZ
           value: Asia/Shanghai
         volumeMounts:
         - name: celeborn-ratis
           mountPath: /mnt/celeborn_ratis
         resources:
           requests:
             cpu: 7
             memory: 28Gi
           limits:
             cpu: 7
             memory: 28Gi
         volumes:
         - name: celeborn-ratis
           hostPath:
             path: /mnt/celeborn_ratis
             type: DirectoryOrCreate
         nodeSelector:
           celeborn.apache.org/role: master
         tolerations:
         - key: celeborn.apache.org/role
           operator: Equal
           value: master
           effect: NoSchedule
    
       worker:
         replicas: 5
         env:
         - name: CELEBORN_WORKER_MEMORY
           value: 28g
         - name: CELEBORN_WORKER_OFFHEAP_MEMORY
           value: 28g
         - name: CELEBORN_WORKER_JAVA_OPTS
           value: -XX:-PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:gc-worker.out -Dio.netty.leakDetectionLevel=advanced
         - name: CELEBORN_NO_DAEMONIZE
           value: "1"
         - name: TZ
           value: Asia/Shanghai
         volumeMounts:
         - name: disk1
           mountPath: /mnt/disk1
         - name: disk2
           mountPath: /mnt/disk2
         - name: disk3
           mountPath: /mnt/disk3
         - name: disk4
           mountPath: /mnt/disk4
         resources:
           requests:
             cpu: 14
             memory: 56Gi
           limits:
             cpu: 14
             memory: 56Gi
         volumes:
         - name: disk1
           hostPath:
             path: /mnt/disk1
             type: DirectoryOrCreate
         - name: disk2
           hostPath:
             path: /mnt/disk2
             type: DirectoryOrCreate
         - name: disk3
           hostPath:
             path: /mnt/disk3
             type: DirectoryOrCreate
         - name: disk4
           hostPath:
             path: /mnt/disk4
             type: DirectoryOrCreate
         nodeSelector:
           celeborn.apache.org/role: worker
         tolerations:
         - key: celeborn.apache.org/role
           operator: Equal
           value: worker
           effect: NoSchedule
  5. Verifikasi bahwa kluster Celeborn sedang berjalan. Jika pod gagal dimulai, lihat troubleshooting Pod. Output yang diharapkan:

       kubectl get -n celeborn statefulset
       NAME              READY   AGE
       celeborn-master   3/3     68s
       celeborn-worker   5/5     68s

Langkah 3: Bangun gambar kontainer Spark

Bangun gambar Spark yang mencakup JAR klien Celeborn dan JAR yang diperlukan untuk mengakses OSS. Lalu dorong gambar tersebut ke repositori Container Registry Anda.

Contoh ini menggunakan Spark 3.5.3. Buat Dockerfile dengan konten berikut dan ganti <SPARK_IMAGE> dengan gambar dasar Spark Anda.

ARG SPARK_IMAGE=<SPARK_IMAGE>  # Ganti <SPARK_IMAGE> dengan gambar dasar Spark Anda.

FROM ${SPARK_IMAGE}

# Tambahkan dependensi untuk dukungan Hadoop Aliyun OSS
ADD --chown=spark:spark --chmod=644 https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aliyun/3.3.4/hadoop-aliyun-3.3.4.jar ${SPARK_HOME}/jars
ADD --chown=spark:spark --chmod=644 https://repo1.maven.org/maven2/com/aliyun/oss/aliyun-sdk-oss/3.17.4/aliyun-sdk-oss-3.17.4.jar ${SPARK_HOME}/jars
ADD --chown=spark:spark --chmod=644 https://repo1.maven.org/maven2/org/jdom/jdom2/2.0.6.1/jdom2-2.0.6.1.jar ${SPARK_HOME}/jars

# Tambahkan dependensi klien Celeborn
ADD --chown=spark:spark --chmod=644 https://repo1.maven.org/maven2/org/apache/celeborn/celeborn-client-spark-3-shaded_2.12/0.5.1/celeborn-client-spark-3-shaded_2.12-0.5.1.jar ${SPARK_HOME}/jars
Versi JAR klien Celeborn (0.5.1) berbeda dari versi server Celeborn (0.5.2) yang di-deploy di Langkah 2. Klien versi 0.5.1 kompatibel dengan server versi 0.5.2. Gunakan versi JAR klien yang ditentukan di atas.

Langkah 4: Siapkan dan unggah data uji ke OSS

Buat set data uji PageRank dan unggah ke bucket OSS Anda. Untuk instruksi detail, lihat Siapkan dan unggah data uji ke bucket OSS.

Langkah 5: Buat Secret untuk menyimpan kredensial akses OSS

Buat Kubernetes Secret untuk menyimpan kredensial akses OSS. Untuk instruksi detail, lihat Buat Secret untuk menyimpan kredensial akses OSS.

Langkah 6: Kirim pekerjaan Spark contoh

Buat file bernama spark-pagerank.yaml dengan konten berikut.

Ganti placeholder berikut:

Placeholder

Deskripsi

Contoh

<SPARK_IMAGE>

Alamat gambar Spark dari Langkah 3.

registry.example.com/spark:3.5.3

<OSS_BUCKET>

Nama bucket OSS Anda.

my-bucket

<OSS_ENDPOINT>

Titik akhir bucket OSS Anda.

oss-cn-beijing-internal.aliyuncs.com

Untuk informasi lebih lanjut tentang konfigurasi Spark Celeborn, lihat dokumentasi Celeborn.

apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: spark-pagerank
  namespace: default
spec:
  type: Scala
  mode: cluster
  image: <SPARK_IMAGE>                                     # Gambar Spark.
  mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.3.jar
  mainClass: org.apache.spark.examples.SparkPageRank
  arguments:
  - oss://<OSS_BUCKET>/data/pagerank_dataset.txt           # Set data uji.
  - "10"                                                   # Jumlah iterasi.
  sparkVersion: 3.5.3
  hadoopConf:
    fs.AbstractFileSystem.oss.impl: org.apache.hadoop.fs.aliyun.oss.OSS
    fs.oss.impl: org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem
    fs.oss.endpoint: <OSS_ENDPOINT>                        # Titik akhir OSS.
    fs.oss.credentials.provider: com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider
  sparkConf:
    spark.shuffle.manager: org.apache.spark.shuffle.celeborn.SparkShuffleManager
    spark.serializer: org.apache.spark.serializer.KryoSerializer
    spark.celeborn.master.endpoints: celeborn-master-0.celeborn-master-svc.celeborn.svc.cluster.local,celeborn-master-1.celeborn-master-svc.celeborn.svc.cluster.local,celeborn-master-2.celeborn-master-svc.celeborn.svc.cluster.local
    spark.celeborn.client.spark.shuffle.writer: hash
    spark.celeborn.client.push.replicate.enabled: "false"
    spark.sql.adaptive.localShuffleReader.enabled: "false"
    spark.sql.adaptive.enabled: "true"
    spark.sql.adaptive.skewJoin.enabled: "true"
    spark.shuffle.sort.io.plugin.class: org.apache.spark.shuffle.celeborn.CelebornShuffleDataIO
    spark.dynamicAllocation.shuffleTracking.enabled: "false"
    spark.executor.userClassPathFirst: "false"
  driver:
    cores: 1
    coreLimit: 1200m
    memory: 512m
    serviceAccount: spark-operator-spark
    envFrom:
    - secretRef:
        name: spark-oss-secret
  executor:
    instances: 2
    cores: 1
    coreLimit: "2"
    memory: 8g
    envFrom:
    - secretRef:
        name: spark-oss-secret
  restartPolicy:
    type: Never

(Opsional) Langkah 7: Bersihkan lingkungan

Setelah menyelesaikan semua langkah, hapus pekerjaan Spark dan sumber daya terkait jika tidak lagi diperlukan.

Hapus pekerjaan Spark:

kubectl delete sparkapplication spark-pagerank

Hapus Secret:

kubectl delete secret spark-oss-secret

Referensi