皮仪芳 发表于 7 天前

一文消除大数据处理的资源浪费,实现 90% 成本降低

本文介绍如何通过 Karpenter 动态调度阿里云 Spot 实例运行 Spark 作业,实现 90%+ 成本节省。
涵盖集群搭建、Spark Operator/Karpenter 部署、Executor 弹性扩缩配置及效果验证,提供完整代码示例。
阅读时间约 10 分钟(技术细节较多,含代码及配置步骤)。
Apache Spark 是⼀个专门为大规模数据处理设计的计算引擎,广泛应用于数据分析和机器学习等场景。随着 Spark 处理数据量的指数级增长,传统的固定资源池模式面临 30-50% 的资源浪费,主要源于 Executor 空置、机型不匹配等问题。
为了解决这⼀问题,业内开始引⼊ Karpenter ⸺⼀个 Kubernetes 原生的弹性扩缩容控制器,通过以下核心能力有效实现成本优化:

[*]智能调度算法:实时分析 Pod 资源需求,⾃动选择最优机型组合(如 Spot 实例、高性价比机型)
[*]秒级弹性伸缩:作业启动时 40~45 秒内完成节点供给,作业结束后自动回收资源
[*]碎片化资源整合:将分散的⼩资源请求聚合到⼤节点,提升整体利⽤率至 85%+
为什么选择 Karpenter?


Karpenter 是 Kubernetes 生态中开源的弹性扩缩容控制器,专为提升资源利用率和降低调度延迟设计。
它通过实时监测集群中 Pending 状态的 Pod 资源需求,智能决策最优节点规格并自动创建/回收实例,40-45 秒内即可完成资源供给(相比 Cluster Autoscaler 分钟级响应)。
特别适合 Spark 等批处理场景,支持动态扩展 Executor 节点池,结合 Spot 实例智能选择最优机型,实现 90%+ 资源成本节省和碎⽚化资源整合。
Spark + Karpenter 的降本实践

1. 创建⼀个集群(以阿里云举例, 已有可跳过)

Karpenter 云⼚商适配现状:https://github.com/kubernetes-sigs/karpenter?tab=readme-ov-file#karpenter-implementations

1.1 Terraform Create Cluster

创建云上 K8s 集群
aliyun configure
export ALICLOUD_ACCESS_KEY=
export ALICLOUD_SECRET_KEY=
export ALICLOUD_REGION="cn-shenzhen"
git clone https://github.com/cloudpilot-ai/examples.git
cd examples/clusters/ack-spot-flannel
export TF_VAR_CLUSTER_NAME=<your_cluster_name>
terraform init
terraform apply --auto-approve获取集群 kubeconfig
export CLUSTER_NAME=<your_cluster_name>
export KUBECONFIG=~/.kube/demo
export CLUSTER_ID=$(aliyun cs GET /clusters | jq -r --arg CLUSTER_NAME
"$CLUSTER_NAME" '.[] | select(.name == $CLUSTER_NAME) | .cluster_id')
aliyun cs GET /k8s/$CLUSTER_ID/user_config | jq -r '.config' > $KUBECONFIG1.2 检查集群状态

kubectl get node
NAME                       STATUS   ROLES    AGE   VERSION
cn-shenzhen.172.16.1.159   Ready    <none>   32m   v1.31.1-aliyun.1
cn-shenzhen.172.16.2.181   Ready    <none>   32m   v1.31.1-aliyun.12. 部署 Spark Operator

Spark Operator 提供了在 Kubernetes 集群中自动化部署和管理 Spark 作业生命周期的功能。
2.1 安装 Spark Operator

# Add the Helm repository
helm repo add spark-operator https://kubeflow.github.io/spark-operator
helm repo update
# Install the operator into the spark-operator namespace and wait for
deployments to be ready
helm install spark-operator spark-operator/spark-operator \
--namespace spark-operator --create-namespace --wait请注意:Spark History Server 也需要安装,尽管未在此处单独列出。
2.2 测试 Spark

# Create an example application in the default namespace
kubectl apply -f https://raw.githubusercontent.com/kubeflow/sparkoperator/refs/heads/master/examples/spark-pi.yaml
# Get the status of the application
kubectl get sparkapp spark-pi3. 部署 Karpenter (Karpenter-Provider-Alibabacloud)

https://docs.cloudpilot.ai/karpenter-alibabacloud/v0_1/getting_started/set-up-a-cluster-andadd-karpenter#step-3-config-the-environment-variables

[*]配置环境变量
export CLUSTER_NAME=<your_cluster_name> # Config your cluster
name
export CLUSTER_REGION=<your_cluster_region> # Config the
alibabacloud region
export ALIBABACLOUD_AK= # Config the
alibabacloud AK
export ALIBABACLOUD_SK= # Config the
alibabacloud SK
export CLUSTER_ID=$(aliyun cs GET /clusters | jq -r --arg CLUSTER_NAME
"$CLUSTER_NAME" '.[] | select(.name == $CLUSTER_NAME) | .cluster_id')
export VSWITCH_IDS=$(aliyun cs GET /api/v1/clusters --header "ContentType=application/json;" | jq -r --arg CLUSTER_NAME "$CLUSTER_NAME"
'.clusters[] | select(.name == $CLUSTER_NAME) | .vswitch_ids[]')
export SECURITYGROUP_ID=$(aliyun cs GET /api/v1/clusters --header "ContentType=application/json;" | jq -r --arg CLUSTER_NAME "$CLUSTER_NAME"
'.clusters[] | select(.name == $CLUSTER_NAME) | .security_group_id')
[*]Tag 安全组和 vSwitch
# Tag the security groupaliyun tag TagResources --region ${CLUSTER_REGION} --RegionId${CLUSTER_REGION} --ResourceARN.1"acs:ecs:*:*:securitygroup/${SECURITYGROUP_ID}" --Tags "{"karpenter.sh/discovery": "$CLUSTER_NAME"}"# Tag the vswitchIFS=' 'while IFS= read -r vs_id; doaliyun tag TagResources --region ${CLUSTER_REGION} --RegionId${CLUSTER_REGION} --ResourceARN.1 "acs:vpc:*:*:vswitch/${vs_id}" --Tags "{"karpenter.sh/discovery": "$CLUSTER_NAME"}"done 
页: [1]
查看完整版本: 一文消除大数据处理的资源浪费,实现 90% 成本降低