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
-
Add-on ack-spark-operator telah dideploy.
-
Anda telah membuat Proyek Simple Log Service (SLS). Untuk informasi selengkapnya, lihat Manage a Project.
-
Anda telah menginstal komponen Logtail.
Ikhtisar
Topik ini memandu Anda melalui langkah-langkah berikut untuk mengonfigurasi SLS guna mengelola log sistem dan aplikasi yang dihasilkan oleh pekerjaan Spark Anda.
-
Buat gambar kontainer Spark yang mencakup dependensi tata letak templat JSON log4j, lalu dorong gambar tersebut ke registri gambar kontainer Anda.
-
Buat ConfigMap untuk mengonfigurasi Log4j2, atur tingkat log ke INFO, dan tetapkan format output log ke JSONL.
-
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.
-
Buat dan jalankan pekerjaan Spark contoh, verifikasi bahwa log Pod berada dalam format JSONL, serta tinjau definisi bidang-bidang utama.
-
Login ke konsol Simple Log Service untuk melakukan kueri dan menganalisis log pekerjaan Spark dalam rentang waktu tertentu.
-
(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:
Login ke konsol Simple Log Service.
Pada bagian Projects, klik proyek yang diinginkan.

-
Pada tab , klik ikon > di depan logstore target, lalu pilih .
Pada halaman Logtail configuration, daftar konfigurasi Logtail yang ada akan ditampilkan. Daftar tersebut mencakup konfigurasi bernama spark, yang dikaitkan dengan satu kelompok mesin.
-
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