大数据集群资源调度与扩缩容操作指南
大数据集群资源利用率低、扩容缩容操作复杂、YARN/K8s 调度参数配置不当导致资源浪费或任务排队过长
大数据集群资源利用率低、扩容缩容操作复杂、调度参数配置不当导致资源浪费或任务排队过长,这些问题的根源在于调度架构选型和扩缩容策略没有跟上工作负载的变化节奏。从 YARN 传统调度到 K8s 容器化弹性调度,企业需要理解两条路径的适用边界,并掌握可落地的操作步骤。
从 YARN 到 Kubernetes:调度架构的演进脉络
YARN(Yet Another Resource Negotiator)是 Hadoop 生态的事实标准资源管理器,其核心设计是为 MapReduce 和批处理作业提供资源隔离与多租户调度。YARN 的 ResourceManager 负责全局资源分配,NodeManager 管理单节点上的容器生命周期。这种架构在稳态负载下表现稳定,但缺乏节点级别的弹性伸缩能力——当作业结束后,节点资源不会自动释放,集群需要人工或外部编排工具来增减节点。
Kubernetes 作为容器编排平台,天然支持工作负载与基础设施的解耦。Cluster Autoscaler 可以在 Pod 无法调度时自动添加节点,在节点空闲时回收节点。对于夜间运行两小时的 ETL 作业,K8s 可以在作业完成后完全释放节点池资源,而 YARN 集群在非作业时段仍然占用节点资源。
Google 在 2025 年底已经将部分 Spark 作业从 YARN 迁移到 Kubernetes 调度,这一趋势进一步确认了容器化调度在弹性场景中的优势。但需要指出的是,YARN 在稳态高利用率场景下仍然有成熟度优势——当集群长期运行在接近满载状态时,YARN 的队列模型和资源预留机制比 K8s 的尽力调度模型更加可预测。
YARN Capacity Scheduler 调度参数最佳实践
YARN 的 Capacity Scheduler 是多租户集群最常用的调度器。核心配置文件是 capacity-scheduler.xml,关键参数包括:
队列容量分配。 通过 yarn.scheduler.capacity.root.queues 定义子队列列表,用 yarn.scheduler.capacity.<queue-path>.capacity 设置每个队列的资源占比。例如将集群分为三个队列,分别分配 50%、30%、20% 的资源。所有子队列的 capacity 之和必须等于 100%。
最大容量限制。 yarn.scheduler.capacity.<queue-path>.maximum-capacity 参数限制队列在弹性扩展时能使用的最大资源比例。这是防止某个队列在低负载时段抢占其他队列资源的关键防线。建议为批处理队列设置 80% 的上限,为交互式查询队列设置 50% 的上限。
用户限制因子。 user-limit-factor 控制单个用户在队列中能使用的最大资源倍数。默认值为 1.0,意味着单个用户最多使用队列全部资源。对于共享队列,建议设置为 0.5 到 1.0 之间,防止单一用户耗尽队列资源。
排序策略。 将队列的 ordering-policy 从默认的 FIFO 改为 Fair,可以让小作业不必等待大作业完成即可获得资源。这对于混合了批处理和交互查询的集群尤为重要。
抢占机制。 Capacity Scheduler 支持容器抢占(preemption),需要在 yarn-site.xml 中启用 yarn.resourcemanager.monitor.capacity.preemption.enabled。抢占可以确保高优先级队列在资源不足时从低优先级队列回收容器,但会带来作业中断的代价,建议仅在关键业务队列上启用。
调整队列配置后,运行 yarn rmadmin -refreshQueues 即可热加载,无需重启 ResourceManager。
数栈·多模态数据智能平台
袋鼠云面向 AI 时代打造的多模态数据智能平台,一站式覆盖数据存算、开发、治理、资产、服务与指标、分析、AI 应用,构建可见、可用、可管、可理解的私域数据底座。
Kubernetes 弹性扩缩容操作指南
Kubernetes 提供三个层次的自动扩缩容机制:
Pod 级别:HPA(HorizontalPodAutoscaler)。 HPA 根据 CPU、内存或自定义指标自动调整 Pod 副本数。对于 Spark on K8s 场景,HPA 通常不直接用于 Spark Executor Pod,而是用于协调器(Driver)和监控服务。HPA 的核心配置参数是 targetCPUUtilizationPercentage,默认阈值为 80%,建议根据工作负载特征调整到 60%-70% 以留出扩容缓冲。
节点级别:Cluster Autoscaler。 当 HPA 或 Spark Dynamic Resource Allocation 需要更多资源但现有节点无法满足时,Cluster Autoscaler 自动向云服务商请求新节点。配置要点包括:设置合理的 --scale-down utilization threshold(默认 0.5),当节点利用率低于该阈值时回收节点;设置 --max-node-provision-time,避免因节点启动慢导致调度失败。
Pod 垂直调整:VPA(VerticalPodAutoscaler)。 VPA 根据历史使用数据自动调整 Pod 的 CPU 和内存请求值。对于批处理作业,VPA 可以在下次调度时分配更合适的资源量。需要注意的是,VPA 与 HPA 不建议同时作用于同一工作负载,因为两者的调整方向可能冲突。
一个典型的混合配置方案是:用 Spark Dynamic Resource Allocation 处理作业内部的 Executor 弹性伸缩,用 Cluster Autoscaler 处理节点级别的弹性伸缩,用 HPA 管理监控和 Web 服务组件的副本数。
经营分析
围绕目标、预算、执行、异常与归因,构建经营分析、过程监控、问题定位与决策闭环。
手动扩缩容操作步骤
在自动扩缩容机制生效前或无法使用时,手动扩缩容仍然是基本操作:
YARN 集群扩容。 新增 NodeManager 节点后,配置 yarn-site.xml 中的 yarn.nodemanager.resource.memory-mb 和 yarn.nodemanager.resource.cpu-vcores,确保与集群其他节点一致。启动 NodeManager 后,ResourceManager 会自动检测并纳入资源池。
YARN 集群缩容。 先通过 YARN Web UI 或 yarn application -list 确认该节点上没有正在运行的容器。然后停止 NodeManager 服务,更新 yarn-site.xml 中的节点列表(如使用 yarn.nodemanager.include.hosts 白名单),执行 yarn rmadmin -refreshNodes 生效。
Kubernetes 节点扩容。 使用 kubectl scale 命令调整 NodePool 的节点数,或直接修改云服务商的节点组配置。对于 AWS EKS,修改 Managed Node Group 的 desiredSize;对于阿里云 ACK,调整节点池的节点数。
Kubernetes 节点缩容。 先执行 kubectl cordon <node> 标记节点不可调度,再执行 kubectl drain <node> --ignore-daemonsets --delete-emptydir-data 驱逐节点上的 Pod,最后从节点组中移除节点。
常见失败模式与应对
资源碎片化。 YARN 集群中各队列资源分配不均,导致某些队列空闲而其他队列排队。解决方案是启用 Capacity Scheduler 的弹性队列(dynamic queue)功能,或使用 node label 将特定节点绑定到特定队列。
K8s 缩容时 Pod 被驱逐。 Cluster Autoscaler 在回收节点时会触发 Pod 驱逐。对于 Spark 作业,确保设置了 spark.kubernetes.executor.deletionPolicy 为 delete 而非 interrupt,并配置 PodDisruptionBudget 保护关键服务。
YARN 内存超用。 当 yarn.nodemanager.resource.memory-mb 配置值超过物理内存,或容器的内存请求超过节点剩余可用内存时,任务会因 OOM 失败。建议在 yarn-site.xml 中启用 yarn.nodemanager.pmem-check-enabled 和 yarn.nodemanager.vmem-check-enabled 进行物理和虚拟内存检查。
调度延迟过高。 当集群作业数量超过 yarn.scheduler.capacity.maximum-applications(默认 10000)时,新作业会被拒绝。对于大规模集群,建议将该值提升到 50000 并配合队列级限制使用。
资源调度架构的选择取决于工作负载特征:稳态高利用率场景优先考虑 YARN 的成熟队列模型,弹性波动场景优先考虑 K8s 的自动扩缩容能力。无论选择哪条路径,调度参数的精细调优和扩缩容策略的规范化执行都是降低成本、提高资源利用率的关键。


