阿里云容器计算服务 ACS(Container Compute Service)提供了Serverless形态的容器算力,对于大数据类型的计算任务,使用BestEffort算力质量的实例可以在满足其弹性算力需求的同时,降低任务的计算成本。本文主要为您介绍如何通过ACS提供的BestEffort实例运行Spark应用。
背景信息
Apache Spark和Spark Operator
Apache Spark在数据科学和机器学习等领域具有强大的能力,能够应对各种复杂的数据处理和分析任务。无论是离线批处理还是实时流处理,Spark都提供了高效的解决方案。Spark Operator使用了Kubernetes的操作方式和自定义资源,支持通过YAML创建Spark应用程序,使其在云原生环境中更加易用和高效。
BestEffort实例
通过Spark Operator在Kubernetes环境中管理和调度Spark应用程序,能够极大地提升数据处理和分析效率。结合ACS支持的BestEffort算力质量的实例(本文中简称为BestEffort实例),为短时间运行的Job任务和具备高扩展性和容错率的无状态应用提供了一个经济高效的解决方案。这不仅有效节省了计算成本,还保证了任务的高效执行。关于BestEffort实例的详细内容,请参见BestEffort算力质量概述。
本文将以一个基础的Spark应用程序为例,介绍如何通过ACS提供的BestEffort实例运行该应用。如果您打算在生产环境中使用Apache Spark和Spark Operator,建议您按照Spark官方的推荐配置进行设置。
前提条件
已开通容器计算服务ACS。具体操作,请参见开通容器计算服务ACS。
已创建ACS集群并安装CoreDNS服务发现组件。具体操作,请参见创建ACS集群。
已通过Helm安装ack-spark-operator3.0组件。具体操作,请参见使用Helm管理ACS应用。
已通过kubectl工具连接ACS集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群或在CloudShell上通过kubectl管理Kubernetes集群。
操作步骤
步骤一:创建Spark应用相关配置和权限
使用以下YAML内容,创建
spark-sa.yaml
文件,赋予名为spark
的ServiceAccount
对集群资源进行编辑操作的权限。apiVersion: v1 kind: Namespace metadata: name: spark-demo --- apiVersion: v1 kind: ServiceAccount metadata: namespace: spark-demo name: spark --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: spark-role-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: edit subjects: - kind: ServiceAccount name: spark namespace: spark-demo
执行以下命令,创建Spark应用相关配置。
kubectl apply -f spark-sa.yaml
步骤二:使用BestEffort实例运行Spark应用
使用以下YAML内容,创建
spark-pi.yaml
。其中.spec.executor.labels
指定了alibabacloud.com/compute-qos: best-effort
,表示Spark应用中执行计算任务的executor使用了BestEffort类型实例。apiVersion: "sparkoperator.k8s.io/v1beta2" kind: SparkApplication metadata: namespace: spark-demo name: spark-pi spec: type: Scala mode: cluster image: "registry.cn-hangzhou.aliyuncs.com/koordinator-sh/spark-test:v3.4.1-0.1" imagePullPolicy: IfNotPresent mainClass: org.apache.spark.examples.SparkPi mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.12-3.4.1.jar" sparkVersion: "3.4.1" restartPolicy: type: Never driver: cores: 1 coreLimit: "1" memory: "512m" labels: version: 3.4.1 serviceAccount: spark executor: cores: 1 coreLimit: "1" instances: 1 memory: "512m" deleteOnTermination: false labels: version: 3.4.1 alibabacloud.com/compute-qos: best-effort # best-effort表示executor使用BestEffort算力
执行以下命令,部署Spark示例应用。
kubectl apply -f spark-pi.yaml
步骤三:检查Spark应用状态
执行以下命令,查看Spark应用的Pod状态。
kubectl get pod -n spark-demo -o wide
预期输出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES spark-pi-xxxxx591db3xxxxx-exec-1 1/1 Running 0 15s 192.168.x.xxx virtual-kubelet-cn-xxxxxxx-x <none> <none> spark-pi-driver 1/1 Running 0 39s 192.168.x.xxx virtual-kubelet-cn-xxxxxxx-x <none> <none>
由预期输出得到,Pod的状态为
Running
,表示Spark应用已在ACS集群中正常运行。
结果验证
Spark应用的状态变为Completed后,执行以下命令,查看Spark应用运行结果。
kubectl logs -n spark-demo spark-pi-driver
预期输出:
...... 24/09/10 07:21:30 INFO DAGScheduler: Job 0 finished: reduce at SparkPi.scala:38, took 1.346414 s Pi is roughly 3.1402757013785068 ......
从结果中可以看到,执行Spark计算任务的耗时为
1.346414 s
,计算出Pi的值为3.1402757013785068
。重要本步骤中输出的耗时和Pi值数据仅为参考值,实际数据以您的操作环境为准。
执行以下命令,通过
alibabacloud.com/compute-qos
标签来查看Pod算力质量。kubectl get pod -n spark-demo -Lalibabacloud.com/compute-qos -o wide
预期输出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES COMPUTE-QOS spark-pi-xxxxx591db3xxxxx-exec-1 0/1 Completed 0 6m35s 192.168.x.xxx virtual-kubelet-cn-xxxxxxx-x <none> <none> best-effort spark-pi-driver 0/1 Completed 0 8m11s 192.168.x.xxx virtual-kubelet-cn-xxxxxxx-x <none> <none> default
从结果中最右侧一栏
COMPUTE-QOS
可以看到,执行Spark计算任务的Pod的算力质量为best-effort
。