全部产品
Search
文档中心

Container Service for Kubernetes:Baca dan tulis data OSS dalam pekerjaan Spark

更新时间:Jul 02, 2025

Topik ini menjelaskan cara menjalankan pekerjaan Spark di kluster Container Service for Kubernetes (ACK) dan mengonfigurasi pekerjaan tersebut untuk membaca serta menulis data dari bucket Object Storage Service (OSS) menggunakan pekerjaan PageRank bawaan sebagai contoh.

Prasyarat

Ikhtisar prosedur

Topik ini akan memandu Anda melalui langkah-langkah berikut untuk menjalankan pekerjaan Spark di kluster ACK dan mengonfigurasi operasi baca dan tulis untuk data OSS:

  1. Siapkan dan unggah set data uji ke bucket OSS: Hasilkan set data uji untuk pekerjaan PageRank dan unggah ke bucket OSS.

  2. Bangun gambar kontainer Spark: Sertakan dependensi JAR yang diperlukan untuk akses OSS dalam gambar kontainer Spark.

  3. Buat Secret untuk menyimpan kredensial akses OSS: Untuk melindungi data dari akses tidak sah, buat file YAML Secret untuk menyimpan kredensial yang digunakan oleh pekerjaan Spark untuk mengakses OSS.

  4. Kirim pekerjaan Spark: Buat dan kirim file konfigurasi pekerjaan Spark untuk menjalankan tugas pemrosesan data OSS.

  5. (Opsional) Pembersihan lingkungan: Hapus pekerjaan Spark dan sumber daya yang sudah selesai atau tidak lagi diperlukan untuk mengurangi biaya.

Langkah 1: Siapkan dan unggah data uji ke bucket OSS

Hasilkan set data uji untuk PageRank dan unggah ke bucket OSS yang ditentukan.

  1. Gunakan template YAML berikut untuk membuat file bernama generate_pagerank_dataset.sh. File ini akan digunakan untuk membuat set data uji:

    #!/bin/bash
    
    # Periksa jumlah argumen
    if [ "$#" -ne 2 ]; then
        echo "Penggunaan: $0 M N"
        echo "M: Jumlah halaman web"
        echo "N: Jumlah catatan yang akan dihasilkan"
        exit 1
    fi
    
    M=$1
    N=$2
    
    # Verifikasi apakah M dan N adalah bilangan bulat positif
    if ! [[ "$M" =~ ^[0-9]+$ ]] || ! [[ "$N" =~ ^[0-9]+$ ]]; then
        echo "Baik M maupun N harus bilangan bulat positif."
        exit 1
    fi
    
    # Hasilkan dataset
    for ((i=1; i<=$N; i++)); do
        # Pastikan halaman sumber dan tujuan berbeda
        while true; do
            src=$((RANDOM % M + 1))
            dst=$((RANDOM % M + 1))
            if [ "$src" -ne "$dst" ]; then
                echo "$src $dst"
                break
            fi
        done
    done
  2. Jalankan perintah berikut untuk membuat set data uji:

    M=100000    # Jumlah halaman web
    
    N=10000000  # Jumlah catatan
    
    # Hasilkan dataset secara acak dan simpan sebagai pagerank_dataset.txt
    bash generate_pagerank_dataset.sh $M $N > pagerank_dataset.txt
  3. Jalankan perintah berikut untuk mengunggah dataset yang dihasilkan ke direktori data/ di bucket OSS Anda:

    ossutil cp pagerank_dataset.txt oss://<BUCKET_NAME>/data/

Langkah 2: Bangun gambar kontainer Spark

Bangun gambar kontainer dengan dependensi JAR yang diperlukan untuk akses OSS. Anda dapat memilih Hadoop OSS SDK, Hadoop S3 SDK, atau JindoSDK. Untuk informasi lebih lanjut tentang cara membangun gambar dengan Container Registry, lihat Gunakan instance Enterprise Edition Container Registry untuk membangun gambar.

Catatan
  • Gambar Spark yang digunakan dalam Dockerfile sampel berasal dari komunitas open source. Anda dapat menggantinya dengan gambar Spark Anda sendiri sesuai kebutuhan.

  • Pilih versi Hadoop OSS SDK, Hadoop S3 SDK, atau JindoSDK yang sesuai berdasarkan versi Spark Anda.

Gunakan Hadoop OSS SDK

Dalam contoh ini, Spark 3.5.5 dan Hadoop OSS SDK 3.3.4 digunakan. Buat Dockerfile dengan kode sampel berikut:

ARG SPARK_IMAGE=spark:3.5.5

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

