Menjalankan pekerjaan Spark di ECI dalam kluster Kubernetes menyediakan penskalaan otomatis, penyebaran otomatis, dan ketersediaan tinggi untuk meningkatkan efisiensi serta stabilitas. Instal Spark Operator di kluster ACK Serverless untuk menjalankan dan mengelola pekerjaan Spark di ECI.
Latar Belakang
Apache Spark adalah proyek open-source yang banyak digunakan dalam analitik data, khususnya untuk beban kerja data besar dan pembelajaran mesin. Sejak versi Apache Spark 2.3.0, Anda dapat menjalankan dan mengelola resource Spark di Kubernetes.
Spark Operator, yang dirancang khusus untuk Spark di Kubernetes, memungkinkan Anda mengirimkan pekerjaan Spark ke kluster Kubernetes dengan mendefinisikannya sebagai Custom Resource Definitions (CRDs). Spark Operator menawarkan keunggulan berikut:
-
Mengatasi keterbatasan dukungan native Spark untuk Kubernetes.
-
Memungkinkan integrasi cepat dengan komponen dalam ekosistem Kubernetes, seperti penyimpanan, pemantauan, dan logging.
-
Mendukung fitur-fitur Kubernetes lanjutan seperti pemulihan kegagalan, penskalaan otomatis, dan optimasi penjadwalan.
Prasyarat
-
Buat kluster ACK Serverless.
Buat kluster ACK Serverless di Konsol Container Service for Kubernetes. Untuk informasi lebih lanjut, lihat Buat kluster ACK Serverless.
PentingJika Anda perlu menarik gambar dari internet atau pekerjaan pelatihan Anda memerlukan akses internet, konfigurasikan NAT Gateway.
Anda dapat menggunakan kubectl untuk mengelola dan mengakses kluster ACK Serverless sebagai berikut:
-
Untuk mengelola kluster dari komputer lokal, instal dan konfigurasikan klien kubectl. Untuk informasi lebih lanjut, lihat Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.
-
Anda juga dapat menggunakan kubectl di Cloud Shell untuk mengelola kluster. Untuk informasi lebih lanjut, lihat Gunakan kubectl untuk mengelola kluster Kubernetes di Cloud Shell.
-
-
Buat bucket OSS.
Anda perlu membuat bucket OSS untuk menyimpan data uji, hasil uji, dan log. Untuk informasi lebih lanjut, lihat Buat bucket.
Instal Spark Operator
-
Instal Spark Operator.
-
Di panel navigasi sebelah kiri Konsol ACK, pilih Marketplace > Marketplace.
-
Di tab App Catalog, temukan dan klik ack-spark-operator.
-
Di pojok kanan atas, klik Deploy.
-
Di panel yang muncul, pilih kluster target dan lengkapi konfigurasi sesuai petunjuk.
-
-
Buat ServiceAccount, Role, dan RoleBinding.
Pekerjaan Spark memerlukan ServiceAccount dengan izin untuk membuat pod. Buat ServiceAccount, Role, dan RoleBinding menggunakan manifes YAML berikut. Sesuaikan namespace sesuai kebutuhan.
apiVersion: v1 kind: ServiceAccount metadata: name: spark namespace: default --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: spark-role rules: - apiGroups: [""] resources: ["pods"] verbs: ["*"] - apiGroups: [""] resources: ["services"] verbs: ["*"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: spark-role-binding namespace: default subjects: - kind: ServiceAccount name: spark namespace: default roleRef: kind: Role name: spark-role apiGroup: rbac.authorization.k8s.io
Buat gambar pekerjaan Spark
Kompilasi paket JAR pekerjaan Spark Anda dan masukkan ke dalam gambar menggunakan Dockerfile.
Dockerfile berikut didasarkan pada gambar dasar Spark yang disediakan oleh Alibaba Cloud Container Service:
FROM registry.aliyuncs.com/acs/spark:ack-2.4.5-latest
RUN mkdir -p /opt/spark/jars
# Jika Anda perlu menggunakan OSS (misalnya, untuk membaca data dari atau menulis event ke OSS), tambahkan paket JAR berikut ke dalam gambar.
ADD https://repo1.maven.org/maven2/com/aliyun/odps/hadoop-fs-oss/3.3.8-public/hadoop-fs-oss-3.3.8-public.jar $SPARK_HOME/jars
ADD https://repo1.maven.org/maven2/com/aliyun/oss/aliyun-sdk-oss/3.8.1/aliyun-sdk-oss-3.8.1.jar $SPARK_HOME/jars
ADD https://repo1.maven.org/maven2/org/aspectj/aspectjweaver/1.9.5/aspectjweaver-1.9.5.jar $SPARK_HOME/jars
ADD https://repo1.maven.org/maven2/org/jdom/jdom/1.1.3/jdom-1.1.3.jar $SPARK_HOME/jars
COPY SparkExampleScala-assembly-0.1.jar /opt/spark/jars
Menarik gambar Spark yang besar dapat memakan waktu lama. Anda dapat menggunakan ImageCache untuk mempercepat proses tarik gambar. Untuk informasi lebih lanjut, lihat Kelola ImageCache dan Gunakan ImageCache untuk mempercepat pembuatan pod.
Alibaba Cloud menyediakan gambar dasar untuk Spark 2.4.5 yang dioptimalkan untuk penjadwalan dan elastisitas Kubernetes, yang secara signifikan meningkatkan kecepatan penjadwalan dan startup. Aktifkan optimasi ini dengan mengatur variabel enableAlibabaCloudFeatureGates: true di Helm chart. Untuk startup yang lebih cepat lagi, atur enableWebhook: false.
operatorImageName: registry.aliyuncs.com/acs/spark-operator
operatorImageVersion: ack-2.4.5-latest
operatorVersion: v2.4.5-v1beta2
imagePullPolicy: IfNotPresent
rbac:
create: true
serviceAccounts:
spark:
create: true
name: spark
sparkoperator:
create: true
name: ack-spark-operator
sparkJobNamespace: "default"
enableWebhook: false
enableMetrics: true
enableAlibabaCloudFeatureGates: false
Buat dan kirimkan manifes pekerjaan
Buat file konfigurasi YAML untuk pekerjaan Spark dan terapkan.
-
Buat file spark-pi.yaml.
Berikut adalah contoh manifes pekerjaan. Untuk informasi lebih lanjut, lihat spark-on-k8s-operator.
apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: name: spark-pi namespace: default spec: type: Scala mode: cluster image: "registry.aliyuncs.com/acs/spark:ack-2.4.5-latest" imagePullPolicy: Always mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.11-2.4.5.jar" sparkVersion: "2.4.5" restartPolicy: type: Never driver: cores: 2 coreLimit: "2" memory: "3g" memoryOverhead: "1g" labels: version: 2.4.5 serviceAccount: spark annotations: k8s.aliyun.com/eci-kube-proxy-enabled: 'true' k8s.aliyun.com/eci-auto-imc: "true" tolerations: - key: "virtual-kubelet.io/provider" operator: "Exists" executor: cores: 2 instances: 1 memory: "3g" memoryOverhead: "1g" labels: version: 2.4.5 annotations: k8s.aliyun.com/eci-kube-proxy-enabled: 'true' k8s.aliyun.com/eci-auto-imc: "true" tolerations: - key: "virtual-kubelet.io/provider" operator: "Exists" -
Terapkan pekerjaan komputasi Spark.
kubectl apply -f spark-pi.yaml
Konfigurasikan pengumpulan log
Untuk mengumpulkan log output standar dari driver dan executor Spark, sisipkan variabel lingkungan ke bidang envVars mereka. Untuk informasi lebih lanjut, lihat Sesuaikan pengumpulan log untuk ECI.
envVars:
aliyun_logs_test-stdout_project: test-k8s-spark
aliyun_logs_test-stdout_machinegroup: k8s-group-app-spark
aliyun_logs_test-stdout: stdout
Tetapkan variabel lingkungan ini untuk driver dan executor saat Anda mengirimkan pekerjaan. Setelah dikonfigurasi, lihat log yang dikumpulkan di tab Raw Logs Proyek terkait di Konsol Log Service. Entri log berisi bidang seperti __source__, __tag__:__hostname__, __tag__:__path__, __tag__:__user_defined_id__, dan __tag__:eci_id, serta konten log di bidang content.
Konfigurasikan history server
History server melacak dan mengaudit pekerjaan Spark. Tambahkan bidang SparkConf ke CRD SparkApplication untuk menulis event ke OSS. History server membaca event tersebut untuk menampilkan informasi pekerjaan. Contoh konfigurasi:
sparkConf:
"spark.eventLog.enabled": "true"
"spark.eventLog.dir": "oss://bigdatastore/spark-events"
"spark.hadoop.fs.oss.impl": "org.apache.hadoop.fs.aliyun.oss.AliyunOSSFileSystem"
# endpoint bucket oss seperti oss-cn-beijing.aliyuncs.com
"spark.hadoop.fs.oss.endpoint": "oss-cn-beijing.aliyuncs.com"
"spark.hadoop.fs.oss.accessKeySecret": ""
"spark.hadoop.fs.oss.accessKeyId": ""
Alibaba Cloud juga menyediakan Helm chart spark-history-server. Cari ack-spark-history-server di halaman Marketplace > Marketplace di Konsol ACK dan instal. Saat instalasi, konfigurasikan informasi terkait OSS di bagian Parameters. Contoh:
oss:
enableOSS: true
# Masukkan accessKeyId Anda
alibabaCloudAccessKeyId: ""
# Masukkan accessKeySecret Anda
alibabaCloudAccessKeySecret: ""
# endpoint bucket oss seperti oss-cn-beijing.aliyuncs.com
alibabaCloudOSSEndpoint: "oss-cn-beijing.aliyuncs.com"
# path file oss seperti oss://bucket-name/path
eventsDir: "oss://bigdatastore/spark-events"
Setelah instalasi, temukan titik akhir eksternal ack-spark-history-server di bawah Layanan di halaman detail kluster. Akses titik akhir ini untuk melihat pekerjaan yang diarsipkan. Halaman Spark History Server mencantumkan aplikasi Spark yang telah selesai dengan kolom seperti App ID, App Name, Started, Completed, Duration, Spark User, Last Updated, dan Event Log. Untuk mengunduh log event, klik Download di baris yang sesuai.
Lihat hasil pekerjaan
-
Periksa status eksekusi pod.
kubectl get podsOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE spark-pi-1547981232122-driver 1/1 Running 0 12s spark-pi-1547981232122-exec-1 1/1 Running 0 3s -
Lihat UI Spark secara real-time.
kubectl port-forward spark-pi-1547981232122-driver 4040:4040 -
Periksa status SparkApplication.
kubectl describe sparkapplication spark-piOutput yang diharapkan:
Name: spark-pi Namespace: default Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"sparkoperator.k8s.io/v1alpha1","kind":"SparkApplication","metadata":{"annotations":{},"name":"spark-pi","namespace":"default"...}} API Version: sparkoperator.k8s.io/v1alpha1 Kind: SparkApplication Metadata: Creation Timestamp: 2019-01-20T10:47:08Z Generation: 1 Resource Version: 4923532 Self Link: /apis/sparkoperator.k8s.io/v1alpha1/namespaces/default/sparkapplications/spark-pi UID: bbe7445c-1ca0-11e9-9ad4-062fd7c19a7b Spec: Deps: Driver: Core Limit: 200m Cores: 0.1 Labels: Version: 2.4.0 Memory: 512m Service Account: spark Volume Mounts: Mount Path: /tmp Name: test-volume Executor: Cores: 1 Instances: 1 Labels: Version: 2.4.0 Memory: 512m Volume Mounts: Mount Path: /tmp Name: test-volume Image: gcr.io/spark-operator/spark:v2.4.0 Image Pull Policy: Always Main Application File: local:///opt/spark/examples/jars/spark-examples_2.11-2.4.0.jar Main Class: org.apache.spark.examples.SparkPi Mode: cluster Restart Policy: Type: Never Type: Scala Volumes: Host Path: Path: /tmp Type: Directory Name: test-volume Status: Application State: Error Message: State: COMPLETED Driver Info: Pod Name: spark-pi-driver Web UI Port: 31182 Web UI Service Name: spark-pi-ui-svc Execution Attempts: 1 Executor State: Spark - Pi - 1547981232122 - Exec - 1: COMPLETED Last Submission Attempt Time: 2019-01-20T10:47:14Z Spark Application Id: spark-application-1547981285779 Submission Attempts: 1 Termination Time: 2019-01-20T10:48:56Z Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SparkApplicationAdded 55m spark-operator SparkApplication spark-pi was added, Enqueuing it for submission Normal SparkApplicationSubmitted 55m spark-operator SparkApplication spark-pi was submitted successfully Normal SparkDriverPending 55m (x2 over 55m) spark-operator Driver spark-pi-driver is pending Normal SparkExecutorPending 54m (x3 over 54m) spark-operator Executor spark-pi-1547981232122-exec-1 is pending Normal SparkExecutorRunning 53m (x4 over 54m) spark-operator Executor spark-pi-1547981232122-exec-1 is running Normal SparkDriverRunning 53m (x12 over 55m) spark-operator Driver spark-pi-driver is running Normal SparkExecutorCompleted 53m (x2 over 53m) spark-operator Executor spark-pi-1547981232122-exec-1 completed -
Lihat log untuk melihat hasilnya.
NAME READY STATUS RESTARTS AGE spark-pi-1547981232122-driver 0/1 Completed 0 1mSaat status SparkApplication adalah
COMPLETEDatau status pod driver Spark adalahCompleted, lihat log untuk memeriksa hasilnya.kubectl logs spark-pi-1547981232122-driver Pi is roughly 3.152155760778804