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
Komponen ack-spark-operator telah diinstal. Untuk informasi lebih lanjut, lihat Langkah 1: Instal Komponen ack-spark-operator.
Proyek Simple Log Service telah dibuat. Untuk informasi lebih lanjut, lihat Kelola Proyek.
Komponen Logtail telah diinstal. Untuk informasi lebih lanjut, lihat Instal Komponen Logtail di Kluster ACK.
Ikhtisar Prosedur
Topik ini menjelaskan cara mengonfigurasi Simple Log Service untuk mengelola log sistem dan log bisnis yang dihasilkan oleh pekerjaan Spark.
Buat gambar kontainer Spark: Buat gambar kontainer Spark yang berisi dependensi template tata letak JSON log4j dan dorong gambar tersebut ke repositori gambar Anda.
Konfigurasikan log Log4j2: Buat ConfigMap untuk mengonfigurasi log Log4j2, atur tingkat log ke INFO, lalu atur format cetak log ke JSONL.
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.
Kirim pekerjaan Spark contoh: Buat dan jalankan pekerjaan Spark contoh, periksa apakah output log pod dalam format JSONL, lalu jelaskan arti dari bidang tertentu.
Tanyakan dan analisis log Spark: Masuk ke konsol Simple Log Service dan tanyakan serta analisis log pekerjaan Spark dalam periode waktu tertentu.
(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}/jarsLangkah 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.jsonJalankan perintah berikut untuk membuat ConfigMap:
kubectl apply -f spark-log-conf.yamlOutput yang diharapkan:
configmap/spark-log-conf createdLangkah 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: falseJalankan perintah berikut untuk membuat konfigurasi Logtail:
kubectl apply -f aliyun-log-config.yamlUntuk melihat penyimpanan log baru dan konfigurasi Logtail, ikuti langkah-langkah berikut:
Masuk ke konsol Simple Log Service.
Di bagian Proyek, klik yang ingin Anda kelola.


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: 4gJalankan perintah berikut untuk mengirim pekerjaan:
kubectl apply -f spark-pi.yamlTunggu 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.

(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.yamlJalankan perintah berikut untuk menghapus konfigurasi Logtail:
kubectl delete -f aliyun-log-config.yamlJalankan perintah berikut untuk menghapus konfigurasi log Log4j2:
kubectl delete -f spark-log-conf.yaml