Gunakan Hadoop S3 SDK

Dalam contoh ini, Spark 3.5.5 dan Hadoop S3 SDK 3.3.4 digunakan. Buat Dockerfile dengan kode sampel berikut:

ARG SPARK_IMAGE=spark:3.5.5

FROM ${SPARK_IMAGE}

# Tambahkan dependensi untuk dukungan Hadoop AWS S3
ADD --chown=spark:spark --chmod=644 https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.3.4/hadoop-aws-3.3.4.jar ${SPARK_HOME}/jars
ADD --chown=spark:spark --chmod=644 https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.12.367/aws-java-sdk-bundle-1.12.367.jar ${SPARK_HOME}/jars

Gunakan JindoSDK

Dalam contoh ini, Spark 3.5.5 dan JindoSDK 6.8.0 digunakan. Buat Dockerfile dengan kode sampel berikut:

ARG SPARK_IMAGE=spark:3.5.5

FROM ${SPARK_IMAGE}

# Tambahkan dependensi untuk dukungan JindoSDK
ADD --chown=spark:spark --chmod=644 https://jindodata-binary.oss-cn-shanghai.aliyuncs.com/mvn-repo/com/aliyun/jindodata/jindo-core/6.8.0/jindo-core-6.8.0.jar ${SPARK_HOME}/jars
ADD --chown=spark:spark --chmod=644 https://jindodata-binary.oss-cn-shanghai.aliyuncs.com/mvn-repo/com/aliyun/jindodata/jindo-sdk/6.8.0/jindo-sdk-6.8.0.jar ${SPARK_HOME}/jars

Langkah 3: Buat secret untuk menyimpan kredensial akses OSS

Untuk akses data OSS yang aman dalam pekerjaan Spark, konfigurasikan kredensial akses OSS dan simpan dalam Secret Kubernetes untuk menghindari pengkodean langsung ke dalam pekerjaan Anda. Simpan Secret sebagai variabel lingkungan dalam kontainer.

Gunakan Hadoop OSS SDK

  1. Buat file YAML Secret bernama spark-oss-secret.yaml untuk menyimpan kredensial yang digunakan untuk mengakses OSS:

    apiVersion: v1
    kind: Secret
    metadata:
      name: spark-oss-secret
      namespace: default
    stringData:
      # Ganti <ACCESS_KEY_ID> dengan ID AccessKey akun Alibaba Cloud Anda.
      OSS_ACCESS_KEY_ID: <ACCESS_KEY_ID>
      # Ganti <ACCESS_KEY_SECRET> dengan Secret AccessKey akun Alibaba Cloud Anda.
      OSS_ACCESS_KEY_SECRET: <ACCESS_KEY_SECRET>
  2. Jalankan perintah berikut untuk membuat Secret:

    kubectl apply -f spark-oss-secret.yaml

    Output yang diharapkan:

    secret/spark-oss-secret created

Gunakan Hadoop S3 SDK

  1. Buat file YAML Secret bernama spark-s3-secret.yaml untuk menyimpan kredensial yang digunakan untuk mengakses OSS:

    apiVersion: v1
    kind: Secret
    metadata:
      name: spark-s3-secret
      namespace: default
    stringData:
      # Ganti <ACCESS_KEY_ID> dengan ID AccessKey akun Alibaba Cloud Anda.
      AWS_ACCESS_KEY_ID: <ACCESS_KEY_ID> 
      # Ganti <ACCESS_KEY_SECRET> dengan Secret AccessKey akun Alibaba Cloud Anda.
      AWS_SECRET_ACCESS_KEY: <ACCESS_KEY_SECRET>
  2. Jalankan perintah berikut untuk membuat Secret:

    kubectl apply -f spark-s3-secret.yaml

    Output yang diharapkan:

    secret/spark-s3-secret created

Gunakan JindoSDK

  1. Buat file YAML Secret bernama spark-oss-secret.yaml untuk menyimpan kredensial yang digunakan untuk mengakses OSS:

    apiVersion: v1
    kind: Secret
    metadata:
      name: spark-oss-secret
      namespace: default
    stringData:
      # Ganti <ACCESS_KEY_ID> dengan ID AccessKey akun Alibaba Cloud Anda.
      OSS_ACCESS_KEY_ID: <ACCESS_KEY_ID>
      # Ganti <ACCESS_KEY_SECRET> dengan Secret AccessKey akun Alibaba Cloud Anda.
      OSS_ACCESS_KEY_SECRET: <ACCESS_KEY_SECRET>
  2. Jalankan perintah berikut untuk membuat Secret:

    kubectl apply -f spark-oss-secret.yaml

    Output yang diharapkan:

    secret/spark-oss-secret created

