全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan Simple Log Service untuk mengumpulkan log pekerjaan Spark

更新时间:Jul 02, 2025

Saat menjalankan pekerjaan Spark di kluster Container Service for Kubernetes (ACK), sejumlah besar log dihasilkan dan didistribusikan di berbagai pod. Hal ini mempersulit pengelolaan log. Anda dapat menggunakan Simple Log Service untuk mengumpulkan, memproses, menanyakan, menganalisis, dan memvisualisasikan log, serta menghasilkan peringatan. Ini memungkinkan Anda mengelola log Spark secara efisien. Topik ini menjelaskan cara menggunakan Simple Log Service untuk mengelola log pekerjaan Spark di kluster ACK.

Prasyarat

Ikhtisar Prosedur

Topik ini menjelaskan cara mengonfigurasi Simple Log Service untuk mengelola log sistem dan log bisnis yang dihasilkan oleh pekerjaan Spark.

  1. Buat gambar kontainer Spark: Buat gambar kontainer Spark yang berisi dependensi template tata letak JSON log4j dan dorong gambar tersebut ke repositori gambar Anda.

  2. Konfigurasikan log Log4j2: Buat ConfigMap untuk mengonfigurasi log Log4j2, atur tingkat log ke INFO, lalu atur format cetak log ke JSONL.

  3. Buat konfigurasi Logtail: Buat sumber daya AliyunConfig. Simple Log Service membuat konfigurasi Logtail di penyimpanan log yang ditentukan untuk mengumpulkan log pekerjaan Spark yang dikirimkan menggunakan Spark Operator.

  4. Kirim pekerjaan Spark contoh: Buat dan jalankan pekerjaan Spark contoh, periksa apakah output log pod dalam format JSONL, lalu jelaskan arti dari bidang tertentu.

  5. Tanyakan dan analisis log Spark: Masuk ke konsol Simple Log Service dan tanyakan serta analisis log pekerjaan Spark dalam periode waktu tertentu.

  6. (Opsional) Bersihkan lingkungan: Setelah pengujian selesai, hapus pekerjaan Spark dan sumber daya yang tidak diperlukan untuk mencegah biaya tambahan.

Langkah 1: Buat gambar kontainer Spark

Buat Dockerfile berikut dan tambahkan dependensi yang diperlukan ke classpath Spark. Dalam contoh ini, Spark 3.5.3 digunakan. Setelah gambar dibuat, dorong gambar tersebut ke repositori gambar Anda. Untuk memudahkan pengumpulan dan penguraian log, log dicetak dalam format JSONL.

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: Konfigurasikan log Log4j

Gunakan konten berikut untuk membuat file bernama spark-log-conf.yaml, atur tingkat log ke INFO, dan atur format pencetakan log ke format JSONL. Gunakan Elastic Common Schema (ECS) sebagai templat log, yang merupakan format log standar. Untuk informasi lebih lanjut, lihat Kumpulkan Log Log4j.

apiVersion: v1
kind: ConfigMap
metadata:
  name: spark-log-conf
  namespace: default
data:
  log4j2.properties: |
    # Atur semuanya 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 ConfigMap:

kubectl apply -f spark-log-conf.yaml

Output yang diharapkan:

configmap/spark-log-conf created

Langkah 3: Buat konfigurasi Logtail

Buat file manifes AliyunLogConfig bernama aliyun-log-config.yaml dengan menggunakan konten berikut. Ganti <SLS_PROJECT> dengan nama proyek Simple Log Service Anda dan <SLS_LOGSTORE> dengan nama penyimpanan log Simple Log Service Anda. Untuk informasi lebih lanjut tentang konfigurasi, lihat Gunakan AliyunLogConfig untuk Mengelola Konfigurasi Logtail.

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  name: spark
  namespace: default
spec:
  # (Opsional) Nama proyek. Nilai default: k8s-log-<Your_Cluster_ID>.
  project: <SLS_PROJECT>

  # Nama penyimpanan log. Jika penyimpanan log yang Anda tentukan tidak ada, Simple Log Service akan otomatis membuat penyimpanan log. 
  logstore: <SLS_LOGSTORE>
  
  # Konfigurasi Logtail. 
  logtailConfig:
    # Nama konfigurasi Logtail. 
    configName: spark

    # Jenis sumber data. Nilai file menentukan log teks.
    inputType: file

    # Konfigurasi masukan 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 Logtail di Kubernetes. 
        k8s:
          # Filter pod berdasarkan tag. 
          IncludeK8sLabel:
            sparkoperator.k8s.io/launched-by-spark-operator: "true"

          # Filter kontainer berdasarkan nama kontainer. 
          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:
        # Isolasi log. 
        - type: processor_split_log_string
          detail:
            SplitKey: content
            SplitSep: ''

        # Uraikan bidang JSON. 
        - type: processor_json
          detail:
            ExpandArray: false
            ExpandConnector: ''
            ExpandDepth: 0
            IgnoreFirstConnector: false
            SourceKey: content
            KeepSource: false
            KeepSourceIfParseError: true
            NoKeyError: false
            UseSourceKeyAsPrefix: false

        # Ekstrak cap waktu 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

Untuk melihat penyimpanan log baru dan konfigurasi Logtail, ikuti langkah-langkah berikut:

  1. Masuk ke konsol Simple Log Service.

  2. Di bagian Proyek, klik yang ingin Anda kelola.

    image

  3. image

Langkah 4: Kirim pekerjaan Spark contoh

Buat file manifes SparkApplication bernama spark-pi.yaml dengan menggunakan 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

Tunggu hingga eksekusi pekerjaan selesai dan periksa 10 baris terakhir 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 output dicetak dalam format JSONL. Bagian berikut menjelaskan arti dari setiap bidang:

  • @timestamp: Waktu ketika log dihasilkan.

  • ecs.version: Nomor versi ECS.

  • log.level: Tingkat log.

  • message: Pesan log.

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

  • log.logger: Nama logger yang mencatat log.

Langkah 5: Tanyakan dan analisis log Spark

Anda dapat menanyakan dan menganalisis log untuk menentukan rentang waktu eksekusi pekerjaan guna memeriksa apakah log telah dikumpulkan.

image

(Opsional) Langkah 6: Bersihkan lingkungan

Setelah Anda menyelesaikan semua langkah dalam topik ini, jalankan perintah berikut untuk menghapus pekerjaan Spark dan melepaskan sumber daya yang tidak lagi Anda perlukan.

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