找回密码
 立即注册
首页 业界区 安全 一文消除大数据处理的资源浪费,实现 90% 成本降低 ...

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

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

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

1.png

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
2.png

1.1 Terraform Create Cluster

创建云上 K8s 集群
  1. aliyun configure
  2. export ALICLOUD_ACCESS_KEY=
  3. export ALICLOUD_SECRET_KEY=
  4. export ALICLOUD_REGION="cn-shenzhen"
  5. git clone https://github.com/cloudpilot-ai/examples.git
  6. cd examples/clusters/ack-spot-flannel
  7. export TF_VAR_CLUSTER_NAME=<your_cluster_name>
  8. terraform init
  9. terraform apply --auto-approve
复制代码
获取集群 kubeconfig
  1. export CLUSTER_NAME=<your_cluster_name>
  2. export KUBECONFIG=~/.kube/demo
  3. export CLUSTER_ID=$(aliyun cs GET /clusters | jq -r --arg CLUSTER_NAME
  4. "$CLUSTER_NAME" '.[] | select(.name == $CLUSTER_NAME) | .cluster_id')
  5. aliyun cs GET /k8s/$CLUSTER_ID/user_config | jq -r '.config' > $KUBECONFIG
复制代码
1.2 检查集群状态
  1. kubectl get node
  2. NAME                       STATUS   ROLES    AGE   VERSION
  3. cn-shenzhen.172.16.1.159   Ready    <none>   32m   v1.31.1-aliyun.1
  4. cn-shenzhen.172.16.2.181   Ready    <none>   32m   v1.31.1-aliyun.1
复制代码
2. 部署 Spark Operator

Spark Operator 提供了在 Kubernetes 集群中自动化部署和管理 Spark 作业生命周期的功能。
2.1 安装 Spark Operator
  1. # Add the Helm repository
  2. helm repo add spark-operator https://kubeflow.github.io/spark-operator
  3. helm repo update
  4. # Install the operator into the spark-operator namespace and wait for
  5. deployments to be ready
  6. helm install spark-operator spark-operator/spark-operator \
  7. --namespace spark-operator --create-namespace --wait
复制代码
请注意:Spark History Server 也需要安装,尽管未在此处单独列出。
2.2 测试 Spark
  1. # Create an example application in the default namespace
  2. kubectl apply -f https://raw.githubusercontent.com/kubeflow/sparkoperator/refs/heads/master/examples/spark-pi.yaml
  3. # Get the status of the application
  4. kubectl get sparkapp spark-pi
复制代码
3. 部署 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

  • 配置环境变量
  1. export CLUSTER_NAME=<your_cluster_name> # Config your cluster
  2. name
  3. export CLUSTER_REGION=<your_cluster_region> # Config the
  4. alibabacloud region
  5. export ALIBABACLOUD_AK= # Config the
  6. alibabacloud AK
  7. export ALIBABACLOUD_SK= # Config the
  8. alibabacloud SK
  9. export CLUSTER_ID=$(aliyun cs GET /clusters | jq -r --arg CLUSTER_NAME
  10. "$CLUSTER_NAME" '.[] | select(.name == $CLUSTER_NAME) | .cluster_id')
  11. export VSWITCH_IDS=$(aliyun cs GET /api/v1/clusters --header "ContentType=application/json;" | jq -r --arg CLUSTER_NAME "$CLUSTER_NAME"
  12. '.clusters[] | select(.name == $CLUSTER_NAME) | .vswitch_ids[]')
  13. export SECURITYGROUP_ID=$(aliyun cs GET /api/v1/clusters --header "ContentType=application/json;" | jq -r --arg CLUSTER_NAME "$CLUSTER_NAME"
  14. '.clusters[] | select(.name == $CLUSTER_NAME) | .security_group_id')
复制代码

  • Tag 安全组和 vSwitch
[code]# 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 
您需要登录后才可以回帖 登录 | 立即注册