All Products
Search
Document Center

Elastic Container Instance:Jalankan pekerjaan Spark di ECI

Last Updated:Jun 17, 2026

Menjalankan pekerjaan Spark di ECI dalam kluster Kubernetes menyediakan penskalaan otomatis, penyebaran otomatis, dan ketersediaan tinggi untuk meningkatkan efisiensi serta stabilitas. Instal Spark Operator di kluster ACK Serverless untuk menjalankan dan mengelola pekerjaan Spark di ECI.

Latar Belakang

Apache Spark adalah proyek open-source yang banyak digunakan dalam analitik data, khususnya untuk beban kerja data besar dan pembelajaran mesin. Sejak versi Apache Spark 2.3.0, Anda dapat menjalankan dan mengelola resource Spark di Kubernetes.

Spark Operator, yang dirancang khusus untuk Spark di Kubernetes, memungkinkan Anda mengirimkan pekerjaan Spark ke kluster Kubernetes dengan mendefinisikannya sebagai Custom Resource Definitions (CRDs). Spark Operator menawarkan keunggulan berikut:

  • Mengatasi keterbatasan dukungan native Spark untuk Kubernetes.

  • Memungkinkan integrasi cepat dengan komponen dalam ekosistem Kubernetes, seperti penyimpanan, pemantauan, dan logging.

  • Mendukung fitur-fitur Kubernetes lanjutan seperti pemulihan kegagalan, penskalaan otomatis, dan optimasi penjadwalan.

Prasyarat

  1. Buat kluster ACK Serverless.

    Buat kluster ACK Serverless di Konsol Container Service for Kubernetes. Untuk informasi lebih lanjut, lihat Buat kluster ACK Serverless.

    Penting

    Jika Anda perlu menarik gambar dari internet atau pekerjaan pelatihan Anda memerlukan akses internet, konfigurasikan NAT Gateway.

    Anda dapat menggunakan kubectl untuk mengelola dan mengakses kluster ACK Serverless sebagai berikut:

  2. Buat bucket OSS.

    Anda perlu membuat bucket OSS untuk menyimpan data uji, hasil uji, dan log. Untuk informasi lebih lanjut, lihat Buat bucket.

