
用弹性 VM 提升 Apache Spark 集群可用性

AI 开发热潮推高了全球算力需求,Apache Spark 这类数据管道对容量短缺尤其敏感。Google 推出了一向针对性机制,能让自家托管 Spark 服务在区域或可用区出现容量吃紧时保持管道可用,这套机制叫 flexible VMs。
传统的 Managed Spark 集群把计算资源绑定到单一、固定的实例类型上。当目标区域内某个机器系列(如 N2、N2D)的容量被抢光,创建集群就会失败或无限拖延。Flexible VMs 的做法是让集群不再绑定单一实例,而是允许给主节点、主 worker 和从 worker 节点各维护一张可用的机器类型排序表。集群调度时自上而下尝试,避免某一种机型缺货导致整条管道不可用。
其关键特性包括:跨代混合使用(如 N2、N2D 这类 Gen2 实例与 N4、C4 这类 Gen4 实例混合)、混合存储支持(存储选项跟随底层宿主机系列支持的磁盘类型动态调整)、全集群覆盖(主节点、主 worker、抢占式 worker 都能套用弹性规则),以及排序配置。官方建议在最高优先级 Rank 0 里至少放两个机器系列。对于生产管道已标准化到 n2d-standard-16 形状的用户,文章给出了四级回退策略:优先用 n2d-standard-16 和 n2-standard-16,随后依次回退到 n4/n4d 系列、c4/c3 系列,最后是 e2-standard-16。跑在 n1-standard-16 上的旧作业也有类似迁移路径,逐步过渡到更新、更易获取的架构。
要真正把这些弹性 VM 用好,还要算几笔账。首先是资源配额,不能只留某一种机型的配额,需要确保所有可回退机器类型和对应磁盘(包括 Hyperdisk)都有充足配额。其次,传统基于资源类型的 CUD 会把折扣锁定在特定机器族上,不如换用支持跨机器族、跨区域抵扣的 Compute flexible CUD。再者是性能差异:跨代机器、Local SSD 与 Hyperdisk 延迟表现不同,官方建议拿自己的典型 Spark 作业做基准测试,再决定是否切换。
此外还有几个配合策略:启用 AutoZone 自动选可用区;尽量用 4、8、16 核等小规格机器,大规格往往是最容易被抢断的;配合合理的最大实例数做自动伸缩,管理突发负载;设置可接受的最小主 worker 数量,让集群在资源紧张时先建立起来运行,边跑边伸缩补节点;数据中心并非全能,us-central1 这类热门区域有时也会缺货,预先设置跨区域回退能显著降低库存耗尽风险。
对使用 Apache Spark 的团队来说,这套机制的核心价值是让 Spark 集群把『某个确切机器型号』的假设升级为『一长串可接受的机器清单』,把单一故障点化解成有优先级的回退链。对于无法容忍 SLA 被挤占出问题的生产管道,这值得尽快测试。

