すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Spark ジョブの RSS として Celeborn を使用

最終更新日:Jun 16, 2026

Celeborn は、リモートシャッフルサービス (RSS) として中間の シャッフルデータスピルデータ を管理します。Container Service for Kubernetes (ACK) クラスターにデプロイすることで、Spark ジョブで RSS を使用できます。

メリット

MapReduce、Spark、Flink などのビッグデータフレームワークに対し、RSS としての Celeborn は以下のメリットを提供します。

  • プッシュベースのシャッフル書き込み:マッパーノードはローカルディスクストレージをスキップするため、ストレージとコンピューティングの分離 を特徴とするクラウドネイティブアーキテクチャに最適です。

  • マージベースのシャッフル読み取り:データはリデューサーではなく ワーカー ノードでマージされるため、ランダムな小規模ファイルの I/O や、小規模な転送によるネットワークオーバーヘッドを回避できます。

  • 高可用性:Celeborn の マスター ノードは Raft プロトコルを使用して、高可用性 と安定性を実現します。

  • フォールトトレランスデュアルレプリカ により、フェッチ失敗の確率が大幅に減少します。

前提条件

クラスター環境

この例では、次の ACK クラスター設定を使用します。

  • マスター プロセスを、次の設定で celeborn-master ノードプール にデプロイします。

    • ノードプール 名:celeborn-master

    • ノード数:3

    • ECS インスタンスタイプ:g8i.2xlarge

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

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

    • ノードあたりのデータストレージ:/mnt/celeborn_ratis (1024 GB)

  • ワーカー プロセスを、次の設定で celeborn-worker ノードプール にデプロイします。

    • ノードプール 名:celeborn-worker

    • ノード数:5

    • ECS インスタンスタイプ:g8i.4xlarge

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

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

    • ノードあたりのデータストレージ:

      • /mnt/disk1 (1024 GB)

      • /mnt/disk2 (1024 GB)

      • /mnt/disk3 (1024 GB)

      • /mnt/disk4 (1024 GB)

手順の概要

ACK クラスターに Celeborn をデプロイし、サンプルの Spark ジョブを実行するには、次の手順に従います。

  1. Celeborn コンテナイメージ のビルド

    Celeborn の リリース をダウンロードし、コンテナイメージ をビルドして、それを イメージリポジトリ にプッシュし、ack-celeborn コンポーネントをデプロイします。

  2. ack-celeborn コンポーネントのデプロイ

    ACK マーケットプレイス の ack-celeborn Helm チャート を使用し、ビルドした コンテナイメージ で Celeborn クラスターをデプロイします。

  3. Spark コンテナイメージ のビルド

    Celeborn と OSS の依存関係を含む Spark コンテナイメージ をビルドし、それを イメージリポジトリ にプッシュします。

  4. テストデータの準備と OSS へのアップロード

    PageRank ジョブ用のテストデータセットを生成し、それを OSS にアップロードします。

  5. サンプル Spark ジョブの実行

    サンプルの PageRank ジョブを実行し、RSS として Celeborn を使用するように設定します。

  6. (オプション) リソースのクリーンアップ

    チュートリアル完了後、料金が発生しないように Spark ジョブやその他の不要なリソースをクリーンアップします。

ステップ 1: Celeborn コンテナイメージのビルド

Celeborn 公式 Web サイトから、必要な リリース (例:バージョン 0.5.2) をダウンロードします。<IMAGE-REGISTRY><IMAGE-REPOSITORY> をご使用のイメージレジストリとイメージ名に置き換えます。PLATFORMS を変更して、ターゲットアーキテクチャを設定できます。「Kubernetes での Celeborn のデプロイ」をご参照ください。docker buildx コマンドには Docker 19.03 以降が必要です。「Docker および Docker Compose のインストールと使用」をご参照ください。

CELEBORN_VERSION=0.5.2               # Celeborn のバージョン。

IMAGE_REGISTRY=<IMAGE-REGISTRY>      # イメージレジストリ (例:docker.io)。

IMAGE_REPOSITORY=<IMAGE-REPOSITORY>  # イメージ名 (例:apache/celeborn)。

IMAGE_TAG=${CELEBORN_VERSION}        # イメージタグ。この例では Celeborn のバージョンをタグとして使用します。

PLATFORMS=linux/amd64                # イメージプラットフォームのアーキテクチャ。複数のプラットフォームをサポートする場合は、カンマで区切ります (例:linux/amd64,linux/arm64)。

# リリースパッケージをダウンロードします。
wget https://downloads.apache.org/celeborn/celeborn-${CELEBORN_VERSION}/apache-celeborn-${CELEBORN_VERSION}-bin.tgz

# パッケージを展開します。
tar -zxvf apache-celeborn-${CELEBORN_VERSION}-bin.tgz

# 作業ディレクトリに移動します。
cd apache-celeborn-${CELEBORN_VERSION}-bin

