All Products
Search
Document Center

Container Service for Kubernetes:Gunakan Celeborn sebagai RSS untuk job Spark

Last Updated:Jun 16, 2026

Celeborn mengelola shuffle data dan spill data intermediate sebagai remote shuffle service (RSS). Deploy di kluster Container Service for Kubernetes (ACK) untuk menggunakan RSS pada Spark job.

Manfaat

Untuk framework data besar seperti MapReduce, Spark, dan Flink, Celeborn sebagai RSS menyediakan:

  • Penulisan shuffle berbasis push: Node mapper melewati penyimpanan disk lokal, ideal untuk arsitektur cloud-native dengan storage and compute separation.

  • Pembacaan shuffle berbasis merge: Data digabungkan di node worker alih-alih reducer, sehingga menghindari overhead I/O file kecil acak dan jaringan akibat transfer kecil.

  • high availability: Node master Celeborn menggunakan protokol Raft untuk high availability dan stabilitas.

  • fault tolerance: dual replicas secara signifikan mengurangi probabilitas kegagalan pengambilan data.

Prasyarat

Lingkungan kluster

Contoh ini menggunakan konfigurasi kluster ACK berikut:

  • Proses master dideploy ke node pool celeborn-master dengan konfigurasi berikut:

    • Nama node pool: celeborn-master

    • Jumlah node: 3

    • ECS instance type: g8i.2xlarge

    • label: celeborn.apache.org/role=master

    • taint: celeborn.apache.org/role=master:NoSchedule

    • Penyimpanan data per node: /mnt/celeborn_ratis (1.024 GB)

  • Proses worker dideploy ke node pool celeborn-worker dengan konfigurasi berikut:

    • Nama node pool: celeborn-worker

    • Jumlah node: 5

    • ECS instance type: g8i.4xlarge

    • label: celeborn.apache.org/role=worker

    • taint: celeborn.apache.org/role=worker:NoSchedule

    • Penyimpanan data per node:

      • /mnt/disk1 (1.024 GB)

      • /mnt/disk2 (1.024 GB)

      • /mnt/disk3 (1.024 GB)

      • /mnt/disk4 (1.024 GB)

Tinjauan prosedur

Lakukan langkah-langkah berikut untuk mendeploy Celeborn di kluster ACK dan menjalankan job Spark contoh.

  1. Buat container image Celeborn

    Unduh release Celeborn, buat container image, lalu dorong ke image repository Anda untuk mendeploy komponen ack-celeborn.

  2. Deploy komponen ack-celeborn

    Gunakan Helm chart ack-celeborn dari Marketplace ACK untuk mendeploy kluster Celeborn menggunakan container image yang telah Anda buat.

  3. Bangun Spark gambar kontainer

    Buat container image Spark dengan dependensi Celeborn dan OSS, lalu dorong ke image repository Anda.

  4. Siapkan dan unggah data uji ke OSS

    Hasilkan set data uji untuk job PageRank dan unggah ke OSS.

  5. Jalankan job Spark contoh

    Jalankan job PageRank contoh dan konfigurasikan agar menggunakan Celeborn sebagai RSS.

  6. (Opsional) Bersihkan resource

    Setelah tutorial selesai, bersihkan job Spark dan resource lain yang tidak diperlukan untuk menghindari biaya.

Langkah 1: Buat container image Celeborn

Unduh release yang diperlukan (misalnya, versi 0.5.2) dari situs web resmi Celeborn. Ganti <IMAGE-REGISTRY> dan <IMAGE-REPOSITORY> dengan registri dan nama image Anda. Anda dapat memodifikasi PLATFORMS untuk menetapkan arsitektur target. Lihat Deploy Celeborn on Kubernetes. Perintah docker buildx memerlukan Docker 19.03 atau yang lebih baru. Lihat Install and use Docker and Docker Compose.

CELEBORN_VERSION=0.5.2               # Versi Celeborn.

IMAGE_REGISTRY=<IMAGE-REGISTRY>      # Registri image, misalnya docker.io.

IMAGE_REPOSITORY=<IMAGE-REPOSITORY>  # Nama image, misalnya apache/celeborn.

IMAGE_TAG=${CELEBORN_VERSION}        # Tag image. Contoh ini menggunakan versi Celeborn sebagai tag.

PLATFORMS=linux/amd64                # Arsitektur platform image. Untuk mendukung beberapa platform, pisahkan dengan koma, misalnya linux/amd64,linux/arm64.

# Unduh paket release.
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

