All Products
Search
Document Center

Container Service for Kubernetes:Kumpulkan log pekerjaan Spark dengan SLS

Last Updated:Jun 21, 2026

Menjalankan pekerjaan Spark di kluster Container Service for Kubernetes (ACK) menghasilkan volume log yang besar dan tersebar di berbagai Pod, sehingga menyulitkan pengelolaannya. Simple Log Service (SLS) menyediakan solusi terpadu untuk pengumpulan, pemrosesan, kueri, analisis, visualisasi, dan peringatan log. Topik ini menjelaskan cara menggunakan Simple Log Service (SLS) untuk mengelola log dari pekerjaan Spark yang dijalankan pada kluster ACK secara efisien.

Prasyarat

Ikhtisar

Topik ini memandu Anda melalui langkah-langkah berikut untuk mengonfigurasi SLS guna mengelola log sistem dan aplikasi yang dihasilkan oleh pekerjaan Spark Anda.

  1. Buat gambar kontainer Spark yang mencakup dependensi tata letak templat JSON log4j, lalu dorong gambar tersebut ke registri gambar kontainer Anda.

  2. Buat ConfigMap untuk mengonfigurasi Log4j2, atur tingkat log ke INFO, dan tetapkan format output log ke JSONL.

  3. Buat resource AliyunLogConfig. Simple Log Service kemudian akan membuat konfigurasi Logtail yang sesuai di Logstore yang ditentukan untuk mengumpulkan log dari pekerjaan Spark yang dikirimkan oleh operator Spark.

  4. Buat dan jalankan pekerjaan Spark contoh, verifikasi bahwa log Pod berada dalam format JSONL, serta tinjau definisi bidang-bidang utama.

  5. Login ke konsol Simple Log Service untuk melakukan kueri dan menganalisis log pekerjaan Spark dalam rentang waktu tertentu.

  6. (Opsional) Pembersihan: Setelah selesai menguji, hapus pekerjaan Spark dan resource lain yang telah Anda buat agar tidak dikenai biaya.

Langkah 1: Buat gambar kontainer Spark

Buat Dockerfile berikut (contoh ini menggunakan Spark 3.5.3) dan tambahkan dependensi yang diperlukan ke classpath Spark. Setelah proses build selesai, dorong gambar tersebut ke registri gambar kontainer Anda. Untuk menyederhanakan pengumpulan dan penguraian log, kami akan menggunakan format JSONL untuk output log.

ARG SPARK_IMAGE=<SPARK_IMAGE>  # Ganti <SPARK_IMAGE> dengan gambar dasar Spark Anda.
FROM ${SPARK_IMAGE}
# Tambahkan dependensi untuk log4j-layout-template-json
ADD --chown=spark:spark --chmod=644 https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-layout-template-json/2.24.1/log4j-layout-template-json-2.24.1.jar ${SPARK_HOME}/jars

Langkah 2: Konfigurasi log Log4j2

Buat file bernama spark-log-conf.yaml dengan konten berikut. Konfigurasi ini mengatur tingkat log ke INFO dan format output ke JSONL. Konfigurasi ini menggunakan Elastic Common Schema (ECS), yaitu format log standar, sebagai templat log. Untuk detail konfigurasi lebih lanjut, lihat Collect Log4j logs.

apiVersion: v1
kind: ConfigMap
metadata:
  name: spark-log-conf
  namespace: default
data:
  log4j2.properties: |
    # Atur semua hal untuk dicatat ke konsol dan file
    rootLogger.level = info
    rootLogger.appenderRefs = console, file
    rootLogger.appenderRef.console.ref = STDOUT
    rootLogger.appenderRef.file.ref = FileAppender
    appender.console.name = STDOUT
    appender.console.type = Console
    appender.console.layout.type = JsonTemplateLayout
    appender.console.layout.eventTemplateUri = classpath:EcsLayout.json
    appender.file.name = FileAppender
    appender.file.type = File
    appender.file.fileName = /opt/spark/logs/spark.log
    appender.file.layout.type = JsonTemplateLayout
    appender.file.layout.eventTemplateUri = classpath:EcsLayout.json

Jalankan perintah berikut untuk membuat resource ConfigMap.

kubectl apply -f spark-log-conf.yaml

Output yang diharapkan:

configmap/spark-log-conf created

Langkah 3: Buat konfigurasi Logtail

Buat file manifest AliyunLogConfig bernama aliyun-log-config.yaml dengan konten berikut. Ganti <SLS_PROJECT> dengan nama Proyek SLS Anda dan <SLS_LOGSTORE> dengan nama Logstore Anda. Untuk informasi lebih lanjut mengenai opsi konfigurasi, lihat Manage Logtail configurations by using AliyunLogConfig.

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  name: spark
  namespace: default