# Docker Buildx を使用してイメージをビルドし、イメージリポジトリにプッシュします。
docker buildx build \
    --output=type=registry \
    --push \
    --platform=${PLATFORMS} \
    --tag=${IMAGE_REGISTRY}/${IMAGE_REPOSITORY}:${IMAGE_TAG} \
    -f docker/Dockerfile \
    .

ステップ 2: ack-celeborn コンポーネントのデプロイ

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[Marketplace] > [Marketplace] を選択します。

  2. Marketplace ページで、アプリカタログ タブをクリックし、[ack-celeborn] を選択します。[ack-celeborn] ページで、デプロイ をクリックします。

  3. 作成する パネルで、クラスターおよび名前空間を選択し、次へ をクリックします。

  4. パラメーター ページでパラメーターを設定し、OK をクリックします。

    image:                         # ステップ 1 でビルドした Celeborn イメージのアドレスに置き換えます。
      registry: docker.io          # イメージレジストリ。
      repository: apache/celeborn  # イメージ名。
      tag: 0.5.2                   # イメージタグ。
    
    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

    次の表に、主要なパラメーターを示します。完全なリストについては、ack-celeborn ページの ConfigMap セクションをご参照ください。

    パラメーター設定

    パラメーター

    説明

    image.registry

    イメージレジストリ のアドレス。

    "docker.io"

    image.repository

    イメージ名。

    "apache/celeborn"

    image.tag

    イメージタグ。

    "0.5.2"

    image.pullPolicy

    イメージプルポリシー。

    "IfNotPresent"

    celeborn

    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

    マスター Pod のレプリカ数。

    3

    master.volumeMounts

    マスターコンテナの volumeMounts

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

    master.volumes

    マスター Podvolumes

    hostPathemptyDir ボリュームタイプのみを使用できます。

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

    master.nodeSelector

    マスター PodnodeSelector

    {}

    master.affinity

    マスター Podaffinity ルール。

    {
      "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

    マスター Podtolerations

    []

    worker.replicas

    ワーカー Pod のレプリカ数。

    5

    worker.volumeMounts

    ワーカー コンテナの volumeMounts

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

    worker.volumes

    ワーカー Podvolumes

    hostPathemptyDir ボリュームタイプのみを使用できます。

    [
      {
        "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"
        }
      }
    ]

    worker.nodeSelector

    ワーカー PodnodeSelector

    {}

    worker.affinity

    ワーカー Podaffinity ルール。

    {
      "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

    ワーカー Podtolerations

    []

  1. Celeborn のデプロイが完了するまで待ちます。Pod の問題が発生した場合は、「Pod のトラブルシューティング」をご参照ください。

    kubectl get -n celeborn statefulset

    期待される出力:

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

ステップ 3: Spark コンテナイメージのビルド

この例では Spark 3.5.3 を使用します。次の内容で Dockerfile を作成し、コンテナイメージ をビルドして イメージリポジトリ にプッシュします。

ARG SPARK_IMAGE=<SPARK_IMAGE>  #  をご使用の Spark ベースイメージに置き換えます。

FROM ${SPARK_IMAGE}

# 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

# Celeborn の依存関係を追加します
ADD --chown=spark:spark --chmod=644 https://repo1.maven.org/maven2/org/apache/celeborn/celeborn-client-spark-3-shaded_2.12/0.5.2/celeborn-client-spark-3-shaded_2.12-0.5.2.jar ${SPARK_HOME}/jars

ステップ 4: OSS へのテストデータのアップロード

OSS にテストデータを準備してアップロードするには、「ステップ 1: テストデータの準備と OSS へのアップロード」をご参照ください。

ステップ 5: OSS Secret の作成

OSS アクセス認証情報 用の Secret を作成するには、「ステップ 3: OSS アクセス認証情報を格納する Secret の作成」をご参照ください。

ステップ 6: サンプル Spark ジョブの送信

以下の内容で、spark-pagerank.yaml という名前の SparkApplication マニフェストファイルを作成します。<SPARK_IMAGE>手順3: Spark コンテナイメージをビルドする のイメージに置き換え、<OSS_BUCKET><OSS_ENDPOINT> をご自身の OSS バケットエンドポイント に置き換えます。Spark の設定については、Celeborn ドキュメントをご参照ください。

apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: spark-pagerank
  namespace: default
spec:
  type: Scala
  mode: cluster
  image: <SPARK_IMAGE>                                     # Spark イメージ。  をご使用の 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           # 入力テストデータセット。  をご使用の OSS バケット名に置き換えます。
  - "10"                                                   # イテレーション数。
  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>                        # OSS エンドポイント。たとえば、中国 (北京) リージョンの OSS の内部エンドポイントは 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: "true"
    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

(オプション) ステップ 7: リソースのクリーンアップ

このチュートリアル完了後、料金が発生しないようにこれらのリソースを削除します。

Spark ジョブを削除します。

kubectl delete sparkapplication spark-pagerank

Secret リソースを削除します。

kubectl delete secret spark-oss-secret

関連ドキュメント