# Gunakan Docker Buildx untuk membuat image dan mendorongnya ke repositori image.
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 ACK console. Di panel navigasi kiri, klik Marketplace > Marketplace.

  2. Di halaman Marketplace, klik tab App Catalog, pilih ack-celeborn, lalu di halaman ack-celeborn, klik Deploy.

  3. Di panel Create, pilih kluster dan namespace, lalu klik Next.

  4. Di halaman Parameters, konfigurasikan parameter, lalu klik OK.

    image:                         # Ganti ini dengan alamat image Celeborn yang Anda buat di Langkah 1.
      registry: docker.io          # Registri image.
      repository: apache/celeborn  # Nama image.
      tag: 0.5.2                   # Tag image.
    
    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

    Tabel berikut menjelaskan parameter utama. Untuk daftar lengkap, lihat bagian ConfigMaps di halaman ack-celeborn.

    Pengaturan parameter

    Parameter

    Deskripsi

    Contoh

    image.registry

    Alamat image registry.

    "docker.io"

    image.repository

    Nama image.

    "apache/celeborn"

    image.tag

    Tag image.

    "0.5.2"

    image.pullPolicy

    Kebijakan pull image.

    "IfNotPresent"

    celeborn

    Properti konfigurasi 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

    Jumlah replika pod master.

    3

    master.volumeMounts

    volumeMounts untuk kontainer master.

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

    master.volumes

    Volume data untuk pod master.

    Hanya tipe volume hostPath dan emptyDir yang didukung.

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

    master.nodeSelector

    node selector untuk pod master.

    {}

    master.affinity

    Aturan affinity untuk pod master.

    {
      "podAntiAffinity": {
        "requiredDuringSchedulingIgnoredDuringExecution": [
          {
            "labelSelector": {
              "matchExpressions": [
                {
                  "key": "app.kubernetes.io/name",
                  "operator": "In",
                  "values": [
                    "celeborn"
                  ]
                },
                {
                  "key": "app.kubernetes.io/role",
                  "operator": "In",
                  "values": [
                    "master"
                  ]
                }
              ]
            },
            "topologyKey": "kubernetes.io/hostname"
          }
        ]
      }
    }

    master.tolerations

    tolerations untuk pod master.

    []

    worker.replicas

    Jumlah replika pod worker.

    5

    worker.volumeMounts

    volumeMounts untuk kontainer worker.

    [
      {
        "mountPath": "/mnt/disk1",
        "name": "disk1"
      },
      {
        "mountPath": "/mnt/disk2",
        "name": "disk2"
      },
      {
        "mountPath": "/mnt/disk3",
        "name": "disk3"
      },
      {
        "mountPath": "/mnt/disk4",
        "name": "disk4"
      }
    ]

    worker.volumes

    Volume data untuk pod worker.

    Hanya tipe volume hostPath dan emptyDir yang didukung.

    [
      {
        "capacity": "100Gi",
        "diskType": "SSD",
        "hostPath": "/mnt/disk1",
        "mountPath": "/mnt/disk1",
        "type": "hostPath"
      },
      {
        "capacity": "100Gi",
        "diskType": "SSD",
        "hostPath": "/mnt/disk2",
        "mountPath": "/mnt/disk2",
        "type": "hostPath"
      },
      {
        "capacity": "100Gi",
        "diskType": "SSD",
        "hostPath": "/mnt/disk3",
        "mountPath": "/mnt/disk3",
        "type": "hostPath"
      },
      {
        "capacity": "100Gi",
        "diskType": "SSD",
        "hostPath": "/mnt/disk4",
        "mountPath": "/mnt/disk4",
        "type": "hostPath"
      }
    ]

    worker.nodeSelector

    node selector untuk pod worker.

    {}

    worker.affinity

    Aturan affinity untuk pod worker.

    {
      "podAntiAffinity": {
        "requiredDuringSchedulingIgnoredDuringExecution": [
          {
            "labelSelector": {
              "matchExpressions": [
                {
                  "key": "app.kubernetes.io/name",
                  "operator": "In",
                  "values": [
                    "celeborn"
                  ]
                },
                {
                  "key": "app.kubernetes.io/role",
                  "operator": "In",
                  "values": [
                    "worker"
                  ]
                }
              ]
            },
            "topologyKey": "kubernetes.io/hostname"
          }
        ]
      }
    }

    worker.tolerations

    tolerations untuk pod worker.

    []

  1. Tunggu hingga deployment Celeborn selesai. Jika Anda mengalami masalah pod, lihat Pod troubleshooting.

    kubectl get -n celeborn statefulset 

    Output yang diharapkan:

    NAME              READY   AGE
    celeborn-master   3/3     68s
    celeborn-worker   5/5     68s

Langkah 3: Buat container image Spark

Contoh ini menggunakan Spark 3.5.3. Buat Dockerfile dengan konten berikut untuk membuat container image dan dorong ke image repository Anda.

ARG SPARK_IMAGE=<SPARK_IMAGE>  # Ganti <SPARK_IMAGE> dengan image 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 untuk 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

Langkah 4: Unggah data uji ke OSS

Untuk menyiapkan data uji dan mengunggahnya ke OSS, lihat Step 1: Prepare test data and upload it to OSS.

Langkah 5: Buat Secret OSS

Untuk membuat Secret untuk access credentials OSS, lihat Step 3: Create a Secret to store OSS access credentials.

Langkah 6: Submit job Spark contoh

Buat file manifest SparkApplication bernama spark-pagerank.yaml dengan konten berikut. Ganti <SPARK_IMAGE> dengan image Anda dari Langkah 3: Build a Spark container image, dan ganti <OSS_BUCKET> dan <OSS_ENDPOINT> dengan bucket OSS dan endpoint Anda. Untuk konfigurasi Spark, lihat dokumentasi Celeborn.

apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: spark-pagerank
  namespace: default
spec:
  type: Scala
  mode: cluster
  image: <SPARK_IMAGE>                                     # Image Spark. Ganti <SPARK_IMAGE> dengan nama image Spark Anda.
  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 input. Ganti <OSS_BUCKET> dengan nama bucket OSS Anda.
  - "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>                        # Endpoint OSS. Misalnya, endpoint internal untuk OSS di wilayah China (Beijing) adalah oss-cn-beijing-internal.aliyuncs.com. 
    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 resource

Setelah menyelesaikan tutorial ini, hapus resource berikut untuk menghindari biaya.

Hapus job Spark:

kubectl delete sparkapplication spark-pagerank

Hapus resource Secret:

kubectl delete secret spark-oss-secret

Referensi