Langkah 4: Jalankan pekerjaan Spark

Kirim pekerjaan Spark di kluster ACK untuk membaca data dari dan menulis data ke bucket OSS.

Gunakan Hadoop OSS SDK

Buat file YAML aplikasi Spark bernama spark-pagerank.yaml. Untuk daftar lengkap parameter konfigurasi OSS, lihat modul Hadoop-Aliyun.

apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: spark-pagerank
  namespace: default
spec:
  type: Scala
  mode: cluster
  # Ganti <SPARK_IMAGE> dengan gambar kontainer Spark yang dibangun pada Langkah 2.
  image: <SPARK_IMAGE>
  mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.5.jar
  mainClass: org.apache.spark.examples.SparkPageRank
  arguments:
  - oss://<OSS_BUCKET>/data/pagerank_dataset.txt           # Tentukan set data uji input. Ganti <OSS_BUCKET> dengan nama bucket OSS Anda.
  - "10"                                                   # Jumlah iterasi.
  sparkVersion: 3.5.5
  hadoopConf:
    fs.AbstractFileSystem.oss.impl: org.apache.hadoop.fs.aliyun.oss.OSS
    fs.oss.impl: org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem
    # Titik akhir OSS. Ganti <OSS_ENDPOINT> dengan titik akhir OSS Anda.
    # Sebagai contoh, titik akhir internal untuk wilayah Beijing adalah oss-cn-beijing-internal.aliyuncs.com. 
    fs.oss.endpoint: <OSS_ENDPOINT>
    fs.oss.credentials.provider: com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider
  driver:
    cores: 1
    coreLimit: 1200m
    memory: 512m
    envFrom:
    - secretRef:
        name: spark-oss-secret               # Tentukan Secret yang digunakan untuk mengakses OSS.
    serviceAccount: spark-operator-spark
  executor:
    instances: 2
    cores: 1
    coreLimit: "2"
    memory: 8g
    envFrom:
    - secretRef: 
        name: spark-oss-secret               # Tentukan Secret yang digunakan untuk mengakses OSS.
  restartPolicy:
    type: Never

Gunakan Hadoop S3 SDK

Buat file YAML aplikasi Spark bernama spark-pagerank.yaml. Untuk daftar lengkap parameter konfigurasi S3, lihat modul Hadoop-AWS.

apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: spark-pagerank
  namespace: default
spec:
  type: Scala
  mode: cluster
  # Ganti <SPARK_IMAGE> dengan gambar kontainer Spark yang dibangun pada Langkah 2.
  image: <SPARK_IMAGE>
  mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.5.jar
  mainClass: org.apache.spark.examples.SparkPageRank
  arguments:
  - s3a://<OSS_BUCKET>/data/pagerank_dataset.txt           # Tentukan set data uji input. Ganti <OSS_BUCKET> dengan nama bucket OSS Anda.
  - "10"                                                   # Jumlah iterasi.
  sparkVersion: 3.5.5
  hadoopConf:
    fs.s3a.impl: org.apache.hadoop.fs.s3a.S3AFileSystem
    # Titik akhir OSS. Ganti <OSS_ENDPOINT> dengan titik akhir OSS Anda.
    # Sebagai contoh, titik akhir internal untuk wilayah Beijing adalah oss-cn-beijing-internal.aliyuncs.com.
    fs.s3a.endpoint: <OSS_ENDPOINT>
    # Wilayah tempat titik akhir OSS berada. Sebagai contoh, cn-beijing untuk wilayah Beijing.
    fs.s3a.endpoint.region: <OSS_REGION>
  driver:
    cores: 1
    coreLimit: 1200m
    memory: 512m
    envFrom:
    - secretRef:
        name: spark-s3-secret               # Tentukan Secret yang digunakan untuk mengakses OSS.
    serviceAccount: spark-operator-spark
  executor:
    instances: 2
    cores: 1
    coreLimit: "2"
    memory: 8g
    envFrom:
    - secretRef: 
        name: spark-s3-secret               # Tentukan Secret yang digunakan untuk mengakses OSS.
  restartPolicy:
    type: Never

Gunakan JindoSDK

Simpan manifes SparkApplication berikut sebagai spark-pagerank.yaml.

apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: spark-pagerank
  namespace: default
