Anda dapat menjalankan tugas Spark pada Elastic Container Instance di dalam kluster Kubernetes. Elastic Container Instance menyediakan sumber daya yang dapat diskalakan serta memastikan penyebaran otomatis dan ketersediaan tinggi untuk tugas Spark, meningkatkan efisiensi dan stabilitas pelaksanaannya. Topik ini menjelaskan cara menginstal Kubernetes Operator untuk Apache Spark di kluster ACK Serverless dan menjalankan tugas Spark pada instance kontainer elastis.
Informasi latar belakang
Apache Spark adalah program open source yang banyak digunakan untuk menganalisis beban kerja dalam skenario seperti komputasi data besar dan pembelajaran mesin. Anda dapat menggunakan Kubernetes untuk menjalankan dan mengelola sumber daya pada Apache Spark 2.3.0 dan versi lebih baru.
Kubernetes Operator untuk Apache Spark dirancang untuk menjalankan tugas Spark di dalam kluster Kubernetes. Ini memungkinkan Anda menyerahkan tugas Spark yang didefinisikan dalam definisi sumber daya kustom (CRD) ke kluster Kubernetes. Kubernetes Operator untuk Apache Spark memberikan manfaat berikut:
Menyediakan lebih banyak fitur dibandingkan dengan Apache Spark open source.
Dapat diintegrasikan dengan komponen penyimpanan, pemantauan, dan pencatatan Kubernetes.
Mendukung fitur canggih Kubernetes seperti pemulihan bencana dan penskalaan otomatis, serta mengoptimalkan penjadwalan sumber daya.
Persiapan
Buat sebuah kluster ACK Serverless.
Buat sebuah kluster ACK Serverless di konsol ACK. Untuk informasi lebih lanjut, lihat Buat kluster ACK Serverless.
PentingJika Anda perlu menarik gambar melalui Internet atau jika pekerjaan pelatihan Anda memerlukan akses ke Internet, Anda harus mengonfigurasi Gateway NAT Internet.
Anda dapat menggunakan kubectl dan salah satu metode berikut untuk mengelola dan mengakses kluster ACK Serverless:
Jika Anda ingin mengelola kluster dari mesin lokal, instal dan konfigurasikan klien kubectl. Untuk informasi lebih lanjut, lihat Hubungkan ke kluster ACK menggunakan kubectl.
Gunakan kubectl untuk mengelola kluster ACK Serverless pada Cloud Shell. Untuk informasi lebih lanjut, lihat Gunakan kubectl untuk mengelola kluster ACK pada Cloud Shell.
Buat sebuah bucket OSS.
Anda harus membuat bucket Object Storage Service (OSS) untuk menyimpan data, termasuk data uji, hasil uji, dan log. Untuk informasi lebih lanjut, lihat Buat bucket.
Instal Kubernetes Operator untuk Apache Spark
Instal Kubernetes Operator untuk Apache Spark.
Di panel navigasi sisi kiri konsol ACK, pilih Marketplace > Marketplace.
Di tab App Catalog, masukkan ack-spark-operator di kotak pencarian, temukan ack-spark-operator, dan klik ikonnya.
Di pojok kanan atas halaman, klik Deploy.
Di panel Deploy, pilih kluster tempat Anda ingin menginstal Kubernetes Operator untuk Apache Spark dan ikuti petunjuk di layar untuk menyelesaikan konfigurasi.
Buat ServiceAccount, Role, dan RoleBinding.
Tugas Spark memerlukan ServiceAccount untuk mendapatkan izin membuat pod. Oleh karena itu, Anda harus membuat ServiceAccount, Role, dan RoleBinding. Contoh YAML berikut menunjukkan cara membuat ServiceAccount, Role, dan RoleBinding. Ganti namespaces dengan nilai sebenarnya.
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
Bangun gambar tugas Spark
Anda perlu mengompilasi paket Java Archive (JAR) dari tugas Spark dan menggunakan Dockerfile untuk mengemas gambar tersebut.
Contoh berikut menunjukkan cara mengonfigurasi Dockerfile ketika gambar dasar Spark dari ACK digunakan.
FROM registry.aliyuncs.com/acs/spark:ack-2.4.5-latest
RUN mkdir -p /opt/spark/jars
# Jika Anda ingin membaca data dari OSS atau sink peristiwa 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/jarsMungkin memakan waktu lama untuk menarik gambar Spark yang besar. Anda dapat menggunakan ImageCache untuk mempercepat penarikan gambar. Untuk informasi lebih lanjut, lihat Kelola cache gambar dan Gunakan ImageCache untuk mempercepat pembuatan pod.
Anda juga dapat menggunakan gambar dasar Spark dari Alibaba Cloud. Alibaba Cloud menyediakan gambar dasar Spark 2.4.5, yang dioptimalkan untuk penjadwalan sumber daya dan penskalaan otomatis di kluster Kubernetes. Gambar dasar ini mempercepat penjadwalan sumber daya dan startup aplikasi. Anda dapat mengaktifkan fitur optimasi penjadwalan dengan mengatur variabel enableAlibabaCloudFeatureGates di Helm chart menjadi true. Jika Anda ingin memulai aplikasi lebih cepat, Anda dapat mengatur enableWebhook menjadi false. 
Buat template tugas Spark dan kirimkan tugas
Buat file YAML untuk tugas Spark dan terapkan tugas Spark.
Buat file bernama spark-pi.yaml.
Kode berikut memberikan contoh template dari tugas Spark tipikal. 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 tugas Spark.
kubectl apply -f spark-pi.yaml
Konfigurasikan pengumpulan log
Untuk mengumpulkan log stdout dari tugas Spark, Anda dapat mengonfigurasi variabel lingkungan di bidang envVars dari Spark driver dan Spark executor. Log akan dikumpulkan secara otomatis. Untuk informasi lebih lanjut, lihat Sesuaikan pengumpulan log untuk instance kontainer elastis.
envVars:
aliyun_logs_test-stdout_project: test-k8s-spark
aliyun_logs_test-stdout_machinegroup: k8s-group-app-spark
aliyun_logs_test-stdout: stdoutSebelum mengirimkan tugas Spark, Anda dapat mengonfigurasi variabel lingkungan dari Spark driver dan Spark executor seperti yang ditunjukkan dalam kode sebelumnya untuk mengimplementasikan pengumpulan log otomatis. 
Konfigurasikan server histori
Server histori Spark memungkinkan Anda meninjau tugas Spark. Anda dapat mengatur bidang SparkConf di CRD aplikasi Spark untuk memungkinkan aplikasi menyinkronkan peristiwa ke OSS. Lalu, Anda dapat menggunakan server histori untuk mengambil data dari OSS. Kode berikut memberikan 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"
# oss bucket endpoint 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 menyediakan Helm chart untuk menerapkan server histori Spark. Untuk menerapkannya, masuk ke konsol Container Service ACK, pilih Marketplace > Marketplace di panel navigasi sisi kiri. Di tab App Catalog, cari dan terapkan ack-spark-history-server. Saat menerapkan server histori Spark, tentukan informasi OSS di bagian Parameters. Kode berikut menunjukkan contohnya:
oss:
enableOSS: true
# Masukkan accessKeyId Anda
alibabaCloudAccessKeyId: ""
# Masukkan accessKeySecret Anda
alibabaCloudAccessKeySecret: ""
# oss bucket endpoint seperti oss-cn-beijing.aliyuncs.com
alibabaCloudOSSEndpoint: "oss-cn-beijing.aliyuncs.com"
# jalur file oss seperti oss://bucket-name/path
eventsDir: "oss://bigdatastore/spark-events"Setelah menerapkan server histori Spark, Anda dapat melihat titik akhir eksternalnya di halaman Services. Akses titik akhir eksternal server histori Spark untuk melihat tugas Spark historis. 
Lihat hasil dari tugas Spark
Kueri status 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 3sKueri antarmuka pengguna Spark real-time.
kubectl port-forward spark-pi-1547981232122-driver 4040:4040Kueri status aplikasi Spark.
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 completedLihat hasil dari tugas Spark di log.
NAME READY STATUS RESTARTS AGE spark-pi-1547981232122-driver 0/1 Completed 0 1mJika aplikasi Spark berada dalam status Succeed, atau pod driver Spark berada dalam status Completed, hasil dari tugas Spark tersedia. Anda dapat mencetak log dan melihat hasil dari tugas Spark di log.
kubectl logs spark-pi-1547981232122-driver Pi is roughly 3.152155760778804