Topik ini menjelaskan cara menjalankan pekerjaan Spark di kluster Container Service for Kubernetes (ACK) dan mengonfigurasi pekerjaan tersebut untuk membaca serta menulis data dari bucket Object Storage Service (OSS) menggunakan pekerjaan PageRank bawaan sebagai contoh.
Prasyarat
Sebuah kluster ACK Pro atau kluster ACK Serverless Pro yang menjalankan Kubernetes 1.24 atau lebih baru telah dibuat. Untuk informasi lebih lanjut, lihat Buat kluster ACK yang dikelola, Buat kluster ACK Serverless, dan Tingkatkan kluster ACK secara manual.
Komponen ack-spark-operator telah diinstal. Untuk informasi lebih lanjut, lihat Langkah 1: Instal komponen ack-spark-operator.
Klien kubectl terhubung ke kluster ACK. Untuk informasi lebih lanjut, lihat Dapatkan file kubeconfig dari kluster dan gunakan kubectl untuk terhubung ke kluster.
Sebuah bucket OSS telah dibuat. Untuk informasi lebih lanjut, lihat Buat bucket.
Utilitas ossutil telah diinstal dan dikonfigurasi. Untuk informasi lebih lanjut tentang perintah ossutil, lihat Referensi perintah ossutil.
Ikhtisar prosedur
Topik ini akan memandu Anda melalui langkah-langkah berikut untuk menjalankan pekerjaan Spark di kluster ACK dan mengonfigurasi operasi baca dan tulis untuk data OSS:
Siapkan dan unggah set data uji ke bucket OSS: Hasilkan set data uji untuk pekerjaan PageRank dan unggah ke bucket OSS.
Bangun gambar kontainer Spark: Sertakan dependensi JAR yang diperlukan untuk akses OSS dalam gambar kontainer Spark.
Buat Secret untuk menyimpan kredensial akses OSS: Untuk melindungi data dari akses tidak sah, buat file YAML Secret untuk menyimpan kredensial yang digunakan oleh pekerjaan Spark untuk mengakses OSS.
Kirim pekerjaan Spark: Buat dan kirim file konfigurasi pekerjaan Spark untuk menjalankan tugas pemrosesan data OSS.
(Opsional) Pembersihan lingkungan: Hapus pekerjaan Spark dan sumber daya yang sudah selesai atau tidak lagi diperlukan untuk mengurangi biaya.
Langkah 1: Siapkan dan unggah data uji ke bucket OSS
Hasilkan set data uji untuk PageRank dan unggah ke bucket OSS yang ditentukan.
Gunakan template YAML berikut untuk membuat file bernama
generate_pagerank_dataset.sh. File ini akan digunakan untuk membuat set data uji:#!/bin/bash # Periksa jumlah argumen if [ "$#" -ne 2 ]; then echo "Penggunaan: $0 M N" echo "M: Jumlah halaman web" echo "N: Jumlah catatan yang akan dihasilkan" exit 1 fi M=$1 N=$2 # Verifikasi apakah M dan N adalah bilangan bulat positif if ! [[ "$M" =~ ^[0-9]+$ ]] || ! [[ "$N" =~ ^[0-9]+$ ]]; then echo "Baik M maupun N harus bilangan bulat positif." exit 1 fi # Hasilkan dataset for ((i=1; i<=$N; i++)); do # Pastikan halaman sumber dan tujuan berbeda while true; do src=$((RANDOM % M + 1)) dst=$((RANDOM % M + 1)) if [ "$src" -ne "$dst" ]; then echo "$src $dst" break fi done doneJalankan perintah berikut untuk membuat set data uji:
M=100000 # Jumlah halaman web N=10000000 # Jumlah catatan # Hasilkan dataset secara acak dan simpan sebagai pagerank_dataset.txt bash generate_pagerank_dataset.sh $M $N > pagerank_dataset.txtJalankan perintah berikut untuk mengunggah dataset yang dihasilkan ke direktori
data/di bucket OSS Anda:ossutil cp pagerank_dataset.txt oss://<BUCKET_NAME>/data/
Langkah 2: Bangun gambar kontainer Spark
Bangun gambar kontainer dengan dependensi JAR yang diperlukan untuk akses OSS. Anda dapat memilih Hadoop OSS SDK, Hadoop S3 SDK, atau JindoSDK. Untuk informasi lebih lanjut tentang cara membangun gambar dengan Container Registry, lihat Gunakan instance Enterprise Edition Container Registry untuk membangun gambar.
Gambar Spark yang digunakan dalam Dockerfile sampel berasal dari komunitas open source. Anda dapat menggantinya dengan gambar Spark Anda sendiri sesuai kebutuhan.
Pilih versi Hadoop OSS SDK, Hadoop S3 SDK, atau JindoSDK yang sesuai berdasarkan versi Spark Anda.
Gunakan Hadoop OSS SDK
Dalam contoh ini, Spark 3.5.5 dan Hadoop OSS SDK 3.3.4 digunakan. Buat Dockerfile dengan kode sampel berikut:
ARG SPARK_IMAGE=spark:3.5.5
FROM ${SPARK_IMAGE}
# Tambahkan dependensi untuk dukungan Hadoop Aliyun OSS
ADD --chown=spark:spark --chmod=644 https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aliyun/3.3.4/hadoop-aliyun-3.3.4.jar ${SPARK_HOME}/jars
ADD --chown=spark:spark --chmod=644 https://repo1.maven.org/maven2/com/aliyun/oss/aliyun-sdk-oss/3.17.4/aliyun-sdk-oss-3.17.4.jar ${SPARK_HOME}/jars
ADD --chown=spark:spark --chmod=644 https://repo1.maven.org/maven2/org/jdom/jdom2/2.0.6.1/jdom2-2.0.6.1.jar ${SPARK_HOME}/jarsGunakan Hadoop S3 SDK
Dalam contoh ini, Spark 3.5.5 dan Hadoop S3 SDK 3.3.4 digunakan. Buat Dockerfile dengan kode sampel berikut:
ARG SPARK_IMAGE=spark:3.5.5
FROM ${SPARK_IMAGE}
# Tambahkan dependensi untuk dukungan Hadoop AWS S3
ADD --chown=spark:spark --chmod=644 https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.3.4/hadoop-aws-3.3.4.jar ${SPARK_HOME}/jars
ADD --chown=spark:spark --chmod=644 https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.12.367/aws-java-sdk-bundle-1.12.367.jar ${SPARK_HOME}/jarsGunakan JindoSDK
Dalam contoh ini, Spark 3.5.5 dan JindoSDK 6.8.0 digunakan. Buat Dockerfile dengan kode sampel berikut:
ARG SPARK_IMAGE=spark:3.5.5
FROM ${SPARK_IMAGE}
# Tambahkan dependensi untuk dukungan JindoSDK
ADD --chown=spark:spark --chmod=644 https://jindodata-binary.oss-cn-shanghai.aliyuncs.com/mvn-repo/com/aliyun/jindodata/jindo-core/6.8.0/jindo-core-6.8.0.jar ${SPARK_HOME}/jars
ADD --chown=spark:spark --chmod=644 https://jindodata-binary.oss-cn-shanghai.aliyuncs.com/mvn-repo/com/aliyun/jindodata/jindo-sdk/6.8.0/jindo-sdk-6.8.0.jar ${SPARK_HOME}/jarsLangkah 3: Buat secret untuk menyimpan kredensial akses OSS
Untuk akses data OSS yang aman dalam pekerjaan Spark, konfigurasikan kredensial akses OSS dan simpan dalam Secret Kubernetes untuk menghindari pengkodean langsung ke dalam pekerjaan Anda. Simpan Secret sebagai variabel lingkungan dalam kontainer.
Gunakan Hadoop OSS SDK
Buat file YAML Secret bernama
spark-oss-secret.yamluntuk menyimpan kredensial yang digunakan untuk mengakses OSS:apiVersion: v1 kind: Secret metadata: name: spark-oss-secret namespace: default stringData: # Ganti <ACCESS_KEY_ID> dengan ID AccessKey akun Alibaba Cloud Anda. OSS_ACCESS_KEY_ID: <ACCESS_KEY_ID> # Ganti <ACCESS_KEY_SECRET> dengan Secret AccessKey akun Alibaba Cloud Anda. OSS_ACCESS_KEY_SECRET: <ACCESS_KEY_SECRET>Jalankan perintah berikut untuk membuat Secret:
kubectl apply -f spark-oss-secret.yamlOutput yang diharapkan:
secret/spark-oss-secret created
Gunakan Hadoop S3 SDK
Buat file YAML Secret bernama
spark-s3-secret.yamluntuk menyimpan kredensial yang digunakan untuk mengakses OSS:apiVersion: v1 kind: Secret metadata: name: spark-s3-secret namespace: default stringData: # Ganti <ACCESS_KEY_ID> dengan ID AccessKey akun Alibaba Cloud Anda. AWS_ACCESS_KEY_ID: <ACCESS_KEY_ID> # Ganti <ACCESS_KEY_SECRET> dengan Secret AccessKey akun Alibaba Cloud Anda. AWS_SECRET_ACCESS_KEY: <ACCESS_KEY_SECRET>Jalankan perintah berikut untuk membuat Secret:
kubectl apply -f spark-s3-secret.yamlOutput yang diharapkan:
secret/spark-s3-secret created
Gunakan JindoSDK
Buat file YAML Secret bernama
spark-oss-secret.yamluntuk menyimpan kredensial yang digunakan untuk mengakses OSS:apiVersion: v1 kind: Secret metadata: name: spark-oss-secret namespace: default stringData: # Ganti <ACCESS_KEY_ID> dengan ID AccessKey akun Alibaba Cloud Anda. OSS_ACCESS_KEY_ID: <ACCESS_KEY_ID> # Ganti <ACCESS_KEY_SECRET> dengan Secret AccessKey akun Alibaba Cloud Anda. OSS_ACCESS_KEY_SECRET: <ACCESS_KEY_SECRET>Jalankan perintah berikut untuk membuat Secret:
kubectl apply -f spark-oss-secret.yamlOutput yang diharapkan:
secret/spark-oss-secret created
Langkah 4: Jalankan pekerjaan Spark
Kirim pekerjaan Spark di kluster ACK untuk membaca data dari dan menulis data ke bucket OSS.
Gunakan Hadoop OSS SDK
Buat file YAML aplikasi Spark bernama spark-pagerank.yaml. Untuk daftar lengkap parameter konfigurasi OSS, lihat modul Hadoop-Aliyun.
apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
name: spark-pagerank
namespace: default
spec:
type: Scala
mode: cluster
# Ganti <SPARK_IMAGE> dengan gambar kontainer Spark yang dibangun pada Langkah 2.
image: <SPARK_IMAGE>
mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.5.jar
mainClass: org.apache.spark.examples.SparkPageRank
arguments:
- oss://<OSS_BUCKET>/data/pagerank_dataset.txt # Tentukan set data uji input. Ganti <OSS_BUCKET> dengan nama bucket OSS Anda.
- "10" # Jumlah iterasi.
sparkVersion: 3.5.5
hadoopConf:
fs.AbstractFileSystem.oss.impl: org.apache.hadoop.fs.aliyun.oss.OSS
fs.oss.impl: org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem
# Titik akhir OSS. Ganti <OSS_ENDPOINT> dengan titik akhir OSS Anda.
# Sebagai contoh, titik akhir internal untuk wilayah Beijing adalah oss-cn-beijing-internal.aliyuncs.com.
fs.oss.endpoint: <OSS_ENDPOINT>
fs.oss.credentials.provider: com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider
driver:
cores: 1
coreLimit: 1200m
memory: 512m
envFrom:
- secretRef:
name: spark-oss-secret # Tentukan Secret yang digunakan untuk mengakses OSS.
serviceAccount: spark-operator-spark
executor:
instances: 2
cores: 1
coreLimit: "2"
memory: 8g
envFrom:
- secretRef:
name: spark-oss-secret # Tentukan Secret yang digunakan untuk mengakses OSS.
restartPolicy:
type: NeverGunakan Hadoop S3 SDK
Buat file YAML aplikasi Spark bernama spark-pagerank.yaml. Untuk daftar lengkap parameter konfigurasi S3, lihat modul Hadoop-AWS.
apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
name: spark-pagerank
namespace: default
spec:
type: Scala
mode: cluster
# Ganti <SPARK_IMAGE> dengan gambar kontainer Spark yang dibangun pada Langkah 2.
image: <SPARK_IMAGE>
mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.5.jar
mainClass: org.apache.spark.examples.SparkPageRank
arguments:
- s3a://<OSS_BUCKET>/data/pagerank_dataset.txt # Tentukan set data uji input. Ganti <OSS_BUCKET> dengan nama bucket OSS Anda.
- "10" # Jumlah iterasi.
sparkVersion: 3.5.5
hadoopConf:
fs.s3a.impl: org.apache.hadoop.fs.s3a.S3AFileSystem
# Titik akhir OSS. Ganti <OSS_ENDPOINT> dengan titik akhir OSS Anda.
# Sebagai contoh, titik akhir internal untuk wilayah Beijing adalah oss-cn-beijing-internal.aliyuncs.com.
fs.s3a.endpoint: <OSS_ENDPOINT>
# Wilayah tempat titik akhir OSS berada. Sebagai contoh, cn-beijing untuk wilayah Beijing.
fs.s3a.endpoint.region: <OSS_REGION>
driver:
cores: 1
coreLimit: 1200m
memory: 512m
envFrom:
- secretRef:
name: spark-s3-secret # Tentukan Secret yang digunakan untuk mengakses OSS.
serviceAccount: spark-operator-spark
executor:
instances: 2
cores: 1
coreLimit: "2"
memory: 8g
envFrom:
- secretRef:
name: spark-s3-secret # Tentukan Secret yang digunakan untuk mengakses OSS.
restartPolicy:
type: NeverGunakan JindoSDK
Simpan manifes SparkApplication berikut sebagai spark-pagerank.yaml.
apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
name: spark-pagerank
namespace: default
spec:
type: Scala
mode: cluster
# Ganti <SPARK_IMAGE> dengan gambar kontainer Spark yang dibangun pada Langkah 2.
image: <SPARK_IMAGE>
mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.12-3.5.5.jar
mainClass: org.apache.spark.examples.SparkPageRank
arguments:
- oss://<OSS_BUCKET>/data/pagerank_dataset.txt # Tentukan set data uji input. Ganti <OSS_BUCKET> dengan nama bucket OSS Anda.
- "10" # Jumlah iterasi.
sparkVersion: 3.5.5
hadoopConf:
fs.AbstractFileSystem.oss.impl: com.aliyun.jindodata.oss.JindoOSS
fs.oss.impl: com.aliyun.jindodata.oss.JindoOssFileSystem
fs.oss.endpoint: <OSS_ENDPOINT> # Titik akhir internal untuk wilayah China (Beijing) adalah oss-cn-beijing-internal.aliyuncs.com.
fs.oss.credentials.provider: com.aliyun.jindodata.oss.auth.EnvironmentVariableCredentialsProvider
driver:
cores: 1
coreLimit: 1200m
memory: 512m
serviceAccount: spark-operator-spark
envFrom:
- secretRef:
name: spark-oss-secret # Tentukan Secret yang digunakan untuk mengakses OSS.
executor:
instances: 2
cores: 1
coreLimit: "2"
memory: 8g
envFrom:
- secretRef:
name: spark-oss-secret # Tentukan Secret yang digunakan untuk mengakses OSS.
restartPolicy:
type: NeverJalankan perintah berikut untuk mengirim pekerjaan Spark:
kubectl apply -f spark-pagerank.yamlJalankan perintah berikut untuk memantau status pekerjaan Spark:
kubectl get sparkapplications spark-pagerankOutput yang diharapkan:
NAME STATUS ATTEMPTS START FINISH AGE spark-pagerank COMPLETED 1 2024-10-09T12:54:25Z 2024-10-09T12:55:46Z 90sJalankan perintah berikut untuk melihat 20 entri log terakhir dari pod driver:
kubectl logs spark-pagerank-driver --tail=20Output yang diharapkan:
Gunakan Hadoop OSS SDK
Log menunjukkan bahwa pekerjaan Spark telah berhasil dieksekusi.
30024 memiliki rank: 1.0709659078941967 . 21390 memiliki rank: 0.9933356174074005 . 28500 memiliki rank: 1.0404018494028928 . 2137 memiliki rank: 0.9931000490520374 . 3406 memiliki rank: 0.9562543137167121 . 20904 memiliki rank: 0.8827028621652337 . 25604 memiliki rank: 1.0270134041934191 . 24/10/09 12:48:36 INFO SparkUI: Stopped Spark web UI at http://spark-pagerank-dd0d4d927151c9d0-driver-svc.default.svc:4040 24/10/09 12:48:36 INFO KubernetesClusterSchedulerBackend: Shutting down all executors 24/10/09 12:48:36 INFO KubernetesClusterSchedulerBackend$KubernetesDriverEndpoint: Asking each executor to shut down 24/10/09 12:48:36 WARN ExecutorPodsWatchSnapshotSource: Kubernetes client has been closed. 24/10/09 12:48:36 INFO MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped! 24/10/09 12:48:36 INFO MemoryStore: MemoryStore cleared 24/10/09 12:48:36 INFO BlockManager: BlockManager stopped 24/10/09 12:48:36 INFO BlockManagerMaster: BlockManagerMaster stopped 24/10/09 12:48:36 INFO OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped! 24/10/09 12:48:36 INFO SparkContext: Successfully stopped SparkContext 24/10/09 12:48:36 INFO ShutdownHookManager: Shutdown hook called 24/10/09 12:48:36 INFO ShutdownHookManager: Deleting directory /tmp/spark-e8b8c2ab-c916-4f84-b60f-f54c0de3a7f0 24/10/09 12:48:36 INFO ShutdownHookManager: Deleting directory /var/data/spark-c5917d98-06fb-46fe-85bc-199b839cb885/spark-23e2c2ae-4754-43ae-854d-2752eb83b2c5Gunakan Hadoop S3 SDK
3406 memiliki rank: 0.9562543137167121 . 20904 memiliki rank: 0.8827028621652337 . 25604 memiliki rank: 1.0270134041934191 . 25/04/07 03:54:11 INFO SparkContext: SparkContext is stopping with exitCode 0. 25/04/07 03:54:11 INFO SparkUI: Stopped Spark web UI at http://spark-pagerank-0f7dec960e615617-driver-svc.spark.svc:4040 25/04/07 03:54:11 INFO KubernetesClusterSchedulerBackend: Shutting down all executors 25/04/07 03:54:11 INFO KubernetesClusterSchedulerBackend$KubernetesDriverEndpoint: Asking each executor to shut down 25/04/07 03:54:11 WARN ExecutorPodsWatchSnapshotSource: Kubernetes client has been closed. 25/04/07 03:54:11 INFO MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped! 25/04/07 03:54:11 INFO MemoryStore: MemoryStore cleared 25/04/07 03:54:11 INFO BlockManager: BlockManager stopped 25/04/07 03:54:11 INFO BlockManagerMaster: BlockManagerMaster stopped 25/04/07 03:54:11 INFO OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped! 25/04/07 03:54:11 INFO SparkContext: Successfully stopped SparkContext 25/04/07 03:54:11 INFO ShutdownHookManager: Shutdown hook called 25/04/07 03:54:11 INFO ShutdownHookManager: Deleting directory /var/data/spark-20d425bb-f442-4b0a-83e2-5a0202959a54/spark-ff5bbf08-4343-4a7a-9ce0-3f7c127cf4a9 25/04/07 03:54:11 INFO ShutdownHookManager: Deleting directory /tmp/spark-a421839a-07af-49c0-b637-f15f76c3e752 25/04/07 03:54:11 INFO MetricsSystemImpl: Stopping s3a-file-system metrics system... 25/04/07 03:54:11 INFO MetricsSystemImpl: s3a-file-system metrics system stopped. 25/04/07 03:54:11 INFO MetricsSystemImpl: s3a-file-system metrics system shutdown complete.Gunakan JindoSDK
Log menunjukkan bahwa pekerjaan Spark telah berhasil dieksekusi.
21390 memiliki rank: 0.9933356174074005 . 28500 memiliki rank: 1.0404018494028928 . 2137 memiliki rank: 0.9931000490520374 . 3406 memiliki rank: 0.9562543137167121 . 20904 memiliki rank: 0.8827028621652337 . 25604 memiliki rank: 1.0270134041934191 . 24/10/09 12:55:44 INFO SparkContext: SparkContext is stopping with exitCode 0. 24/10/09 12:55:44 INFO SparkUI: Stopped Spark web UI at http://spark-pagerank-6a5e3d9271584856-driver-svc.default.svc:4040 24/10/09 12:55:44 INFO KubernetesClusterSchedulerBackend: Shutting down all executors 24/10/09 12:55:44 INFO KubernetesClusterSchedulerBackend$KubernetesDriverEndpoint: Asking each executor to shut down 24/10/09 12:55:44 WARN ExecutorPodsWatchSnapshotSource: Kubernetes client has been closed. 24/10/09 12:55:45 INFO MapOutputTrackerMasterEndpoint: MapOutputTrackerMasterEndpoint stopped! 24/10/09 12:55:45 INFO MemoryStore: MemoryStore cleared 24/10/09 12:55:45 INFO BlockManager: BlockManager stopped 24/10/09 12:55:45 INFO BlockManagerMaster: BlockManagerMaster stopped 24/10/09 12:55:45 INFO OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped! 24/10/09 12:55:45 INFO SparkContext: Successfully stopped SparkContext 24/10/09 12:55:45 INFO ShutdownHookManager: Shutdown hook called 24/10/09 12:55:45 INFO ShutdownHookManager: Deleting directory /var/data/spark-87e8406e-06a7-4b4a-b18f-2193da299d35/spark-093a1b71-121a-4367-9d22-ad4e397c9815 24/10/09 12:55:45 INFO ShutdownHookManager: Deleting directory /tmp/spark-723e2039-a493-49e8-b86d-fff5fd1bb168
(Opsional) Langkah 5: Pembersihan lingkungan
Setelah Anda menyelesaikan tutorial ini, Anda dapat melepaskan sumber daya yang tidak lagi diperlukan.
Jalankan perintah berikut untuk menghapus pekerjaan Spark:
kubectl delete -f spark-pagerank.yamlJalankan perintah berikut untuk menghapus Secret:
Gunakan Hadoop OSS SDK
kubectl delete -f spark-oss-secret.yamlGunakan Hadoop S3 SDK
kubectl delete -f spark-s3-secret.yamlGunakan JindoSDK
kubectl delete -f spark-oss-secret.yamlReferensi
Untuk informasi lebih lanjut tentang cara menggunakan Spark History Server untuk melihat informasi tentang pekerjaan Spark, lihat Gunakan Spark History Server untuk melihat informasi tentang pekerjaan Spark.
Untuk informasi lebih lanjut tentang cara menggunakan Layanan Log Sederhana untuk mengumpulkan log pekerjaan Spark, lihat Gunakan Layanan Log Sederhana untuk mengumpulkan log pekerjaan Spark.
Untuk informasi lebih lanjut tentang cara menggunakan instance kontainer elastis untuk menjalankan pekerjaan Spark, lihat Gunakan instance kontainer elastis untuk menjalankan pekerjaan Spark.
Untuk informasi lebih lanjut tentang cara menggunakan Celeborn untuk mengaktifkan RSS untuk pekerjaan Spark, lihat Gunakan Celeborn untuk mengaktifkan RSS untuk pekerjaan Spark.