spec:
  # (Opsional) Nama Proyek tujuan. Nilai default: k8s-log-<Your_Cluster_ID>.
  project: <SLS_PROJECT>
  # Nama Logstore. Jika Logstore yang ditentukan belum ada, Simple Log Service akan membuatnya secara otomatis.
  logstore: <SLS_LOGSTORE>
  # Konfigurasi Logtail.
  logtailConfig:
    # Nama konfigurasi Logtail.
    configName: spark
    # Jenis sumber data. `file` menunjukkan log teks.
    inputType: file
    # Konfigurasi untuk input log.
    inputDetail:
      # Direktori tempat file log berada.
      logPath: /opt/spark/logs
      # Nama file log. Karakter wildcard didukung.
      filePattern: '*.log'
      # Pengkodean file log.
      fileEncoding: utf8
      # Jenis log.
      logType: json_log
      localStorage: true
      key:
      - content
      logBeginRegex: .*
      logTimezone: ''
      discardNonUtf8: false
      discardUnmatch: true
      preserve: true
      preserveDepth: 0
      regex: (.*)
      outputType: LogService
      topicFormat: none
      adjustTimezone: false
      enableRawLog: false
      # Kumpulkan log teks dari kontainer.
      dockerFile: true
      # Konfigurasi lanjutan.
      advanced:
        # Pratinjau metadata kontainer.
        collect_containers_flag: true
        # Konfigurasi pengumpulan Kubernetes.
        k8s:
          # Filter Pod berdasarkan label.
          IncludeK8sLabel:
            sparkoperator.k8s.io/launched-by-spark-operator: "true"
          # Filter kontainer berdasarkan nama.
          K8sContainerRegex: "^spark-kubernetes-(driver|executor)$"
          # Konfigurasi tag log tambahan.
          ExternalK8sLabelTag:
            spark-app-name: spark-app-name
            spark-version: spark-version
            spark-role: spark-role
            spark-app-selector: spark-app-selector
            sparkoperator.k8s.io/submission-id: sparkoperator.k8s.io/submission-id
      # Plugin pemrosesan log.
      plugin:
        processors:
        # Pemisahan log.
        - type: processor_split_log_string
          detail:
            SplitKey: content
            SplitSep: ''
        # Penguraian bidang JSON.
        - type: processor_json
          detail:
            ExpandArray: false
            ExpandConnector: ''
            ExpandDepth: 0
            IgnoreFirstConnector: false
            SourceKey: content
            KeepSource: false
            KeepSourceIfParseError: true
            NoKeyError: false
            UseSourceKeyAsPrefix: false
        # Ekstraksi timestamp log.
        - type: processor_strptime
          detail:
            SourceKey: '@timestamp'
            Format: '%Y-%m-%dT%H:%M:%S.%fZ'
            KeepSource: false
            AdjustUTCOffset: true
            UTCOffset: 0
            AlarmIfFail: false

Jalankan perintah berikut untuk membuat konfigurasi Logtail.

kubectl apply -f aliyun-log-config.yaml

Ikuti langkah-langkah berikut untuk melihat Logstore dan konfigurasi Logtail baru:

  1. Login ke konsol Simple Log Service.

  2. Pada bagian Projects, klik proyek yang diinginkan.

    image

  3. Pada tab Log Storage > Logstores, klik ikon > di depan logstore target, lalu pilih Data Collection > Logtail Configuration.

    Pada halaman Logtail configuration, daftar konfigurasi Logtail yang ada akan ditampilkan. Daftar tersebut mencakup konfigurasi bernama spark, yang dikaitkan dengan satu kelompok mesin.

  4. Klik konfigurasi Logtail target untuk melihat detailnya.

Langkah 4: Kirim pekerjaan Spark contoh

Buat file manifest SparkApplication bernama spark-pi.yaml dengan konten berikut.

apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
  name: spark-pi
  namespace: default
spec:
  type: Scala
  mode: cluster
  image: <SPARK_IMAGE>
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.3.jar
  arguments: 
  - "5000"
  sparkVersion: 3.5.3
  sparkConfigMap: spark-log-conf
  driver:
    cores: 1
    memory: 512m
    serviceAccount: spark-operator-spark
  executor:
    instances: 1
    cores: 1
    memory: 4g

Jalankan perintah berikut untuk mengirim pekerjaan.

kubectl apply -f spark-pi.yaml

Setelah pekerjaan selesai, tampilkan 10 baris terakhir dari log Pod driver.

kubectl logs  --tail=10 spark-pi-driver  

Output yang diharapkan:

{"@timestamp":"2024-11-20T11:45:48.487Z","ecs.version":"1.2.0","log.level":"WARN","message":"Kubernetes client has been closed.","process.thread.name":"-937428334-pool-19-thread-1","log.logger":"org.apache.spark.scheduler.cluster.k8s.ExecutorPodsWatchSnapshotSource"}
{"@timestamp":"2024-11-20T11:45:48.585Z","ecs.version":"1.2.0","log.level":"INFO","message":"MapOutputTrackerMasterEndpoint stopped!","process.thread.name":"dispatcher-event-loop-7","log.logger":"org.apache.spark.MapOutputTrackerMasterEndpoint"}
{"@timestamp":"2024-11-20T11:45:48.592Z","ecs.version":"1.2.0","log.level":"INFO","message":"MemoryStore cleared","process.thread.name":"main","log.logger":"org.apache.spark.storage.memory.MemoryStore"}
{"@timestamp":"2024-11-20T11:45:48.592Z","ecs.version":"1.2.0","log.level":"INFO","message":"BlockManager stopped","process.thread.name":"main","log.logger":"org.apache.spark.storage.BlockManager"}
{"@timestamp":"2024-11-20T11:45:48.596Z","ecs.version":"1.2.0","log.level":"INFO","message":"BlockManagerMaster stopped","process.thread.name":"main","log.logger":"org.apache.spark.storage.BlockManagerMaster"}
{"@timestamp":"2024-11-20T11:45:48.598Z","ecs.version":"1.2.0","log.level":"INFO","message":"OutputCommitCoordinator stopped!","process.thread.name":"dispatcher-event-loop-1","log.logger":"org.apache.spark.scheduler.OutputCommitCoordinator$OutputCommitCoordinatorEndpoint"}
{"@timestamp":"2024-11-20T11:45:48.602Z","ecs.version":"1.2.0","log.level":"INFO","message":"Successfully stopped SparkContext","process.thread.name":"main","log.logger":"org.apache.spark.SparkContext"}
{"@timestamp":"2024-11-20T11:45:48.604Z","ecs.version":"1.2.0","log.level":"INFO","message":"Shutdown hook called","process.thread.name":"shutdown-hook-0","log.logger":"org.apache.spark.util.ShutdownHookManager"}
{"@timestamp":"2024-11-20T11:45:48.604Z","ecs.version":"1.2.0","log.level":"INFO","message":"Deleting directory /var/data/spark-f783cf2e-44db-452c-83c9-738f9c894ef9/spark-2caa5814-bd32-431c-a9f9-a32208b34fbb","process.thread.name":"shutdown-hook-0","log.logger":"org.apache.spark.util.ShutdownHookManager"}
{"@timestamp":"2024-11-20T11:45:48.606Z","ecs.version":"1.2.0","log.level":"INFO","message":"Deleting directory /tmp/spark-dacdfd95-f166-4b23-9312-af9052730417","process.thread.name":"shutdown-hook-0","log.logger":"org.apache.spark.util.ShutdownHookManager"}

Log dicetak dalam format JSONL. Bidang-bidang tersebut dijelaskan sebagai berikut:

  • @timestamp: Waktu saat entri log dihasilkan.

  • ecs.version: Versi Elastic Common Schema (ECS). ECS adalah skema standar untuk data log.

  • log.level: Tingkat log.

  • message: Pesan log.

  • process.thread.name: Nama thread yang menghasilkan entri log.

  • log.logger: Nama logger yang mencatat entri log.

Langkah 5: Lakukan kueri dan analisis log Spark

Anda dapat merujuk ke panduan cepat untuk kueri dan analisis log untuk menentukan rentang waktu eksekusi pekerjaan dan memastikan bahwa log telah berhasil dikumpulkan.

Pada halaman kueri di konsol Simple Log Service, pilih Logstore spark, atur rentang waktu, lalu jalankan kueri. Pada tab Raw Logs, Anda dapat melihat log aplikasi Spark yang telah dikumpulkan. Entri log seperti peringatan tingkat WARN Unable to load native-hadoop library dan catatan tingkat INFO mengenai versi Spark (3.5.3), sistem operasi, serta versi Java dari fase startup, mengonfirmasi bahwa log berhasil dikumpulkan.

(Opsional) Langkah 6: Pembersihan

Jika Anda telah menyelesaikan tutorial ini dan tidak lagi memerlukan resource tersebut, jalankan perintah berikut untuk menghapusnya.

Jalankan perintah berikut untuk menghapus pekerjaan Spark.

kubectl delete -f spark-pi.yaml

Jalankan perintah berikut untuk menghapus konfigurasi Logtail.

kubectl delete -f aliyun-log-config.yaml

Jalankan perintah berikut untuk menghapus konfigurasi log Log4j2.

kubectl delete -f spark-log-conf.yaml