Instal Spark Operator

  1. Instal Spark Operator.

    1. Di panel navigasi sebelah kiri Konsol ACK, pilih Marketplace > Marketplace.

    2. Di tab App Catalog, temukan dan klik ack-spark-operator.

    3. Di pojok kanan atas, klik Deploy.

    4. Di panel yang muncul, pilih kluster target dan lengkapi konfigurasi sesuai petunjuk.

  2. Buat ServiceAccount, Role, dan RoleBinding.

    Pekerjaan Spark memerlukan ServiceAccount dengan izin untuk membuat pod. Buat ServiceAccount, Role, dan RoleBinding menggunakan manifes YAML berikut. Sesuaikan namespace sesuai kebutuhan.

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: spark
      namespace: default
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: default
      name: spark-role
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["*"]
    - apiGroups: [""]
      resources: ["services"]
      verbs: ["*"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: spark-role-binding
      namespace: default
    subjects:
    - kind: ServiceAccount
      name: spark
      namespace: default
    roleRef:
      kind: Role
      name: spark-role
      apiGroup: rbac.authorization.k8s.io

Buat gambar pekerjaan Spark

Kompilasi paket JAR pekerjaan Spark Anda dan masukkan ke dalam gambar menggunakan Dockerfile.

Dockerfile berikut didasarkan pada gambar dasar Spark yang disediakan oleh Alibaba Cloud Container Service:

FROM registry.aliyuncs.com/acs/spark:ack-2.4.5-latest
RUN mkdir -p /opt/spark/jars
# Jika Anda perlu menggunakan OSS (misalnya, untuk membaca data dari atau menulis event ke OSS), tambahkan paket JAR berikut ke dalam gambar.
ADD https://repo1.maven.org/maven2/com/aliyun/odps/hadoop-fs-oss/3.3.8-public/hadoop-fs-oss-3.3.8-public.jar $SPARK_HOME/jars
ADD https://repo1.maven.org/maven2/com/aliyun/oss/aliyun-sdk-oss/3.8.1/aliyun-sdk-oss-3.8.1.jar $SPARK_HOME/jars
ADD https://repo1.maven.org/maven2/org/aspectj/aspectjweaver/1.9.5/aspectjweaver-1.9.5.jar $SPARK_HOME/jars
ADD https://repo1.maven.org/maven2/org/jdom/jdom/1.1.3/jdom-1.1.3.jar $SPARK_HOME/jars
COPY SparkExampleScala-assembly-0.1.jar /opt/spark/jars
Penting

Menarik gambar Spark yang besar dapat memakan waktu lama. Anda dapat menggunakan ImageCache untuk mempercepat proses tarik gambar. Untuk informasi lebih lanjut, lihat Kelola ImageCache dan Gunakan ImageCache untuk mempercepat pembuatan pod.

Alibaba Cloud menyediakan gambar dasar untuk Spark 2.4.5 yang dioptimalkan untuk penjadwalan dan elastisitas Kubernetes, yang secara signifikan meningkatkan kecepatan penjadwalan dan startup. Aktifkan optimasi ini dengan mengatur variabel enableAlibabaCloudFeatureGates: true di Helm chart. Untuk startup yang lebih cepat lagi, atur enableWebhook: false.

operatorImageName: registry.aliyuncs.com/acs/spark-operator
operatorImageVersion: ack-2.4.5-latest
operatorVersion: v2.4.5-v1beta2
imagePullPolicy: IfNotPresent
rbac:
  create: true
serviceAccounts:
  spark:
    create: true
    name: spark
  sparkoperator:
    create: true
    name: ack-spark-operator
sparkJobNamespace: "default"
enableWebhook: false
enableMetrics: true
enableAlibabaCloudFeatureGates: false

Buat dan kirimkan manifes pekerjaan

Buat file konfigurasi YAML untuk pekerjaan Spark dan terapkan.

  1. Buat file spark-pi.yaml.

    Berikut adalah contoh manifes pekerjaan. Untuk informasi lebih lanjut, lihat spark-on-k8s-operator.

    apiVersion: "sparkoperator.k8s.io/v1beta2"
    kind: SparkApplication
    metadata:
      name: spark-pi
      namespace: default
    spec:
      type: Scala
      mode: cluster
      image: "registry.aliyuncs.com/acs/spark:ack-2.4.5-latest"
      imagePullPolicy: Always
      mainClass: org.apache.spark.examples.SparkPi
      mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.11-2.4.5.jar"
      sparkVersion: "2.4.5"
      restartPolicy:
        type: Never
      driver:
        cores: 2
        coreLimit: "2"
        memory: "3g"
        memoryOverhead: "1g"
        labels:
          version: 2.4.5
        serviceAccount: spark
        annotations:
          k8s.aliyun.com/eci-kube-proxy-enabled: 'true'
          k8s.aliyun.com/eci-auto-imc: "true"
        tolerations:
        - key: "virtual-kubelet.io/provider"
          operator: "Exists"
      executor:
        cores: 2
        instances: 1
        memory: "3g"
        memoryOverhead: "1g"
        labels:
          version: 2.4.5
        annotations:
          k8s.aliyun.com/eci-kube-proxy-enabled: 'true'
          k8s.aliyun.com/eci-auto-imc: "true"
        tolerations:
        - key: "virtual-kubelet.io/provider"
          operator: "Exists"
  2. Terapkan pekerjaan komputasi Spark.

    kubectl apply -f spark-pi.yaml

Konfigurasikan pengumpulan log

Untuk mengumpulkan log output standar dari driver dan executor Spark, sisipkan variabel lingkungan ke bidang envVars mereka. Untuk informasi lebih lanjut, lihat Sesuaikan pengumpulan log untuk ECI.

envVars:
   aliyun_logs_test-stdout_project: test-k8s-spark
   aliyun_logs_test-stdout_machinegroup: k8s-group-app-spark
   aliyun_logs_test-stdout: stdout

Tetapkan variabel lingkungan ini untuk driver dan executor saat Anda mengirimkan pekerjaan. Setelah dikonfigurasi, lihat log yang dikumpulkan di tab Raw Logs Proyek terkait di Konsol Log Service. Entri log berisi bidang seperti __source__, __tag__:__hostname__, __tag__:__path__, __tag__:__user_defined_id__, dan __tag__:eci_id, serta konten log di bidang content.

Konfigurasikan history server

History server melacak dan mengaudit pekerjaan Spark. Tambahkan bidang SparkConf ke CRD SparkApplication untuk menulis event ke OSS. History server membaca event tersebut untuk menampilkan informasi pekerjaan. Contoh konfigurasi:

sparkConf:
   "spark.eventLog.enabled": "true"
   "spark.eventLog.dir": "oss://bigdatastore/spark-events"
   "spark.hadoop.fs.oss.impl": "org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem"
   # endpoint bucket oss seperti oss-cn-beijing.aliyuncs.com
   "spark.hadoop.fs.oss.endpoint": "oss-cn-beijing.aliyuncs.com"
   "spark.hadoop.fs.oss.accessKeySecret": ""
   "spark.hadoop.fs.oss.accessKeyId": ""
        

Alibaba Cloud juga menyediakan Helm chart spark-history-server. Cari ack-spark-history-server di halaman Marketplace > Marketplace di Konsol ACK dan instal. Saat instalasi, konfigurasikan informasi terkait OSS di bagian Parameters. Contoh:

oss:
  enableOSS: true
  # Masukkan accessKeyId Anda
  alibabaCloudAccessKeyId: ""
  # Masukkan accessKeySecret Anda
  alibabaCloudAccessKeySecret: ""
  # endpoint bucket oss seperti oss-cn-beijing.aliyuncs.com
  alibabaCloudOSSEndpoint: "oss-cn-beijing.aliyuncs.com"
  # path file oss seperti oss://bucket-name/path
  eventsDir: "oss://bigdatastore/spark-events"

Setelah instalasi, temukan titik akhir eksternal ack-spark-history-server di bawah Layanan di halaman detail kluster. Akses titik akhir ini untuk melihat pekerjaan yang diarsipkan. Halaman Spark History Server mencantumkan aplikasi Spark yang telah selesai dengan kolom seperti App ID, App Name, Started, Completed, Duration, Spark User, Last Updated, dan Event Log. Untuk mengunduh log event, klik Download di baris yang sesuai.

Lihat hasil pekerjaan

  1. Periksa status eksekusi pod.

    kubectl get pods

    Output yang diharapkan:

    NAME                            READY      STATUS     RESTARTS   AGE
    spark-pi-1547981232122-driver   1/1       Running    0          12s
    spark-pi-1547981232122-exec-1   1/1       Running    0          3s
  2. Lihat UI Spark secara real-time.

    kubectl port-forward spark-pi-1547981232122-driver 4040:4040
  3. Periksa status SparkApplication.

    kubectl describe sparkapplication spark-pi

    Output yang diharapkan:

    Name:         spark-pi
    Namespace:    default
    Labels:       <none>
    Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                    {"apiVersion":"sparkoperator.k8s.io/v1alpha1","kind":"SparkApplication","metadata":{"annotations":{},"name":"spark-pi","namespace":"default"...}}
    API Version:  sparkoperator.k8s.io/v1alpha1
    Kind:         SparkApplication
    Metadata:
      Creation Timestamp:  2019-01-20T10:47:08Z
      Generation:          1
      Resource Version:    4923532
      Self Link:           /apis/sparkoperator.k8s.io/v1alpha1/namespaces/default/sparkapplications/spark-pi
      UID:                 bbe7445c-1ca0-11e9-9ad4-062fd7c19a7b
    Spec:
      Deps:
      Driver:
        Core Limit:  200m
        Cores:       0.1
        Labels:
          Version:        2.4.0
        Memory:           512m
        Service Account:  spark
        Volume Mounts:
          Mount Path:  /tmp
          Name:        test-volume
      Executor:
        Cores:      1
        Instances:  1
        Labels:
          Version:  2.4.0
        Memory:     512m
        Volume Mounts:
          Mount Path:         /tmp
          Name:               test-volume
      Image:                  gcr.io/spark-operator/spark:v2.4.0
      Image Pull Policy:      Always
      Main Application File:  local:///opt/spark/examples/jars/spark-examples_2.11-2.4.0.jar
      Main Class:             org.apache.spark.examples.SparkPi
      Mode:                   cluster
      Restart Policy:
        Type:  Never
      Type:    Scala
      Volumes:
        Host Path:
          Path:  /tmp
          Type:  Directory
        Name:    test-volume
    Status:
      Application State:
        Error Message:
        State:          COMPLETED
      Driver Info:
        Pod Name:             spark-pi-driver
        Web UI Port:          31182
        Web UI Service Name:  spark-pi-ui-svc
      Execution Attempts:     1
      Executor State:
        Spark - Pi - 1547981232122 - Exec - 1:  COMPLETED
      Last Submission Attempt Time:             2019-01-20T10:47:14Z
      Spark Application Id:                     spark-application-1547981285779
      Submission Attempts:                      1
      Termination Time:                         2019-01-20T10:48:56Z
    Events:
      Type    Reason                     Age                 From            Message
      ----    ------                     ----                ----            -------
      Normal  SparkApplicationAdded      55m                 spark-operator  SparkApplication spark-pi was added, Enqueuing it for submission
      Normal  SparkApplicationSubmitted  55m                 spark-operator  SparkApplication spark-pi was submitted successfully
      Normal  SparkDriverPending         55m (x2 over 55m)   spark-operator  Driver spark-pi-driver is pending
      Normal  SparkExecutorPending       54m (x3 over 54m)   spark-operator  Executor spark-pi-1547981232122-exec-1 is pending
      Normal  SparkExecutorRunning       53m (x4 over 54m)   spark-operator  Executor spark-pi-1547981232122-exec-1 is running
      Normal  SparkDriverRunning         53m (x12 over 55m)  spark-operator  Driver spark-pi-driver is running
      Normal  SparkExecutorCompleted     53m (x2 over 53m)   spark-operator  Executor spark-pi-1547981232122-exec-1 completed
  4. Lihat log untuk melihat hasilnya.

    NAME                                      READY     STATUS      RESTARTS   AGE
    spark-pi-1547981232122-driver   0/1       Completed   0          1m

    Saat status SparkApplication adalah COMPLETED atau status pod driver Spark adalah Completed, lihat log untuk memeriksa hasilnya.

    kubectl logs spark-pi-1547981232122-driver
    Pi is roughly 3.152155760778804