Skip to content

第 4 部分:性能与成本调优测验 ​

基线:Spark 4.2.0 / Karpenter 1.14 · 2026 年 9 月。

1. R 系列实例和 NVMe 是否总是最适合 Shuffle? ​

显示答案

不一定。应测量任务/阶段用时、溢写、Shuffle 获取等待时间、数据倾斜以及 CPU/内存/磁盘/网络瓶颈。比较可用容量和每个成功作业的成本;其他实例系列和 EBS 并非天然不适用。

2. 评估 Graviton 时应检查什么? ​

显示答案

验证 Spark 镜像、JNI、编解码器、BLAS、Python wheel 和插件是否支持 arm64,然后对有代表性的工作负载进行基准测试。使用已有且经过测试的多架构镜像,可以避免自行构建镜像。

3. 对未挂载的 nvme 设备进行格式化是否安全? ​

显示答案

不安全。在 Nitro 上,EBS 也会显示为 NVMe;未挂载磁盘上可能仍有数据或分区。设备名称和挂载状态都不能证明它是可丢弃的实例存储。

4. instanceStorePolicy: RAID0 在 AL2023 上会配置什么? ​

显示答案

Karpenter 使用 NodeConfig 为 kubelet/containerd 临时存储配置实例存储 RAID0,并公布可分配容量。RAID0 不是备份;完整的 NodeClass 仍需配置 AMI、IAM、子网等内容。

5. 为什么本实验可以不使用 hostPath 而使用 NVMe 临时存储? ​

显示答案

预先配置的 NodeClass 将 kubelet 文件系统放在实例存储上,因此基于磁盘的 emptyDir 会使用该存储。其他节点配置或 tmpfs 会改变其后端存储。

6. Spark 识别哪种临时卷名称? ​

显示答案

例如 spark-local-dir-scratch:名称以 spark-local-dir- 为前缀,并带有后缀。旧名称 spark-local-dir 不匹配,可能会在相同挂载路径上额外创建一个 emptyDir。

7. emptyDir 的 sizeLimit 会预留磁盘空间吗? ​

显示答案

不会。还要考虑 requests、节点可分配容量、其他 Pod、日志和可写层。节点可能先被写满;基于内存的 tmpfs 会占用内存预算。

8. 按需型 driver/Spot executor 的组合不能保证什么? ​

显示答案

它无法消除 driver 故障、漂移或到期的风险,也不能保证 executor 丢失不会造成影响。仅限 Spot 的选择器不会回退到按需型实例,供应短缺时 Pod 可能一直处于 Pending 状态。

9. 污点/容忍度与节点选择器有什么区别? ​

显示答案

容忍度允许工作负载使用带有相应污点的节点;选择器则指定要匹配的节点。其他 Pod 也可能具有相同的容忍度,而 NoSchedule 不会驱逐现有 Pod。

10. Spot 警告和 executor 退役标志能保证迁移完成吗? ​

显示答案

不能。警告是尽力而为的通知;休眠不提供两分钟的窗口。EventBridge/SQS/中断处理、驱逐、钩子/信号、可用时间、其他 executor/节点的可用容量和网络都很重要。Pod 的 120 秒宽限期不会延长云实例的生命周期。

11. 任意远程存储都会自动成为 Shuffle 回退路径吗? ​

显示答案

不会。需要配置 spark.storage.decommission.fallbackStorage.path,并准备好对应的文件系统和权限。RDD 缓存恢复与 Shuffle 恢复并不相同;重新计算、获取失败和重试上限仍可能导致作业失败。

12. DRA 和 Karpenter 分别根据哪些信号工作? ​

显示答案

DRA 根据 Spark 任务积压以及空闲/缓存/Shuffle 状态调整 executor 数量。Karpenter 根据 Pod 请求和调度约束供应节点容量。不需要 metrics-server;allocation.batch.size 控制 Kubernetes 分配器创建对象的速率。

13. consolidateAfter 大于 executorIdleTimeout 能保证 DRA 先释放资源吗? ​

显示答案

不能。这些计时器从不同事件开始;Shuffle/缓存也可能让 executor 保持运行。WhenEmpty 可以减少普通工作负载 Pod 的整合,但漂移、到期和 Spot 终止仍是独立因素。

14. 4g JVM heap 和 cores=2 是否就是 Pod 的全部内存和 CPU 限额? ​

显示答案

不是。本示例还会增加默认的 409MiB 开销,合计内存为 4505MiB。cores 会影响默认 CPU 请求和 Spark 并发度;使用 spark.kubernetes.executor.limit.cores 显式设置 CPU 限额。还应分别检查 PySpark、堆外内存和显式开销。

指南

向文档提问

按 Enter 发送,按 Shift+Enter 换行。