spec:
  type: Scala
  mode: cluster
  # Ganti <SPARK_IMAGE> dengan gambar kontainer Spark yang dibangun pada Langkah 2.
  image: <SPARK_IMAGE>
  mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.5.jar
  mainClass: org.apache.spark.examples.SparkPageRank
  arguments:
  - oss://<OSS_BUCKET>/data/pagerank_dataset.txt    # Tentukan set data uji input. Ganti <OSS_BUCKET> dengan nama bucket OSS Anda.
  - "10"                                            # Jumlah iterasi.
  sparkVersion: 3.5.5
  hadoopConf:
    fs.AbstractFileSystem.oss.impl: com.aliyun.jindodata.oss.JindoOSS
    fs.oss.impl: com.aliyun.jindodata.oss.JindoOssFileSystem
    fs.oss.endpoint: <OSS_ENDPOINT>                 # Titik akhir internal untuk wilayah China (Beijing) adalah oss-cn-beijing-internal.aliyuncs.com.
    fs.oss.credentials.provider: com.aliyun.jindodata.oss.auth.EnvironmentVariableCredentialsProvider
  driver:
    cores: 1
    coreLimit: 1200m
    memory: 512m
    serviceAccount: spark-operator-spark
    envFrom:
    - secretRef:
        name: spark-oss-secret                    # Tentukan Secret yang digunakan untuk mengakses OSS.
  executor: 
    instances: 2
    cores: 1
    coreLimit: "2"
    memory: 8g
    envFrom:
    - secretRef:
        name: spark-oss-secret                    # Tentukan Secret yang digunakan untuk mengakses OSS.
  restartPolicy:
    type: Never
  1. Jalankan perintah berikut untuk mengirim pekerjaan Spark:

    kubectl apply -f spark-pagerank.yaml
  2. Jalankan perintah berikut untuk memantau status pekerjaan Spark:

    kubectl get sparkapplications spark-pagerank

    Output yang diharapkan:

    NAME             STATUS      ATTEMPTS   START                  FINISH                 AGE
    spark-pagerank   COMPLETED   1          2024-10-09T12:54:25Z   2024-10-09T12:55:46Z   90s
  3. Jalankan perintah berikut untuk melihat 20 entri log terakhir dari pod driver:

    kubectl logs spark-pagerank-driver --tail=20

    Output yang diharapkan:

    Gunakan Hadoop OSS SDK

    Log menunjukkan bahwa pekerjaan Spark telah berhasil dieksekusi.

    30024 memiliki rank:  1.0709659078941967 .
    21390 memiliki rank:  0.9933356174074005 .
    28500 memiliki rank:  1.0404018494028928 .
    2137 memiliki rank:  0.9931000490520374 .
    3406 memiliki rank:  0.9562543137167121 .
    20904 memiliki rank:  0.8827028621652337 .
    25604 memiliki rank:  1.0270134041934191 .
    24/10/09 12:48:36 INFO SparkUI: Stopped Spark web UI at http://spark-pagerank-dd0d4d927151c9d0-driver-svc.default.svc:4040
    24/10/09 12:48:36 INFO KubernetesClusterSchedulerBackend: Shutting down all executors
    24/10/09 12:48:36 INFO KubernetesClusterSchedulerBackend$KubernetesDriverEndpoint: Asking each executor to shut down
    24/10/09 12:48:36 WARN ExecutorPodsWatchSnapshotSource: Kubernetes client has been closed.
    24/10/09 12:48:36 INFO MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!
    24/10/09 12:48:36 INFO MemoryStore: MemoryStore cleared
    24/10/09 12:48:36 INFO BlockManager: BlockManager stopped
    24/10/09 12:48:36 INFO BlockManagerMaster: BlockManagerMaster stopped
    24/10/09 12:48:36 INFO OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped!
    24/10/09 12:48:36 INFO SparkContext: Successfully stopped SparkContext
    24/10/09 12:48:36 INFO ShutdownHookManager: Shutdown hook called
    24/10/09 12:48:36 INFO ShutdownHookManager: Deleting directory /tmp/spark-e8b8c2ab-c916-4f84-b60f-f54c0de3a7f0
    24/10/09 12:48:36 INFO ShutdownHookManager: Deleting directory /var/data/spark-c5917d98-06fb-46fe-85bc-199b839cb885/spark-23e2c2ae-4754-43ae-854d-2752eb83b2c5

    Gunakan Hadoop S3 SDK

    3406 memiliki rank:  0.9562543137167121 .
    20904 memiliki rank:  0.8827028621652337 .
    25604 memiliki rank:  1.0270134041934191 .
    25/04/07 03:54:11 INFO SparkContext: SparkContext is stopping with exitCode 0.
    25/04/07 03:54:11 INFO SparkUI: Stopped Spark web UI at http://spark-pagerank-0f7dec960e615617-driver-svc.spark.svc:4040
    25/04/07 03:54:11 INFO KubernetesClusterSchedulerBackend: Shutting down all executors
    25/04/07 03:54:11 INFO KubernetesClusterSchedulerBackend$KubernetesDriverEndpoint: Asking each executor to shut down
    25/04/07 03:54:11 WARN ExecutorPodsWatchSnapshotSource: Kubernetes client has been closed.
    25/04/07 03:54:11 INFO MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!
    25/04/07 03:54:11 INFO MemoryStore: MemoryStore cleared
    25/04/07 03:54:11 INFO BlockManager: BlockManager stopped
    25/04/07 03:54:11 INFO BlockManagerMaster: BlockManagerMaster stopped
    25/04/07 03:54:11 INFO OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped!
    25/04/07 03:54:11 INFO SparkContext: Successfully stopped SparkContext
    25/04/07 03:54:11 INFO ShutdownHookManager: Shutdown hook called
    25/04/07 03:54:11 INFO ShutdownHookManager: Deleting directory /var/data/spark-20d425bb-f442-4b0a-83e2-5a0202959a54/spark-ff5bbf08-4343-4a7a-9ce0-3f7c127cf4a9
    25/04/07 03:54:11 INFO ShutdownHookManager: Deleting directory /tmp/spark-a421839a-07af-49c0-b637-f15f76c3e752
    25/04/07 03:54:11 INFO MetricsSystemImpl: Stopping s3a-file-system metrics system...
    25/04/07 03:54:11 INFO MetricsSystemImpl: s3a-file-system metrics system stopped.
    25/04/07 03:54:11 INFO MetricsSystemImpl: s3a-file-system metrics system shutdown complete.

    Gunakan JindoSDK

    Log menunjukkan bahwa pekerjaan Spark telah berhasil dieksekusi.

    21390 memiliki rank:  0.9933356174074005 .
    28500 memiliki rank:  1.0404018494028928 .
    2137 memiliki rank:  0.9931000490520374 .
    3406 memiliki rank:  0.9562543137167121 .
    20904 memiliki rank:  0.8827028621652337 .
    25604 memiliki rank:  1.0270134041934191 .
    24/10/09 12:55:44 INFO SparkContext: SparkContext is stopping with exitCode 0.
    24/10/09 12:55:44 INFO SparkUI: Stopped Spark web UI at http://spark-pagerank-6a5e3d9271584856-driver-svc.default.svc:4040
    24/10/09 12:55:44 INFO KubernetesClusterSchedulerBackend: Shutting down all executors
    24/10/09 12:55:44 INFO KubernetesClusterSchedulerBackend$KubernetesDriverEndpoint: Asking each executor to shut down
    24/10/09 12:55:44 WARN ExecutorPodsWatchSnapshotSource: Kubernetes client has been closed.
    24/10/09 12:55:45 INFO MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped!
    24/10/09 12:55:45 INFO MemoryStore: MemoryStore cleared
    24/10/09 12:55:45 INFO BlockManager: BlockManager stopped
    24/10/09 12:55:45 INFO BlockManagerMaster: BlockManagerMaster stopped
    24/10/09 12:55:45 INFO OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped!
    24/10/09 12:55:45 INFO SparkContext: Successfully stopped SparkContext
    24/10/09 12:55:45 INFO ShutdownHookManager: Shutdown hook called
    24/10/09 12:55:45 INFO ShutdownHookManager: Deleting directory /var/data/spark-87e8406e-06a7-4b4a-b18f-2193da299d35/spark-093a1b71-121a-4367-9d22-ad4e397c9815
    24/10/09 12:55:45 INFO ShutdownHookManager: Deleting directory /tmp/spark-723e2039-a493-49e8-b86d-fff5fd1bb168

(Opsional) Langkah 5: Pembersihan lingkungan

Setelah Anda menyelesaikan tutorial ini, Anda dapat melepaskan sumber daya yang tidak lagi diperlukan.

Jalankan perintah berikut untuk menghapus pekerjaan Spark:

kubectl delete -f spark-pagerank.yaml

Jalankan perintah berikut untuk menghapus Secret:

Gunakan Hadoop OSS SDK

kubectl delete -f spark-oss-secret.yaml

Gunakan Hadoop S3 SDK

kubectl delete -f spark-s3-secret.yaml

Gunakan JindoSDK

kubectl delete -f spark-oss-secret.yaml

Referensi